Docker는 컨테이너 내 root 사용자의 기능을 제한하는 기능을 제공한다. 컨테이너 내부의 프로세스가 호스트의 root 사용자가 할 수 있는 작업을 수행하면 시스템에 영향을 미칠 수 있기 때문이다. 따라서 Docker는 Linux의 Capabilities를 이용하여 리눅스의 호스트의 root 사용자와 컨테이너 내 root 사용자에게 권한 차이를 둔다.
Capabilities
Super User의 권한을 능력으로서 독립적으로 허용하거나 허용하지 않도록 설정하기 위한 단위
Super User의 권한을 조각으로 나눈 것
종류
- CAP_SYS_ADMIN : sysadmin 작업 수행
- CAP_SYS_TIME : 시스템 시간 변경
- CAP_CHOWN : 파일의 uid/gid 변경
등등…….
프로세스는 root 권한의 일부인 Capabilities를 가질 수 있고, 파일은 프로그램 실행 프로세스에 주어진 Capabilities를 가질 수 있다.
일반적으로 Docker는 제한된 Capabilities을 가진 컨테이너를 실행한다. 쉽게 예시를 들면, 컨테이너 내 프로세스에는 호스트를 재부팅하거나 호스트에서 실행 중인 컨테이너를 중지할 수 있는 권한이 없다.
별도의 권한이 필요한 경우에는 --cap-add 옵션을 주어야 한다.
권한 부여
docker run --cap-add <CAPABILITY> <IMAGE>
# 모든 권한 부여
docker run --cap-add ALL ubuntu
docker run --privileged ubuntu
권한 회수
docker run --cap-drop <CAPABILITY> <IMAGE>