Есть ли способ в Ubuntu заблокировать выполнение команды терминала внутри контейнера Docker?

Вопрос или проблема

На системе Ubuntu у меня открыто несколько окон терминала. Некоторые находятся внутри Docker-образов, некоторые — нет. На моей системе установлены некоторые инструменты, которые работают некорректно и разрушающе, если их запускать внутри контейнера. Существует ли какой-либо псевдоним или что-то, что я могу добавить, чтобы заблокировать команду, когда мой шелл находится внутри контейнера, но позволить ей работать нормально, когда она запущена вне контейнера? У меня было слишком много случаев, когда я вводил команду в неправильный шелл, поэтому я хотел бы защитить себя от себя.

Это сложно, если вы не можете контролировать и изменять образ Docker-контейнера. Один обходной путь — заблокировать имя команды постоянно, а потом переместить файл команды на хосте. Ниже просто замените more на имя вашей команды:

  1. Вставьте в /etc/apparmor.d/askubuntu1537796

    profile askubuntu1537796 /usr/bin/more flags=(kill) {}
    
  2. Вставьте в /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"
    
  3. Выполните это:

     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, показанный выше, включает следующие шаги:

  1. Создание профиля в /etc/apparmor.d/askubuntu1537796, который обрабатывает команду с флагом (kill).

  2. Изменение конфигурации Docker для отключения AppArmor через создание файла /etc/systemd/system/docker.service.d/disable-docker-apparmor.conf.

  3. Перенос и сопутствующее перенаправление файла команды на хосте, последующий перезапуск сервисов apparmor и docker для применения изменений.

После применения этих изменений, команда more будет заблокирована и завершаться с ошибкой при попытке её выполнения внутри Docker-контейнера.

Применение

Применение данного подхода позволяет защитить систему от ненамеренного запуска опасных команд внутри Docker-контейнеров. На практике это может минимизировать риск неправильной работы инструментов и сохранить целостность как хостовой системы, так и сред внутри контейнеров.

Хотя использование AppArmor и eBPF требует дополнительных усилий по настройке, это подходит для решения подобных задач. Для корпоративной среды целесообразным будет разработка детализированных конфигураций AppArmor или тестирование eBPF-фильтров, которые могут идентифицировать и блокировать выполнение определённых команд в контейнерах. Это поможет создать более безопасное окружение и повысить общую надёжность системы.

Оцените материал
Добавить комментарий

Капча загружается...