Docker

컨테이너 보안

개요

 컨테이너를 실행할 때 기본적으로 root 사용자가 할당되어 운영된다. root 사용자는 운영체제 전반적인 권한을 모두 가지고 있는 계정이며, 그 만큼 보안 상 고려해야 할 요소가 많고 주의해야만 하는 계정이다. Linux Capabilities는 root 슈퍼유저의 권한을 세분화하여 부분적으로 권한을 허용할 수 있게 조치하는 역할을 한다. 각 capabilities는 독립적으로 비/활성화 할 수 있으며, 32-bitmask 구조로 구현되었다가 개수가 많아져 현재 38개의 capabilities를 저장하기 위해 64-bitmask로 작동된다. 그러므로 단순히 root 계정이 모든 작업을 할 수 있는 절대 계정이라기 보단, 모든 capabilities가 활성화된 root 계정이 모든 커널 단위의 작업을 수행할 수 있는 슈퍼유저이다. 각 capabilities는 단순한 raw IP 패킷을 전송한다던지, 0~1023사이의 포트번호(well-known ports)에 대한 바인딩을 하는 등의 보안과 밀접한 관련이 있는 작업을 수행할 수 있는 권한을 켜거나 끌 수 있다. 컨테이너를 생성하기 전에 이러한 capabilities를 비활성화(Drop)한다면, 컨테이너 내부의 프로세스에서는 절대 다시 활성화시킬 수 없다.

Docker 기본값

 그렇다면, 컨테이너 프레임워크로 많이 사용되고 있는 Docker는 기본적으로 어떤 Capabilities를 default 값으로 두고 있을까. 다음은 그 목록이다.

chown, dac_override, fowner, fsetid, kill, setgid, setuid, setpcap, net_bind_service, net_raw, sys_chroot, mknod, audit_write, setfcap

Add&Drop Capabilities

 docker run 명령에서는 --cap-drop 옵션을 통해 특정 capability를 비활성화할 수 있다.

docker run -it --rm --cap-drop=setfcap --cap-drop=audit_write --cap-drop=mknod ubuntu

 docker compose에서는 다음과 같이 구성한다.

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

 반대로, --cap-add과 cap_add 옵션을 통해 capability를 추가할 수 있으며, `ALL`은 모든 capabilities를 활성화한다.

 docker run의 `--privileged`와 docker compose의 `privileged: true` 옵션은 기존의 Add/Drop capabilities 옵션을 모두 무시하고 모든 capabilities를 활성화한다. `ALL`과 같은 효과이다.

 다음 그림은 docker compose에서 privileged, cap_add, cap_drop의 조합에 따라 달라지는 capabilities 상태를 보여준다. 예시로 'CAP_A'라는 가상의 capability를 옵션에 조합하는 경우를 예시로 들었다.

참조

댓글

댓글 본문
버전 관리
Hyunseok Lim
현재 버전
선택 버전
graphittie 자세히 보기