Инфраструктура любой компании – это серьезный аспект, которому нужно уделять как можно больше внимания с целью оптимизации ее деятельности. Поэтому, не менее важным является соблюдение всех норм безопасности. Это касается и тех инструментов, которые используются для построения инфраструктуры. В этом материале, состоящем из двух частей мы поговорим о проблемах безопасности 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]!