безопасность докера

Давайте посмотрим, как усилить и защитить Docker для производственной среды.

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

Ниже мы рассмотрим, как защитить Docker на платформе Linux.

  • Недостатки конфигурации
  • Удаленное выполнение кода
  • Переполнение буфера
  • Подделка изображений и так далее.

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

Прежде чем мы приступим к обеспечению безопасности, давайте познакомимся с основами.

Что такое контейнерная технология?

Контейнерная технология позволяет разработчикам или инженерам DevOps упаковывать приложение так, чтобы оно могло работать с зависимостями, изолированными от других процессов.

На рынке существует ряд контейнерных технологий, таких как Apache Mesos, lxc и Docker. Хотя они и относятся к категории контейнерных технологий, они функционируют по-разному.

Разница между VM и VE

Хост виртуальной машины полностью отличается от хоста виртуальной среды. На виртуальных машинах каждое контейнерное приложение поставляется со своим собственным набором библиотек и операционной системой, в то время как приложения по умолчанию на хосте виртуальной среды, таком как lxc, и Docker используют ядро Linux.

Что такое Докер?

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

Докер-движок

Docker Engine состоит из трех компонентов.

  • Сервер: этот компонент представляет собой длительный процесс или демон, отвечающий за управление изображениями и контейнерами.
  • REST API: этот интерфейс позволяет демону Docker и клиентскому инструменту Docker взаимодействовать.
  • Клиентский инструмент Docker: клиентский инструмент Docker использует компонент REST API для информирования демона Docker о необходимости работы с контейнерным приложением.

Доверенный реестр Docker

Docker Trusted Registry — это решение для хранения образов от Docker для корпоративных платформ. Он отличается от Docker Hub. В то время как Docker Hub размещается в облаке, доверенный реестр Docker представляет собой локальное решение для хранения данных для корпоративной версии Docker.

Доверие к содержимому Docker

Docker Content Trust предоставляет возможность использовать подписи данных для изображений, отправляемых и получаемых в и из удаленных реестров Docker, таких как Docker Hub.

Пространства имен Linux

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

Группы управления Linux (Cgroups)

Группы управления Linux — это функция ядра Linux, которая позволяет выделять такие ресурсы, как время процессора, пропускная способность сети, системная память и т. д., активным процессам на хосте.

Возможности

В Linux в подсистеме ядра есть функция безопасности, которую можно установить или применить для ограничения привилегированного процесса, например процесса, выполняемого пользователем с UID 1. Хотя привилегированные процессы или пользователи могут обходить разрешения на дискреционное управление доступом, они не могут обойти правила возможностей.

Теперь давайте сосредоточимся на безопасности.

Защита хоста Docker

В этом разделе мы рассмотрим, как защитить хост, на котором находится Docker.

Сканирование ядра Linux

Прежде чем разместить докер на платформе Linux, сначала необходимо проверить ядро. Существует несколько инструментов с открытым исходным кодом, таких как Lynis и OpenVAS, которые можно использовать для сканирования ядра Linux.

Скопируйте или клонируйте проект Lynis из Github с помощью команды git clone.

git-клон https://github.com/CISOfy/lynis.git

Затем используйте команду ниже, чтобы перейти в каталог lynis и провести аудит системы Linux.

компакт-диск Линис; ./lynis система аудита

Харден ядро Linux

После того как вы просканировали ядро Linux на наличие системных уязвимостей, вы можете добавить к ядру еще один дополнительный уровень защиты с помощью grsecurity. Он обеспечивает такие функции безопасности, как следующие.

  • Предотвращение использования переполнения буфера
  • /tmp предотвращение расовой уязвимости
  • /proc ограничения, которые не допускают утечки информации о владельцах процессов.
  • Предотвращение выполнения произвольного кода в ядре и так далее.

Первоначально вы можете бесплатно загрузить патчи с сайта grsecurity и применить их к своему текущему ядру. Но он больше не допускает бесплатных патчей.

Установите Docker на виртуальную машину

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

Защита root-прав

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

Чтобы предотвратить это, мы можем использовать следующую команду. Мы можем принять решение отказаться от таких возможностей, как setgid и setuid, чтобы другие программы или процессы не могли изменить свой GID на другой GID, что может привести к повышению привилегий. Вы также можете проверить здесь список определений возможностей Linux.

Приведенная ниже команда запускает контейнер веб-сервера Apache и удаляет возможности setgid и setuid с помощью —cap-drop, чтобы предотвратить изменение контейнером Apache своего GID и UID на другие UID и GID.

GID и UID в этом контексте относятся к идентификатору группы и идентификатору пользователя соответственно.

docker run -d —cap-drop SETGID —cap-drop SETUID apache

Пользователь Докера

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

Вы можете добавить или создать пользователя Docker, выполнив следующие действия:

sudo groupadd докер

Команда выше создает группу под названием docker.

Затем создайте пользователя, используя команду ниже:

sudo userдобавь Майка

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

sudo usermod -aG докер Майк

Управление контейнером с помощью Cgroups

В производственной среде у вас может быть более одного контейнера.

Если на вашем хосте не установлены группы cgroups, вы можете использовать следующую команду для их установки, а затем проверить здесь (для Ubuntu), как их настроить.

sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1

Мы можем распределить контейнеры по ограниченным ресурсам ЦП с помощью —cpu-shares и —cpuset-cpus.

