У меня следующая настройка контейнера.
На голом железе установлены и работают два демона Docker.
Я хочу предоставить клиенту доступ к API (2376) Плагин Docker Daemon так что клиент может развернуть / запустить / остановить свои собственные контейнеры. У клиента будет доступ только к API, а не к хосту (SSH).
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что если клиенты запускают контейнер, который делает что-то небезопасное, например docker run -v /:/host/root Ubuntu rm -rf /host/root
.
У меня вопрос: что я могу сделать, чтобы предотвратить Плагин Docker Daemon от монтажного корня /
или любой другой каталог за пределами /home/user/
,
/home/user/
?--userns-remap
помочь мне достичь моей цели? Сервер полностью принадлежит одному заказчику. Так что безопасность или утечка данных не являются моей главной заботой. Что я действительно хочу предотвратить, так это того, чтобы кто-то Плагин Демон делает что-то глупое, что влияет на мои контейнеры, которые работают в Главный демон Docker. Я хотел бы придерживаться рабочего процесса только для докеров и не хочу настраивать дополнительный рабочий процесс для создания виртуальных машин.
SELinux предотвратит монтирование всего, что неправильно помечено, как том внутри контейнера докеров, в качестве доказательства, здесь с использованием одного файла, та же политика применяется к каталогам:
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max 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.sh
bash: sample_script.sh: Permission denied
И будет зарегистрирован отказ AVC:
$ sudo ausearch -m avc -ts recent
time->Mon Oct 3 17:39:28 2016
type=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.sh
Hello, world
Подробнее о Docker и SELinux в официальная документация Red Hat и Эта статья пользователя Dan Walsh.