setcap 명령어에 대한 자세한 설명

setcap 명령어에 대한 자세한 설명입니다. Linux에서 setcap 명령어의 가장 일반적인 용도는 1024번 이상의 포트(특권 포트라고도 함) 사용을 제한하는 것입니다. 포트 제한은 방화벽을 통과하지 않고도 수행할 수 있습니다. setcap 명령어의 주요 목적은 루트 사용자의 권한을 분할하는 것입니다. 즉, 루트 권한을 여러 가지 기능으로 나누는 것이며, 각 기능은 특정 권한 작업을 나타냅니다.

setcap 명령어란 무엇인가요?

, 리눅스에서가장 일반적인 방법은 방화벽을 통과하지 않고도 제한할 수 있는 1024 이상의 포트(특권 포트라고도 함) 사용을 제한하는 것입니다. 이 방법의 주요 목적은 루트 사용자의 권한을 분할하는 것입니다. 즉, 루트 권한을 여러 가지 기능으로 나누는 것이며, 각 기능은 특정 권한 작업을 나타냅니다.

Capabilities의 핵심 아이디어는 루트 사용자의 권한을 분할하는 것입니다. 즉, 루트 권한을 여러 기능(capability)으로 분할하는 것입니다. 각 기능은 특정 권한 작업을 나타냅니다. 예를 들어, CAP_SYS_MODULE 기능은 사용자가 커널 모듈을 로드(또는 언로드)할 수 있는 권한 작업을 나타내고, CAP_SETUID는 사용자가 프로세스의 사용자 ID를 수정할 수 있는 권한 작업을 나타냅니다. Capbilities에서 시스템은 프로세스의 기능에 따라 권한 작업에 대한 액세스 제어를 수행합니다.
Capilities에서는 프로세스와 실행 파일만 기능을 가집니다. 각 프로세스는 cap_effective, cap_inheritable, cap_permitted(각각 pE, pI, pP로 약칭)라는 세 가지 기능 집합을 가집니다. 이 중 cap_permitted는 프로세스가 소유한 최대 기능 집합을 나타냅니다. cap_effective는 프로세스가 현재 사용할 수 있는 기능 집합으로, cap_permitted의 하위 집합으로 볼 수 있습니다. cap_inheitable은 프로세스가 자식 프로세스에 전달할 수 있는 기능 집합을 나타냅니다. 시스템은 프로세스의 cap_effective 기능 집합을 기반으로 접근 제어를 수행합니다. cap_effective는 cap_permitted의 하위 집합입니다. 프로세스는 cap_effective의 일부 기능을 취소하여 프로세스의 권한 중 일부를 포기할 수 있습니다. 실행 파일에도 프로세스의 세 가지 기능 집합에 해당하는 cap_effective, cap_allowed, cap_forced(각각 fE, fI, fP로 약칭)라는 세 가지 기능 집합이 있습니다. 이 중 cap_allowed는 프로그램이 실행될 때 원래 프로세스의 cap_inheritable에서 통합할 수 있는 기능 세트를 나타내고, cap_forced는 파일이 서비스를 완료하기 위해 실행될 때 소유해야 하는 기능 세트를 나타내고, cap_effective는 파일이 실행을 시작할 때 사용할 수 있는 기능을 나타냅니다.
1. Linux 커널의 Capabilities 구현 메커니즘
Capabilities의 개념과 메커니즘은 Linux 커널 2.2 버전부터 추가되었으며, 각 버전 업그레이드를 통해 점진적으로 개선되었습니다. Linux에서 루트 권한은 다음 29가지 Capabilities로 구분됩니다.
CAP_CHOWN: 파일 소유자의 권한 변경
CAP_DAC_OVERRIDE: 파일의 DAC 액세스 제한을 무시합니다.
CAP_DAC_READ_SEARCH: 파일 읽기 및 디렉토리 검색에 대한 DAC 액세스 제한을 무시합니다.
CAP_FOWNER: 파일 소유자 ID가 프로세스 사용자 ID와 일치해야 한다는 제한을 무시합니다.
CAP_FSETID: 파일의 setuid 비트를 설정할 수 있습니다.
CAP_KILL: 사용자에게 속하지 않은 프로세스에 신호를 보낼 수 있습니다.
CAP_SETGID: 프로세스의 그룹 ID를 변경할 수 있습니다.
CAP_SETUID: 프로세스의 사용자 ID를 변경할 수 있습니다.
CAP_SETPCAP: 다른 프로세스에 대한 기능 전송 및 다른 프로세스에서 기능 제거를 허용합니다.
CAP_LINUX_IMMUTABLE: 파일의 IMMUTABLE 및 APPEND 속성 플래그를 수정할 수 있습니다.
CAP_NET_BIND_SERVICE: 1024 미만의 포트에 바인딩을 허용합니다.
CAP_NET_BROADCAST: 네트워크 브로드캐스트 및 멀티캐스트 액세스를 허용합니다.
CAP_NET_ADMIN: 네트워크 관리 작업을 수행할 수 있습니다.
CAP_NET_RAW: 원시 소켓 사용을 허용합니다.
CAP_IPC_LOCK: 공유 메모리 세그먼트 잠금을 허용합니다.
CAP_IPC_OWNER: IPC 소유권 확인 무시
CAP_SYS_MODULE: 커널 모듈 삽입 및 제거를 허용합니다.
CAP_SYS_RAWIO: /devport, /dev/mem, /dev/kmem 및 원시 블록 장치에 직접 액세스할 수 있습니다.
CAP_SYS_CHROOT: chroot() 시스템 호출을 사용할 수 있습니다.
CAP_SYS_PTRACE: 모든 프로세스 추적을 허용합니다.
CAP_SYS_PACCT: 프로세스에 대한 BSD 스타일 감사를 허용합니다.
CAP_SYS_ADMIN: 파일 시스템 로드 또는 언로드, 디스크 할당량 설정 등의 시스템 관리 작업을 수행할 수 있습니다.
CAP_SYS_BOOT: 시스템 재부팅을 허용합니다.
CAP_SYS_NICE: 프로세스의 우선순위를 높이고 다른 프로세스의 우선순위를 설정할 수 있습니다.
CAP_SYS_RESOURCE: 리소스 제한 무시
CAP_SYS_TIME: 시스템 시계를 변경할 수 있습니다.
CAP_SYS_TTY_CONFIG: TTY 장치 구성을 허용합니다.
CAP_MKNOD: mknod() 시스템 호출을 사용할 수 있습니다.
CAP_LEASE: 파일 잠금의 FL_LEASE 플래그를 수정할 수 있습니다.

 

