Docker --privileged

Support HackTricks

Co wpływa

Kiedy uruchamiasz kontener jako uprzywilejowany, wyłączasz następujące zabezpieczenia:

Montowanie /dev

W uprzywilejowanym kontenerze wszystkie urządzenia mogą być dostępne w /dev/. Dlatego możesz uciec przez zamontowanie dysku hosta.

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

Systemy plików jądra tylko do odczytu

Systemy plików jądra zapewniają mechanizm, który pozwala procesowi modyfikować zachowanie jądra. Jednak w przypadku procesów kontenerowych chcemy zapobiec ich wprowadzaniu jakichkolwiek zmian w jądrze. Dlatego montujemy systemy plików jądra jako tylko do odczytu w obrębie kontenera, zapewniając, że procesy kontenerowe nie mogą modyfikować jądra.

# 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)

Maskowanie nad systemami plików jądra

System plików /proc jest selektywnie zapisywalny, ale dla bezpieczeństwa, niektóre części są chronione przed dostępem do zapisu i odczytu poprzez nałożenie na nie tmpfs, co zapewnia, że procesy kontenera nie mogą uzyskać dostępu do wrażliwych obszarów.

tmpfs to system plików, który przechowuje wszystkie pliki w pamięci wirtualnej. tmpfs nie tworzy żadnych plików na twoim dysku twardym. Więc jeśli odmontujesz system plików tmpfs, wszystkie pliki w nim zawarte zostaną na zawsze utracone.

# 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)

Możliwości Linuxa

Silniki kontenerowe uruchamiają kontenery z ograniczoną liczbą możliwości, aby kontrolować, co dzieje się wewnątrz kontenera domyślnie. Privileged mają wszystkie możliwości dostępne. Aby dowiedzieć się więcej o możliwościach, przeczytaj:

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
[...]

Możesz manipulować możliwościami dostępnymi dla kontenera bez uruchamiania w trybie --privileged, używając flag --cap-add i --cap-drop.

Seccomp

Seccomp jest przydatny do ograniczenia syscalli, które kontener może wywołać. Domyślny profil seccomp jest włączony domyślnie podczas uruchamiania kontenerów docker, ale w trybie uprzywilejowanym jest wyłączony. Dowiedz się więcej o Seccomp tutaj:

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

Również zauważ, że gdy Docker (lub inne CRI) są używane w klastrze Kubernetes, filtr seccomp jest domyślnie wyłączony.

AppArmor

AppArmor to ulepszenie jądra, które ogranicza kontenery do ograniczonego zestawu zasobów z profilami per program. Gdy uruchamiasz z flagą --privileged, ta ochrona jest wyłączona.

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

SELinux

Uruchomienie kontenera z flagą --privileged wyłącza etykiety SELinux, powodując, że dziedziczy on etykietę silnika kontenerowego, zazwyczaj unconfined, co przyznaje pełny dostęp podobny do silnika kontenerowego. W trybie bezrootowym używa container_runtime_t, podczas gdy w trybie rootowym stosuje spc_t.

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

Co nie ma wpływu

Przestrzenie nazw

Przestrzenie nazw NIE są dotknięte flagą --privileged. Mimo że nie mają włączonych ograniczeń bezpieczeństwa, nie widzą wszystkich procesów w systemie ani hosta sieciowego, na przykład. Użytkownicy mogą wyłączyć poszczególne przestrzenie nazw, używając flag silnika kontenerów --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

Przestrzeń nazw użytkownika

Domyślnie silniki kontenerów nie wykorzystują przestrzeni nazw użytkownika, z wyjątkiem kontenerów bezrootowych, które ich wymagają do montowania systemu plików i używania wielu UID. Przestrzenie nazw użytkownika, niezbędne dla kontenerów bezrootowych, nie mogą być wyłączane i znacznie zwiększają bezpieczeństwo, ograniczając uprawnienia.

Odniesienia

Wsparcie dla HackTricks

Last updated