--privileged знімає майже всі обмеження контейнера:
- надає всі можливості (capabilities), включно з
SYS_ADMIN; - вимикає профілі seccomp і AppArmor/SELinux;
- дає доступ до всіх пристроїв хоста (
/dev) - дисків, модулів ядра.
Процес у привілейованому контейнері може змонтувати диск хоста й прочитати чи змінити будь-які файли, завантажити модуль ядра - тобто це фактично root на хості. Ізоляція контейнера тоді майже лише формальна.
Коли його застосовують - Docker-in-Docker, деякі системні агенти (керування мережею, сховищем), експерименти. Майже завжди є вужча альтернатива: окремі можливості (--cap-add), конкретні пристрої (--device), зовнішній демон через SSH чи безпечні інструменти збирання.
Seccomp - фільтр системних викликів ядра. Docker за замовчуванням застосовує профіль, що забороняє кілька десятків небезпечних викликів (наприклад, mount, reboot, kexec_load, add_key, створення нових просторів імен у більшості випадків). Більшості застосунків вони не потрібні, а для зловмисника це інструменти виходу з контейнера.
docker run --security-opt seccomp=./custom-profile.json myapp
docker run --security-opt seccomp=unconfined myapp # вимкнути - лише для налагодження
Власний, вужчий профіль (лише ті виклики, що реально використовує застосунок) - ще сильніший захист, але вимагає ретельного тестування.
AppArmor (Ubuntu/Debian) / SELinux (RHEL/Fedora) - мандатний контроль доступу: обмежує, до яких файлів, мереж і можливостей процес має доступ, незалежно від прав користувача. Docker застосовує профіль docker-default для AppArmor; власні профілі задають через --security-opt apparmor=....
Багатошаровий захист - кожен механізм закриває свою частину:
| Механізм | Що обмежує |
|---|---|
| простори імен | що процес бачить |
| cgroups | скільки ресурсів використовує |
| capabilities | які привілейовані дії може робити root |
| seccomp | які системні виклики ядра доступні |
| AppArmor/SELinux | до яких ресурсів є доступ |
| непривілейований користувач | права всередині контейнера |
Правило для продакшену: жодного --privileged і seccomp=unconfined без задокументованої причини; перевіряти це в рев'ю конфігурацій (Compose, маніфести) і сканерами конфігурації.