우분투 capsh 명령어 실습 가이드: 리눅스 Capabilities 확인부터 권한 격리까지

개요

리눅스 프로세스의 세부 권한을 제어하는 Capabilities를 탐색하고 테스트할 때 capsh(Capability Shell Wrapper)는 매우 유용한 도구입니다. 본 글에서는 Ubuntu 환경에서 capsh의 설치부터 현재 권한 조회, 비트마스크 디코딩, 권한 격리(Drop) 및 사용자 전환 옵션까지 실무에서 즉시 활용할 수 있는 핵심 실행 결과를 단계별로 살펴봅니다.

libcap2-bin 패키지 설치 및 현재 프로세스 권한 확인 (–print)

리눅스 Capabilities 확인 및 실습에 필요한 capsh 도구를 사용하기 위해 libcap2-bin 패키지를 설치합니다.

apt-get update -qq && apt-get install -y libcap2-bin

capsh --print 명령어는 현재 프로세스에 부여된 Capabilities 세트(Effective, Permitted, Bounding 등)와 UID, GID, Securebits 등 자격 증명 상태를 상세히 출력합니다.
출력된 결과를 통해 현재 셸 환경이 보유한 시스템 제어 권한의 범위를 한눈에 파악할 수 있습니다.
⚙️ [주요 옵션]

--print : 현재 프로세스의 기능(Capability) 세트와 사용자/그룹 ID, 보안 비트 상태를 출력합니다.
--drop : 바운딩 세트(Bounding set)에서 지정한 권한을 영구적으로 제거합니다.
--caps : 프로세스에 적용할 기능(Capability) 세트를 직접 지정합니다.
--user : 지정한 사용자의 계정 및 그룹 권한으로 전환하여 명령어를 실행합니다.
--inh : 상속 가능한(Inheritable) 기능 세트를 설정합니다.
--addamb : 앰비언트(Ambient) 세트에 특정 권한을 추가하여 실행 파일에 권한을 전달합니다.
--secbits : 프로세스의 보안 비트(Securebits) 플래그를 설정하여 권한 변경 정책을 제어합니다.
--chroot : 루트 디렉터리를 지정한 경로로 변경(chroot)하여 격리된 환경을 구성합니다.

capsh –print

커널 기능 지원 여부 검증 및 비트마스크 디코딩 (–supports, –decode)

capsh --supports=cap_net_raw 명령어는 현재 실행 중인 리눅스 커널이 cap_net_raw 기능을 지원하는지 확인합니다.
지정된 기능이 커널에서 유효하게 지원되는 경우 별도의 텍스트 출력 없이 정상 종료 코드(0)를 반환합니다.

capsh –supports=cap_net_raw

capsh --supports=cap_sys_admin 명령어를 실행하여 광범위한 시스템 관리 권한을 다루는 cap_sys_admin 기능의 커널 지원 여부를 검증합니다.
해당 기능이 지원될 경우 오류 없이 종료되므로 셸 스크립트 등에서 특정 권한의 가용성을 사전 점검할 때 유용하게 활용할 수 있습니다.

capsh –supports=cap_sys_admin

capsh --decode=0x000001ffffffffff 명령어는 /proc/[PID]/status 등에서 확인되는 16진수 비트마스크 값을 사람이 읽기 쉬운 개별 기능 명칭으로 변환합니다.
디코딩 결과를 통해 해당 16진수 마스크에 활성화된 cap_chown, cap_sys_admin, cap_bpf 등 전체 Capability 목록을 명확하게 확인할 수 있습니다.

capsh –decode=0x000001ffffffffff

바운딩 세트에서 불필요한 권한 제거 및 프로세스 격리 (–drop)

capsh --drop=cap_chown,cap_setuid --print 명령어는 프로세스의 바운딩 세트(Bounding set)에서 cap_chown과 cap_setuid 권한을 영구적으로 제거한 뒤 변경된 권한 상태를 출력합니다.
출력 결과의 Bounding set 목록과 Current IAB 항목에서 지정한 두 기능이 정상적으로 제외되어 최소 권한 원칙이 적용된 상태를 확인할 수 있습니다.

capsh –drop=cap_chown,cap_setuid –print

capsh --drop=cap_chown -- -c "capsh --print | grep 'Bounding set'" 명령어는 cap_chown 권한을 제거한 격리 환경에서 셸 명령어를 실행하여 Bounding set 상태를 확인합니다.
필터링된 출력 결과를 통해 실행된 자식 프로세스의 바운딩 세트에서도 cap_chown 기능이 완전히 배제된 상태로 안전하게 상속되었음을 검증할 수 있습니다.

capsh –drop=cap_chown – -c “capsh –print | grep ‘Bounding set’”

비특권 계정 전환 및 권한 세트 커스텀 지정 (–user, –caps)

capsh --user=nobody --print 명령어는 프로세스의 실행 자격 증명을 비특권 계정인 nobody로 전환한 후 사용자 ID, 그룹 ID 및 기능 세트 상태를 출력합니다.
출력 결과에서 UID와 GID가 nobody(65534)로 변경되었음을 확인할 수 있으며, 별도의 권한 지정 없이 일반 계정으로 전환했을 때 적용되는 기본 상태를 점검할 수 있습니다.

capsh –user=nobody –print

capsh --user=nobody --caps="cap_net_bind_service+ep cap_setpcap-ep" --print 명령어는 nobody 계정으로 전환하면서 특권 포트 바인딩에 필요한 cap_net_bind_service 기능만 유효(Effective) 및 허용(Permitted) 세트에 선별적으로 부여합니다.
출력 결과의 Current 항목에 cap_net_bind_service=ep가 정상 적용된 것을 통해, 비특권 사용자 환경에서도 서비스 실행에 필요한 최소한의 네트워크 바인딩 권한만 안전하게 격리하여 부여할 수 있음을 확인할 수 있습니다.

capsh –user=nobody –caps=“cap_net_bind_service+ep cap_setpcap-ep” –print

지금까지 우분투 환경에서 capsh 명령어를 활용해 리눅스 Capabilities를 확인하고 권한을 격리하는 방법을 간단하게 살펴보았습니다.
불필요한 root 권한 대신 필요한 최소 권한만 부여하여 더욱 안전하고 견고한 리눅스 시스템 환경을 구축해 보시기 바랍니다.