예:

Wireshark를 설치할 때 단계 중 하나는 dumpcap에 네트워크 카드를 읽을 수 있는 권한을 부여하는 것입니다. 이렇게 하면 일반 사용자도 Wireshark를 사용하여 패킷을 캡처할 수 있습니다.
# setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/sbin/dumpcap

SetUID chmod u+s /path/to/application을 사용하세요.

루트 사용자로 setcap 명령을 사용하여 실행 파일 /bin/ping에 "cap_net_admin,cap_net_raw+ep" 권한을 추가하면 일반 사용자가 ping을 사용할 수 있습니다.
#setcap 'cap_net_admin,cap_net_raw+ep' /bin/ping

확인하다:
[root@rhel671 ~]# getcap /bin/ping
/bin/ping = cap_net_admin,cap_net_raw+ep

참고: setcap은 일반적으로 바이너리 실행 파일에 사용됩니다. setcap은 스크립트 파일(예: #!/bin/python으로 시작하는 스크립트 파일)에 사용하면 유효하지 않습니다.

1024 내의 포트:
setcap cap_net_bind_service=+eip /home/tengine/nginx/tengine/sbin/nginx

-r은 추가 권한을 지웁니다.
setcap -r nginx

TOMCAT을 설정하여 ROOT가 아닌 사용자가 1024 이하의 포트를 시작할 수 있도록 합니다.

setcap cap_net_bind_service=+eip /opt/tomcat/bin/startup.sh

점수

댓글남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다