Docker --privileged

HackTricks'i Destekleyin

Ne Etkiler

Bir konteyneri yetkili olarak çalıştırdığınızda devre dışı bıraktığınız korumalar şunlardır:

Mount /dev

Yetkili bir konteynerde, tüm cihazlar /dev/ içinde erişilebilir. Bu nedenle, diskin ana makineye mount edilmesiyle kaçabilirsiniz.

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

Sadece okunur çekirdek dosya sistemleri

Çekirdek dosya sistemleri, bir sürecin çekirdeğin davranışını değiştirmesi için bir mekanizma sağlar. Ancak, konteyner süreçleri söz konusu olduğunda, onların çekirdekte herhangi bir değişiklik yapmalarını önlemek istiyoruz. Bu nedenle, çekirdek dosya sistemlerini konteyner içinde sadece okunur olarak monte ediyoruz, böylece konteyner süreçleri çekirdeği değiştiremez.

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

Kernel dosya sistemlerini maskeleme

/proc dosya sistemi seçici olarak yazılabilir, ancak güvenlik için, belirli kısımlar tmpfs ile örtülerek yazma ve okuma erişiminden korunur, böylece konteyner süreçleri hassas alanlara erişemez.

tmpfs, tüm dosyaları sanal bellekte depolayan bir dosya sistemidir. tmpfs, sabit diskinizde herhangi bir dosya oluşturmaz. Bu nedenle, bir tmpfs dosya sistemini ayırırsanız, içinde bulunan tüm dosyalar sonsuza dek kaybolur.

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

Konteyner motorları, konteynerin içinde neler olacağını kontrol etmek için konteynerleri sınırlı sayıda yetenekle başlatır. Ayrıcalıklı olanlar tüm yeteneklere erişime sahiptir. Yetenekler hakkında bilgi edinmek için okuyun:

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

Bir konteyner için mevcut yetenekleri --privileged modunda çalışmadan --cap-add ve --cap-drop bayraklarını kullanarak manipüle edebilirsiniz.

Seccomp

Seccomp, bir konteynerin çağırabileceği syscall'ları sınırlamak için faydalıdır. Docker konteynerleri çalıştırıldığında varsayılan bir seccomp profili etkinleştirilir, ancak ayrıcalıklı modda devre dışı bırakılır. Seccomp hakkında daha fazla bilgi edinin:

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

Ayrıca, Kubernetes kümesinde Docker (veya diğer CRI'ler) kullanıldığında, seccomp filtresi varsayılan olarak devre dışıdır.

AppArmor

AppArmor, kapsayıcıları sınırlı bir kaynak setine per-program profilleri ile sınırlamak için bir çekirdek geliştirmesidir. --privileged bayrağı ile çalıştığınızda, bu koruma devre dışı bırakılır.

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

SELinux

--privileged bayrağı ile bir konteyner çalıştırmak SELinux etiketlerini devre dışı bırakır ve konteyner motorunun etiketini, genellikle unconfined, miras almasına neden olur; bu da konteyner motoruna benzer şekilde tam erişim sağlar. Rootless modda container_runtime_t kullanılırken, root modda spc_t uygulanır.

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

Etkilenmeyenler

Ad Alanları

Ad alanları --privileged bayrağından ETKİLENMEZ. Güvenlik kısıtlamaları etkin olmasa da, örneğin sistemdeki veya ana ağdaki tüm süreçleri göremezler. Kullanıcılar, --pid=host, --net=host, --ipc=host, --uts=host konteyner motoru bayraklarını kullanarak bireysel ad alanlarını devre dışı bırakabilirler.

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

Kullanıcı ad alanı

Varsayılan olarak, konteyner motorları kullanıcı ad alanlarını kullanmaz, yalnızca rootless konteynerler için gereklidir, bu da dosya sistemi montajı ve birden fazla UID kullanımı için gereklidir. Rootless konteynerler için temel olan kullanıcı ad alanları devre dışı bırakılamaz ve ayrıcalıkları kısıtlayarak güvenliği önemli ölçüde artırır.

Referanslar

HackTricks'i Destekleyin

Last updated