Docker --privileged

Support HackTricks

What Affects

특권이 있는 컨테이너를 실행할 때 비활성화되는 보호 기능은 다음과 같습니다:

Mount /dev

특권 컨테이너에서는 모든 장치에 /dev/에서 접근할 수 있습니다. 따라서 호스트의 디스크를 마운트하여 탈출할 수 있습니다.

# docker run --rm -it alpine sh
ls /dev
console  fd       mqueue   ptmx     random   stderr   stdout   urandom
core     full     null     pts      shm      stdin    tty      zero

읽기 전용 커널 파일 시스템

커널 파일 시스템은 프로세스가 커널의 동작을 수정할 수 있는 메커니즘을 제공합니다. 그러나 컨테이너 프로세스의 경우, 커널에 대한 변경을 방지하고자 합니다. 따라서 우리는 커널 파일 시스템을 컨테이너 내에서 읽기 전용으로 마운트하여, 컨테이너 프로세스가 커널을 수정할 수 없도록 합니다.

# docker run --rm -it alpine sh
mount | grep '(ro'
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
cpuset on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cpu on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)

커널 파일 시스템 마스킹

/proc 파일 시스템은 선택적으로 쓰기가 가능하지만 보안을 위해 특정 부분은 tmpfs로 덮어씌워져 쓰기 및 읽기 접근이 차단되어 컨테이너 프로세스가 민감한 영역에 접근할 수 없도록 합니다.

tmpfs는 모든 파일을 가상 메모리에 저장하는 파일 시스템입니다. tmpfs는 하드 드라이브에 파일을 생성하지 않습니다. 따라서 tmpfs 파일 시스템을 언마운트하면 그 안에 있는 모든 파일은 영원히 사라집니다.

# docker run --rm -it alpine sh
mount  | grep /proc.*tmpfs
tmpfs on /proc/acpi type tmpfs (ro,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)

리눅스 기능

컨테이너 엔진은 기본적으로 컨테이너 내부에서 발생하는 일을 제어하기 위해 제한된 수의 기능으로 컨테이너를 시작합니다. 특권이 있는 경우 모든 기능에 접근할 수 있습니다. 기능에 대해 알아보려면 다음을 읽으십시오:

Linux Capabilities
# docker run --rm -it alpine sh
apk add -U libcap; capsh --print
[...]
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
[...]

컨테이너에서 --privileged 모드로 실행하지 않고도 사용할 수 있는 기능을 --cap-add--cap-drop 플래그를 사용하여 조작할 수 있습니다.

Seccomp

Seccomp는 컨테이너가 호출할 수 있는 syscalls제한하는 데 유용합니다. 기본적으로 도커 컨테이너를 실행할 때 기본 seccomp 프로파일이 활성화되지만, 특권 모드에서는 비활성화됩니다. Seccomp에 대해 더 알아보려면 여기를 참조하세요:

Seccomp
# docker run --rm -it alpine sh
grep Seccomp /proc/1/status
Seccomp:	2
Seccomp_filters:	1
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined

또한, Kubernetes 클러스터에서 Docker(또는 다른 CRI)를 사용할 때 seccomp 필터는 기본적으로 비활성화되어 있습니다.

AppArmor

AppArmor컨테이너제한된 리소스 집합에 프로그램별 프로파일로 제한하는 커널 향상 기능입니다. --privileged 플래그로 실행할 때 이 보호 기능은 비활성화됩니다.

AppArmor
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined

SELinux

--privileged 플래그로 컨테이너를 실행하면 SELinux 레이블이 비활성화되어 컨테이너 엔진의 레이블을 상속받습니다. 일반적으로 unconfined로 설정되어 컨테이너 엔진과 유사한 전체 접근 권한을 부여합니다. 루트리스 모드에서는 container_runtime_t를 사용하고, 루트 모드에서는 spc_t가 적용됩니다.

SELinux
# You can manually disable selinux in docker with
--security-opt label:disable

영향을 미치지 않는 것

네임스페이스

네임스페이스는 --privileged 플래그의 영향을 받지 않습니다. 보안 제약이 활성화되어 있지 않더라도, 시스템이나 호스트 네트워크의 모든 프로세스를 볼 수는 없습니다. 사용자는 --pid=host, --net=host, --ipc=host, --uts=host 컨테이너 엔진 플래그를 사용하여 개별 네임스페이스를 비활성화할 수 있습니다.

# docker run --rm --privileged -it alpine sh
ps -ef
PID   USER     TIME  COMMAND
1 root      0:00 sh
18 root      0:00 ps -ef

사용자 네임스페이스

기본적으로, 컨테이너 엔진은 루트리스 컨테이너를 제외하고 사용자 네임스페이스를 사용하지 않습니다. 루트리스 컨테이너는 파일 시스템 마운팅과 여러 UID 사용을 위해 사용자 네임스페이스가 필요합니다. 루트리스 컨테이너에 필수적인 사용자 네임스페이스는 비활성화할 수 없으며, 권한을 제한하여 보안을 크게 향상시킵니다.

참고 문헌

Support HackTricks

Last updated