Вопрос или проблема
На системе Ubuntu у меня открыто несколько окон терминала. Некоторые находятся внутри Docker-образов, некоторые — нет. На моей системе установлены некоторые инструменты, которые работают некорректно и разрушающе, если их запускать внутри контейнера. Существует ли какой-либо псевдоним или что-то, что я могу добавить, чтобы заблокировать команду, когда мой шелл находится внутри контейнера, но позволить ей работать нормально, когда она запущена вне контейнера? У меня было слишком много случаев, когда я вводил команду в неправильный шелл, поэтому я хотел бы защитить себя от себя.
Это сложно, если вы не можете контролировать и изменять образ Docker-контейнера. Один обходной путь — заблокировать имя команды постоянно, а потом переместить файл команды на хосте. Ниже просто замените more
на имя вашей команды:
-
Вставьте в
/etc/apparmor.d/askubuntu1537796
profile askubuntu1537796 /usr/bin/more flags=(kill) {}
-
Вставьте в
/etc/systemd/system/docker.service.d/disable-docker-apparmor.conf
# https://askubuntu.com/q/1537796/1004020 # https://github.com/moby/moby/issues/41553#issuecomment-2056845244 # Внимание: это снижает безопасность [Service] Environment=container="disable apparmor"
-
Выполните это:
sudo -i dpkg-divert --rename --divert /usr/bin/more{-trusted-askubuntu1537796,} ln -s /usr/bin/more{-trusted-askubuntu1537796,} systemctl daemon-reload aa-teardown systemctl restart apparmor systemctl restart docker
Результат
home@daniel-desktop3:~$ more
more: bad usage
Try 'more --help' for more information.
home@daniel-desktop3:~$ docker run --rm -it ubuntu:latest
root@cb701e1174ef:/# more
Killed
root@cb701e1174ef:/#
Некоторые команды уже имеют профили в /etc/apparmor.d
. Если они загружаются с более высоким приоритетом, их нужно удалить, чтобы профиль flags=(kill)
вступил в силу.
Существуют альтернативы, которые не снижают безопасность, но они более сложные. Контейнеры могут запускаться с профилем AppArmor, который предотвращает exec
нежелательной команды, но существует риск забыть указать это при создании контейнера. Фильтр eBPF также может подключиться к execve
глобально и завершить процесс, когда он обнаружит, что он в Docker-контейнере, но программирование на eBPF сложно.
Ответ или решение
Теория
Ubuntu — популярная операционная система, часто используемая в качестве хоста для контейнеров Docker. В данной ситуации пользователь сталкивается с проблемой запуска определённых команд, которые потенциально могут вызывать деструктивные последствия, если они выполняются внутри Docker-контейнера. Это требует решения, которое блокирует выполнение таких команд внутри контейнера, оставаясь доступными вне его. Одним из способов предотвращения случайного запуска команд является использование AppArmor или eBPF для ограничения выполнения команд в контейнерной среде.
Пример
В предложенном решении, чтобы блокировать определённую команду в Docker-контейнере, используются возможности AppArmor. Создаётся профиль AppArmor, который запрещает выполнение определённой команды через её идентификацию по имени. Пример для команды more
, показанный выше, включает следующие шаги:
-
Создание профиля в
/etc/apparmor.d/askubuntu1537796
, который обрабатывает команду с флагом(kill)
. -
Изменение конфигурации Docker для отключения AppArmor через создание файла
/etc/systemd/system/docker.service.d/disable-docker-apparmor.conf
. -
Перенос и сопутствующее перенаправление файла команды на хосте, последующий перезапуск сервисов
apparmor
иdocker
для применения изменений.
После применения этих изменений, команда more
будет заблокирована и завершаться с ошибкой при попытке её выполнения внутри Docker-контейнера.
Применение
Применение данного подхода позволяет защитить систему от ненамеренного запуска опасных команд внутри Docker-контейнеров. На практике это может минимизировать риск неправильной работы инструментов и сохранить целостность как хостовой системы, так и сред внутри контейнеров.
Хотя использование AppArmor и eBPF требует дополнительных усилий по настройке, это подходит для решения подобных задач. Для корпоративной среды целесообразным будет разработка детализированных конфигураций AppArmor или тестирование eBPF-фильтров, которые могут идентифицировать и блокировать выполнение определённых команд в контейнерах. Это поможет создать более безопасное окружение и повысить общую надёжность системы.