Linux Capabilities란? Root 권한을 세분화하는 Linux 보안 메커니즘 완벽 이해

Linux에서는 오랫동안 Root 사용자가 모든 시스템 권한을 가지고 있었습니다. Root는 파일 시스템 변경, 네트워크 설정, 프로세스 제어 등 거의 모든 작업을 수행할 수 있습니다.

하지만 모든 프로그램에 Root 권한을 부여하는 것은 보안상 매우 위험합니다. 단 하나의 취약점만으로도 시스템 전체가 공격받을 수 있기 때문입니다.

이 문제를 해결하기 위해 Linux Kernel은 Capabilities(리눅스 기능 권한) 이라는 보안 메커니즘을 제공합니다.

Capabilities는 Root 권한을 여러 개의 작은 권한으로 분리하여 프로그램에 필요한 권한만 부여할 수 있도록 합니다.

이번 글에서는 Linux Capabilities의 개념과 동작 원리, 주요 Capability 종류, 확인 및 설정 방법, 그리고 Docker와 Kubernetes에서의 활용 사례까지 자세히 알아보겠습니다.

Linux Capabilities란?

Linux Capabilities는 Root 권한을 세분화하여 필요한 권한만 개별적으로 부여하는 Kernel 보안 기능입니다.

기존 방식은 다음과 같습니다.

Application

↓

Root

↓

모든 권한

Capabilities를 사용하면 다음과 같이 동작합니다.

Application

↓

CAP_NET_BIND_SERVICE

↓

80 Port 사용 가능

(다른 Root 권한은 없음)

즉, 최소 권한 원칙(Principle of Least Privilege)을 구현할 수 있습니다.

Capabilities가 필요한 이유

예를 들어 웹 서버가 80번 포트를 사용하려면 일반적으로 Root 권한이 필요합니다.

하지만 웹 서버가 전체 Root 권한을 가지면 다음과 같은 위험이 있습니다.

  • 시스템 파일 삭제
  • 사용자 계정 변경
  • 커널 설정 변경
  • 프로세스 종료

Capabilities를 사용하면 필요한 권한만 부여하여 이러한 위험을 줄일 수 있습니다.

주요 Capability 종류

Linux에는 수십 가지 Capability가 존재합니다.

대표적인 항목은 다음과 같습니다.

Capability설명
CAP_CHOWN파일 소유자 변경
CAP_DAC_OVERRIDE파일 접근 권한 무시
CAP_NET_ADMIN네트워크 설정 변경
CAP_NET_BIND_SERVICE1024 이하 포트 사용
CAP_SYS_ADMIN시스템 관리 기능
CAP_SYS_TIME시스템 시간 변경
CAP_KILL다른 프로세스 종료
CAP_SYS_BOOT시스템 재부팅

각 권한은 독립적으로 부여하거나 제거할 수 있습니다.

Capability 집합(Set)

Linux는 Capability를 여러 집합으로 관리합니다.

Set설명
Permitted사용할 수 있는 권한
Effective현재 활성화된 권한
Inheritable자식 프로세스에 상속 가능한 권한
Bounding가질 수 있는 최대 권한
Ambient실행 시 유지되는 권한

이러한 구조를 통해 권한을 더욱 세밀하게 제어합니다.

현재 프로세스 Capability 확인

현재 Shell의 Capability를 확인하려면 다음 명령을 사용합니다.

capsh --print

출력 예시

Current:

Bounding set:

Ambient set:

현재 활성화된 Capability 정보를 확인할 수 있습니다.

실행 파일 Capability 확인

실행 파일에 부여된 Capability는 다음 명령으로 확인합니다.

getcap /usr/bin/ping

예시

/usr/bin/ping cap_net_raw=ep

이는 ping 명령이 Root 권한 없이도 Raw Socket을 사용할 수 있도록 설정되어 있다는 의미입니다.

Capability 설정

실행 파일에 Capability를 추가하려면 setcap 명령을 사용합니다.

예를 들어 80번 포트를 사용할 수 있도록 설정하려면

sudo setcap cap_net_bind_service=+ep /usr/local/bin/myserver

설정 확인

getcap /usr/local/bin/myserver

Capability 제거

sudo setcap -r /usr/local/bin/myserver

Docker와 Capabilities

Docker는 기본적으로 대부분의 위험한 Capability를 제거한 상태로 컨테이너를 실행합니다.

예를 들어

docker run nginx

를 실행하면 모든 Root 권한이 부여되는 것이 아니라 제한된 Capability만 허용됩니다.

추가 권한이 필요하면

docker run \
--cap-add=NET_ADMIN \
ubuntu

특정 권한만 추가할 수 있습니다.

반대로 제거하려면

docker run \
--cap-drop=NET_RAW \
ubuntu

와 같이 사용할 수 있습니다.

Kubernetes와 Capabilities

Kubernetes에서도 Pod의 보안 설정에서 Capability를 관리할 수 있습니다.

예시

securityContext:
  capabilities:
    add:
      - NET_ADMIN
    drop:
      - ALL

이를 통해 필요한 권한만 부여하는 보안 정책을 구성할 수 있습니다.

실무에서 자주 사용하는 명령어

현재 Capability 확인

capsh --print

파일 Capability 확인

getcap /usr/bin/ping

Capability 추가

sudo setcap cap_net_bind_service=+ep myserver

Capability 제거

sudo setcap -r myserver

설치된 Capability 도구 확인

which getcap
which setcap

패키지 확인

rpm -q libcap

# Debian/Ubuntu
dpkg -l libcap2-bin

실무 사례

예를 들어 사내에서 개발한 웹 서버가 80번 포트를 사용해야 한다고 가정해 보겠습니다.

Root 권한으로 실행하는 대신 다음과 같이 설정할 수 있습니다.

  1. setcap cap_net_bind_service=+ep으로 실행 파일에 권한 부여
  2. 일반 사용자 계정으로 서버 실행
  3. getcap으로 적용 여부 확인
  4. 불필요한 Root 권한 없이 서비스 운영

이렇게 하면 보안 위험을 줄이면서도 필요한 기능을 사용할 수 있습니다.

자주 묻는 질문

Root 사용자와 Capabilities의 차이는 무엇인가요?

Root는 시스템의 거의 모든 권한을 가지지만, Capabilities는 필요한 기능만 선택적으로 부여합니다. 따라서 보안성이 훨씬 높습니다.

모든 프로그램에 Capabilities를 사용하는 것이 좋은가요?

필요한 경우에만 사용하는 것이 좋습니다. 최소 권한 원칙에 따라 프로그램이 실제로 필요한 Capability만 부여하는 것이 가장 안전합니다.

Docker에서 Root로 실행해도 Capability 제한이 적용되나요?

네. 컨테이너 내부에서 Root 사용자로 실행하더라도 Docker는 기본적으로 일부 Capability를 제거하여 호스트 시스템에 미치는 영향을 최소화합니다.

마무리

Linux Capabilities는 Root 권한을 세분화하여 필요한 기능만 안전하게 부여할 수 있도록 설계된 Kernel 보안 기능입니다. 최소 권한 원칙을 구현하는 핵심 기술이며, Docker와 Kubernetes 같은 컨테이너 환경에서도 중요한 역할을 합니다. getcap, setcap, capsh 등의 도구를 활용하면 권한을 보다 안전하게 관리할 수 있으며, 시스템 보안 수준을 크게 향상시킬 수 있습니다.

댓글 남기기