Linux 시스템 보안 기초 · 22/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
SUID root는 '전부 아니면 전무'입니다 — 그 프로그램이 실행 중 완전한 root가 됩니다. 이 위험을 줄이려고 리눅스는 root의 권한을 작은 조각(capability) 으로 나눴습니다. ping이 SUID 없이도 raw 소켓을 쓸 수 있는 이유가 바로 capability입니다.
root 권한을 기능 단위로 분리한 것이 capability입니다. 주요 예:
| capability | 허용 기능 |
|---|---|
| CAP_NET_RAW | raw 소켓(ping 등) |
| CAP_NET_ADMIN | 네트워크 설정 변경 |
| CAP_SYS_ADMIN | 광범위 관리(사실상 준-root) |
| CAP_DAC_OVERRIDE | 파일 권한 검사 우회 |
| CAP_SETUID | UID 변경 |
+ep(effective+permitted)로 파일에 부여하면, 그 실행 파일은 해당 기능만 root처럼 쓰고 나머지는 못 씁니다.
SUID root Capability
실행 중 = 완전한 root 실행 중 = 딱 그 기능만 root
전권한(위험 큼) 최소 권한(위험 국소화)
find -exec sh → root쉘 cap_net_raw만 → 쉘 못 뜸
실행 파일에 capability를 setcap으로 부여하면 확장 속성(security.capability)에 저장됩니다. exec 시 커널이 이를 읽어 프로세스에 해당 기능만 부여합니다. 최소 권한 원칙(20편의 선행 개념)에 정확히 부합하는 메커니즘입니다.
다만 capability도 '어떤 것'을 주느냐가 중요합니다. CAP_DAC_OVERRIDE, CAP_SYS_ADMIN, CAP_SETUID 같은 강력한 것은 사실상 root와 다름없어, 잘못 부여하면 권한 상승으로 이어집니다(23편).
# 파일 capability 부여/확인
sudo setcap cap_net_raw+ep ./myping
getcap ./myping
# 시스템 전체에서 capability를 가진 파일 스캔
sudo getcap -r / 2>/dev/null
실습 환경에서 실제 capability를 부여·확인한 결과입니다. (실제 캡처)
$ sudo setcap cap_net_raw,cap_net_admin+ep ./netcat_demo
$ getcap ./netcat_demo
./netcat_demo cap_net_admin,cap_net_raw=ep
cap_net_admin,cap_net_raw=ep가 부여되었습니다. 시스템 전체 스캔(getcap -r /)으로 이런 파일 목록을 기준선으로 확보해 두면, 새로 부여된 capability를 탐지할 수 있습니다.
ping의 cap_net_raw 등 배포판 표준 capability.cap_dac_override, cap_sys_admin, cap_setuid)capability는 SUID의 안전한 대안이지만, 강력한 것을 남용하면 SUID만큼 위험합니다. '최소한의, 꼭 필요한 capability만'이 원칙입니다.
getcap -r / 기준선 대비 diffsetcap 실행 및 setxattr(security.capability) 감사capability는 SUID보다 눈에 덜 띄어 놓치기 쉽습니다. auditd로 setcap 실행과 관련 setxattr를 감사하고, Wazuh FIM으로 확장 속성 변경을 감시하면 은밀한 권한 부여를 탐지할 수 있습니다. 신규 capability 파일은 SUID와 함께 '특수 권한 실행 파일' IOC 인벤토리로 관리합니다.
[ ] getcap -r /로 capability 파일 스캔
[ ] 강력 capability 보유 파일 식별
[ ] 기준선과 diff
[ ] setcap/setxattr 감사 설정
다음 편에서는 23. Capability 기반 권한 상승 위험 를 다룹니다. 이 capability가 실제로 어떻게 권한 상승에 악용되는지, 점검 관점에서 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.