Docker --privileged

Support HackTricks

Šta utiče

Kada pokrenete kontejner kao privilegovan, ovo su zaštite koje onemogućavate:

Montiranje /dev

U privilegovanom kontejneru, svi uređaji mogu biti pristupljeni u /dev/. Stoga možete pobeći tako što ćete montirati disk domaćina.

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

Datoteke sistema jezgra samo za čitanje

Datoteke sistema jezgra pružaju mehanizam za proces da modifikuje ponašanje jezgra. Međutim, kada su u pitanju procesi kontejnera, želimo da sprečimo njihovo menjanje jezgra. Stoga, montiramo datoteke sistema jezgra kao samo za čitanje unutar kontejnera, osiguravajući da procesi kontejnera ne mogu modifikovati jezgro.

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

Maskiranje nad datotečnim sistemima jezgra

/proc datotečni sistem je selektivno zapisiv, ali iz bezbednosnih razloga, određeni delovi su zaštićeni od pisanja i čitanja preklapanjem sa tmpfs, osiguravajući da procesi kontejnera ne mogu pristupiti osetljivim oblastima.

tmpfs je datotečni sistem koji čuva sve datoteke u virtuelnoj memoriji. tmpfs ne kreira nikakve datoteke na vašem hard disku. Dakle, ako odmontirate tmpfs datotečni sistem, sve datoteke koje se u njemu nalaze su izgubljene zauvek.

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

Motori kontejnera pokreću kontejnere sa ograničenim brojem sposobnosti kako bi kontrolisali šta se dešava unutar kontejnera po defaultu. Privilegovani imaju sve sposobnosti dostupne. Da biste saznali više o sposobnostima, pročitajte:

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žete manipulisati sposobnostima dostupnim kontejneru bez pokretanja u --privileged režimu koristeći --cap-add i --cap-drop zastavice.

Seccomp

Seccomp je koristan za ograničavanje syscalls koje kontejner može pozvati. Podrazumevani seccomp profil je omogućen podrazumevano prilikom pokretanja docker kontejnera, ali u privilegovanom režimu je on onemogućen. Saznajte više o Seccomp-u ovde:

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

Takođe, imajte na umu da kada se Docker (ili drugi CRI) koriste u Kubernetes klasteru, seccomp filter je onemogućen po defaultu

AppArmor

AppArmor je poboljšanje jezgra koje ograničava kontejnere na ograničen skup resursa sa profilima po programu. Kada pokrenete sa --privileged flagom, ova zaštita je onemogućena.

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

SELinux

Pokretanje kontejnera sa --privileged zastavicom onemogućava SELinux oznake, uzrokujući da nasledi oznaku kontejnerskog motora, obično unconfined, što omogućava pun pristup sličan kontejnerskom motoru. U rootless režimu, koristi container_runtime_t, dok se u root režimu primenjuje spc_t.

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

Šta ne utiče

Namespaces

Namespaces NISU pogođeni --privileged oznakom. Iako nemaju omogućena sigurnosna ograničenja, ne vide sve procese na sistemu ili host mreži, na primer. Korisnici mogu onemogućiti pojedinačne namespaces koristeći --pid=host, --net=host, --ipc=host, --uts=host oznake kontejnerskog motora.

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

User namespace

Podrazumevano, kontejnerski alati ne koriste korisničke imenske prostore, osim za kontejnere bez root privilegija, koji ih zahtevaju za montiranje datotečnih sistema i korišćenje više UID-ova. Korisnički imenski prostori, koji su ključni za kontejnere bez root privilegija, ne mogu se onemogućiti i značajno poboljšavaju bezbednost ograničavanjem privilegija.

References

Support HackTricks

Last updated