Инфраструктура любой компании – это серьезный аспект, которому нужно уделять как можно больше внимания с целью оптимизации ее деятельности. Поэтому, не менее важным является соблюдение всех норм безопасности. Это касается и тех инструментов, которые используются для построения инфраструктуры. В этом материале, состоящем из двух частей мы поговорим о проблемах безопасности Docker.

Вы можете использовать базовые встроенные функции, которые обеспечивают оптимальную работу контейнеров и их безопасность:

  • Объединение контейнеров в Docker для минимизации используемых ресурсов стороннего ПО.
  • Настройка микросервисов за счет тонкой конфигурации в Docker-контейнерах, с целью создания узкой направленности под выполнение конкретной задачи.
  • Изоляция контейнеров от внешних инструментов и других Docker-элементов. Однако, с этим связана и другая проблема Docker, которой мы коснемся дальше – вам придется распределять ресурсы ядра системы.
  • Воспроизводите конфигурацию и другие параметры любого контейнера для ускорения работы и анализа их функциональности

Тем не менее, несмотря на внушительный ряд полезных инструментов, Docker не лишен своих уязвимостей.

Проблема безопасности Docker: хост и ядро

Суть проблемы

Если инфраструктура компании скомпрометирована, то все средства изоляции окажутся малоэффективными. Более того, Docker выстраивает все контейнеры вокруг основного ядра, а значит, и прямой доступ к нему. Да, с одной стороны это повышает производительность, но с другой, мы рискуем сдать все системы потенциальному злоумышленнику.

Что делать

Так как Docker используется в Linux-системе, методы обеспечения безопасности будут для них общими. С поиском информации по этой теме у вас проблем не возникнет. А вот с настройкой Docker как отдельного инструмента могут появиться трудности:

  • Ограничьте доступ и обеспечьте надежное шифрование для защищенного канала связи, чтобы обезопасить хост и Docker engine. Чтобы упростить себе задачу, используйте готовое решение для настройки «Docker bench audit tool».
  • Не забывайте обновляться и использовать самые свежие инструменты для обеспечения безопасности всех устройств и программ. С особой осторожностью относитесь к стороннему ПО.
  • Не перезагружайте систему ненужными вещами, чтобы избежать появления уязвимостей. Работайте с максимально изолированными ОС, как CoreOS или RancherOS.
  • Не стоит игнорировать такую полезную функцию, как «мандатный доступ». Она позволит вам избежать появления подозрительной активности на самом хосте.

Примеры использования

Вы можете использовать «Seccomp» в качестве интерфейса для вызова ядра, чтобы ограничить круг допустимой активности в системе. Ряд действий блокируется автоматически. Пропишите следующие строки:

Альтернативный вариант

Можно ограничить использование команды chmod. Загрузите профиль, который предлагается «Seccomp» по умолчанию:

Ограничить использование команд можно путем удаления белого списка около 50-55 строки. Просто сотрите команды типа «chmod».

Перезапустите контейнер, чтобы убедиться в работоспособности введенных новшеств:

Проблема безопасности Docker: выход за пределы контейнера

Суть проблемы

Данная ситуация широко распространена в тех контейнерах Docker, которые содержат в себе большое количество стороннего ПО. В связи с тем, что изучить их содержимое тяжело, да и мало кто этим интересуется, оно может содержать в себе вредоносный код, которые способен «выбраться наружу» через все внедренные ограничения и политики безопасности. Так и компрометируются данные с ограниченным доступом.

Чтобы решить эту проблему безопасности Docker, можно последовать путем серьезного подхода к урезанию прав каждому отдельному контейнеру также за счет и пользовательского пространства имен.

Что делать

  • Ограничьте доступ контейнеру к чувствительным участкам системы и урежьте права его содержимому. Например, команда CAP_SYS_ADMIN дает возможность любому пользователю безграничный доступ к большинству функций и конфигураций самого ядра!
  • И еще раз напоминаем про использование пользовательского пространства имен. Не задействуйте uid 0.
  • В случае, когда урезать права определенному контейнеру нельзя по каким-то причинам, убедитесь, что все используемое ПО проверено на безопасность.
  • Если вы монтируете какие-либо ресурсы типа /proc или /dev для хоста, то стоит лишний раз перепроверить эти операции на наличие вредоносных действий и т.д. Помните, что зачастую контейнерам достаточно режима «чтения». А права на «запись» — это сугубо индивидуальное правило.

Примеры использования

Пользователь, находящийся под «рутом», может создавать новые объекты в системе. Этого допустить нельзя:

Этому же пользователю вполне по силам изменить конфигурации, касающиеся прав доступа всех объектов в системе. Чтобы убедиться в этом, попробуйте создать что-либо с правами рядового юзера, а потому измените его с помощью прав «рута». Если все получилось, значит вышеприведенное утверждение верно.

Естественно, от этой угрозы нужно избавиться:

Для начала, создадим юзера с обычными правами и зайдем в корневой путь. После этого выполняем такие команды:

Также не стоит игнорировать потенциальные уязвимости сетевых сканеров, которые регулярно организовывают нужные пакеты с самого начала. Это тоже нам не нужно:

Если же вы хотите ознакомиться с полным перечнем прав доступа, то воспользуйтесь соответствующей командой. Регулярно проверяйте этот список, чтобы не пропустить в систему пользователя с неограниченными правами.

Помните, что игнорирование пространства имен приведет к тому, что все объекты внутри контейнера будут создаваться с правами суперпользователя.

Для того, чтобы создать именное пространство, нужно внести соответствующий ключ conf в документ, который расположен в /etc/docker/daemon.json:

Теперь перезапускаем Docker. Обратите внимание, что у вас появится dockremap – это пользователь с чистым списком пространства имен.

Заводим nginx:

Как видите, nginx задействован в определенном для него именном пространстве с ограниченным доступом.

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

Суть проблемы

Будьте осторожны с использованием образов Docker, которые доступны в сети. Они могут вмещать в себя вредоносное скрытое ПО или строчки кода. Всегда задавайтесь вопросом об уровне доверия источнику, с которого вы скачиваете образ и проверяйте его на содержимое.

Стоит отметить, что метод инкапсуляции в данном случае бессилен. Даже самостоятельно собранные образы могут быть изменены сторонним ПО после сборки. Поэтому всегда перепроверяйте итоговую сборку. Мы же используем метод PKI.

Что делать

  • Перед запуском проверяйте ПО. Всегда!
  • Разверните образ на тестовом сервере и проверьте его работоспособность. Можно использовать доверенный сервер через «Docker Security Tools».
  • Проведите проверку наличия и соответствия цифровой подписи.

Пример использования

Не лишним будет создать новую запись в Docker Hub и директорию с обычным Dockerfile, в котором будут следующие строки:

Проведем сборку:

Заходим в Docker Hub и выкачиваем образ:

Запускаем Docker для принудительной инспекции:

Пытаемся достучаться до скачанного образа:

Должна вывестись ошибка:

Теперь собираем контейнер повторно, но с активированным DOCKER_CONTENT_TRUST.

Если вы хотите получить консультацию или профессиональную помощь по вопросам безопасности ИТ инфраструктуры, обращайтесь к нам [email protected]!