В следующем примере команды показано, что процесс контейнера prodnginx выполняется только на первом ядре через —cpuset-cpus и выделяет 20 ЦП через —cpu-shares, в то время как процесс контейнера proxnginx выполняется на первых двух ядрах ЦП и ему также выделяется 20 процессоров. ПРОЦЕССОР.

docker run -d —name prodnginx —cpuset-cpus=0 —cpu-shares=20 nginx docker run -d —name testnginx —cpuset-cpus=2 —cpu-shares=20 nginx

Затем введите команду docker stats, чтобы просмотреть загрузку ЦП контейнерами prodnginx и testnginx.

ИДЕНТИФИКАТОР КОНТЕЙНЕРА НАЗВАНИЕ ЦП % ИСПОЛЬЗОВАНИЕ ПАМЯТИ/ОГРАНИЧЕНИЕ ПАМЯТИ % NET I/O BLOCK I/O 845bea7263fb prodnginx 57,69% 1,258 МБ / 985,2 МБ 0,13% 578B / 0B 1,33 МБ / 0B 189ba15e8258 testnginx 55,85% 1. 25МБ / 985,2МБ 0,13% 578b / 0Б 1,33 МБ / 0Б

Если на нем работает более одного контейнера, рекомендуется определить доли ЦП для хоста докера.

Управление контейнерами с помощью пространств имен

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

Мы можем включить пространство имен в докере, используя файлы /etc/subuid и /etc/subgid, как показано ниже.

  • создайте пользователя с помощью команды adduser

sudo adduser докремап

  • Настройте subuid для пользователя docremap.

sudo sh -c 'echo dockermap:400000:65536 > /etc/subuid'

  • Затем настройте subgid для пользователя docremap.

sudo sh -c 'echo dockermap:400000:65536 > /etc/subgid'

  • Откройте файл daemon.json и заполните его следующим содержимым, чтобы связать атрибут userns-remap с пользовательским dockremap.

vi /etc/docker/daemon.json { «userns-remap»: «dockremap» }

  • Нажмите :wq, чтобы сохранить и закрыть файл daemon.json и, наконец, перезапустить Docker, чтобы включить пространства имен на хосте Docker.

sudo /etc/init.d/docker перезапустить

Защита демона Docker

Также необходимо настроить демон Docker для обеспечения безопасной связи между клиентом Docker и демоном Docker через TLS.

Используйте следующую команду, чтобы открыть файл daemon.json, скопировать и вставить следующий контент (замените IP-адрес фактическим), как показано ниже.

vi daemon.json { «debug»: false, «tls»: true, «tlscert»: «/var/docker/server.pem», «tlskey»: «/var/docker/serverkey.pem», «hosts» : [«tcp://192.168.16.5:2376»] }

Защита компонентов Docker

Давайте посмотрим, как использовать такие инструменты, как CodeNotary и нотариальный сервер, для подписи изображений, чтобы избежать подделки изображений. Кроме того, также необходимо сканировать изображения, чтобы убедиться, что они не содержат уязвимостей.

Мы будем использовать нотариальный сервер Docker для подписи и проверки изображений, а также использовать Anchor Engine для сканирования изображений на наличие уязвимостей.

Проверка изображений с помощью нотариального сервера

Прежде чем мы сможем использовать нотариальный сервер для подписи изображений, нам необходимо загрузить и установить docker-compose. Мы будем использовать Docker Compose для настройки нотариального сервера.

  • Запустите команду ниже, чтобы загрузить последнюю версию Docker Compose.

sudo curl -L «https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)» -o /usr/local/ bin/docker-compose

  • Примените разрешения на исполняемый файл к файлу docker-compose, как показано ниже.

sudo chmod 700 /usr/local/bin/docker-compose

  • Вы можете проверить, успешно ли вы установили docker-compose, с помощью следующей команды

docker-compose —version

  • Теперь мы можем установить нотариальный сервер через docker-compose.

git-клон https://github.com/theupdateframework/notary.git

  • Приведенная выше команда клонирует или копирует нотариальный сервер из нотариального репозитория.
  • Запустите нотариальный сервер и подписывающую сторону с помощью команд ниже:

сборка docker-compose

  • Затем скопируйте сертификаты конфигурации и тестов в локальный нотариальный каталог, используя команду ниже.

mkdir -p ~/.notary && cp cmd/notary/config.json cmd/notary/root-ca.crt ~/.notary

  • Теперь выполните следующую команду, чтобы подключить нотариальный сервер к клиенту Docker.

экспорт DOCKER_CONTENT_TRUST=1 экспорт DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443

  • Создайте пару ключей делегирования с помощью команды ниже

Ключ доверия docker сгенерировать mike —dir ~./docker/trust

  • Теперь давайте создадим целевые новые ключи на случай, если репозиторий не существует.

подписывающее лицо docker add —key ~/.docker/trust/mike.pub mike mikedem0/whalesay

  • Затем вы можете подписать свой образ Docker, используя знак доверия команды Docker. Вам необходимо извлечь образ Docker из Docker Hub и повторно пометить его, используя команды docker pull и docker tag соответственно.

Знак доверия докера mikedem0/nginx: последний

Вы также можете сканировать образы Docker на наличие уязвимостей и ошибок конфигурации. Здесь вы можете узнать, как использовать Anchor Engine для сканирования уязвимостей и Docker Bench Security для проверки ошибок конфигурации.

Я надеюсь, что вышеизложенное даст вам представление о Docker безопасности для производственной среды. Вы также можете ознакомиться с этим курсом Udemy о взломе и защите контейнеров Docker.

Источник