Как запретить демону Docker монтировать корневую файловую систему хоста в контейнер

У меня есть следующая настройка контейнера.

На голом металлическом сервере установлены и запущены два демона Docker.

  1. Главный демон Docker Запускает мои контейнеры приложений, открывая 80/443 внешнему миру.
  2. Демон плагина Docker Запускает некоторые контейнеры, предоставленные клиентом, которые взаимодействуют с моим приложением через 80/443.

Я хотел бы предоставить клиенту доступ к API (2376) Демон плагина Docker чтобы клиент мог развертывать / запускать / останавливать свои собственные контейнеры. Клиент будет иметь доступ только к API, а не к хосту (SSH).

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что, если клиенты запускают контейнер, который делает что-то небезопасное, например docker run -v /:/host/root Ubuntu rm -rf /host/root.

Мой вопрос в том, что я могу сделать, чтобы предотвратить Демон плагина Docker от монтажного корня / или любой другой каталог за пределами /home/user/,

  • Есть ли возможность запустить демон Docker в /home/user/?
  • Могу ли я использовать некоторую магию LSM (модули безопасности Linux SELinux /Apparmor), чтобы запретить демону docker монтировать некоторые или все пути к хосту, кроме users home или var /docker /libs?
  • Мочь --userns-remap помочь мне достичь моей цели?
  • Доступны ли какие-либо другие варианты, кроме виртуальных машин?

Сервер полностью принадлежит одному клиенту. Так что безопасность или утечка данных не являются моей главной заботой. Что я действительно хочу предотвратить, так это то, что кто-то в Демон плагина делает что-то глупое, что влияет на мои контейнеры, которые запускаются в Главный демон Docker. Я хотел бы сохранить бережливость и придерживаться рабочего процесса только для docker и не хочу настраивать дополнительный рабочий процесс для создания виртуальной машины.

SELinux предотвратит монтирование чего-либо с неправильной маркировкой в качестве тома внутри контейнера docker, в качестве доказательства, здесь используется один файл, та же политика применяется к каталогам:

$ sestatusSELinux status:                 enabledSELinuxfs mount:                /sys/fs/selinuxSELinux root directory:         /etc/selinuxLoaded policy name:             targetedCurrent mode:                   enforcingMode from config file:          enforcingPolicy MLS status:              enabledPolicy deny_unknown status:     allowedMax kernel policy version:      30

Использование файла с образцом:

$ cat sample_script.sh echo 'Hello, world'

Его контекст безопасности по умолчанию является:

$ ls -lrtZ sample_script.sh -rw-------. 1 david david unconfined_u:object_r:user_home_t:s0 20 Oct  3 17:18 sample_script.sh

Попытка использовать этот файл внутри контейнера завершается неудачей, как и ожидалось:

$ docker run -v /home/david/sample_script.sh:/sample_script.sh --rm ubuntu bash sample_script.shbash: sample_script.sh: Permission denied

И будет зарегистрирован отказ AVC:

$ sudo ausearch -m avc -ts recenttime->Mon Oct  3 17:39:28 2016type=AVC msg=audit(1475512768.444:784): avc:  denied  { read } for  pid=28720 comm="bash" name="sample_script.sh" dev="dm-13" ino=101062112 scontext=system_u:system_r:svirt_lxc_net_t:s0:c457,c992 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0

После изменения контекста безопасности на один Docker может использовать:

$ sudo chcon -Rt svirt_sandbox_file_t sample_script.sh$ ls -lrtZ sample_script.sh -rw-------. 1 david david unconfined_u:object_r:svirt_sandbox_file_t:s0 20 Oct  3 17:18 sample_script.sh 

Контейнер теперь имеет доступ к файлу:

$ docker run -v /home/david/sample_script.sh:/sample_script.sh --rm ubuntu bash sample_script.shHello, world

Более подробная информация о Docker и SELinux приведена в официальная документация Red Hat и эта статья автор: Дэн Уолш.

Да, SELinux предотвращает эту атаку. Демонстрация того, что это не работает, делает хорошую демонстрацию. Используйте Docker в дистрибутиве на базе Red Hat, чтобы получить доступ к SELinux protection. В дистрибутивах на базе Debian SELinux исторически поддерживался не очень хорошо.

А как насчет снаряжения, возможно ли это и там?

Я в это не верю. Я никогда не слышал, чтобы AppArmor мог сделать что-то подобное. Знаете, это совсем другая и гораздо менее безопасная технология.