🐳 Как защитить Docker в производственной среде?

Мануал
Давайте посмотрим, как укрепить и обезопасить Docker в продакшен среде.

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

Мы рассмотрим, как защитить Docker на платформе Linux по следующим пунктам:

  • Недостатки конфигурации
  • Удаленное выполнение кода
  • Переполнение буфера
  • Подделка образа и так далее.
Мы будем использовать следующие инструменты, такие как Docker’s notary server для подписи образов и Docker bench security  для проверки хоста, настройки демона и так далее.
Прежде чем приступить к обеспечению безопасности, давайте коснемся основ.

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

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

Сейчас на рынке есть ряд контейнерных технологий, таких как Apache Mesos, Rocket, lxc и Docker.

Хотя все они относятся к категории контейнерных технологий, они функционируют по-разному.

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

Хост виртуальной машины полностью отличается от хоста виртуальной среды.

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

Что такое Docker?

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

Docker Engine

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

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

Доверенный реджестри Docker

Docker Trusted Registry – это решение для хранения образов Docker для бизнеса на платформе предприятия.

Он отличается от docker-hub.

В то время как Docker-hub размещается в облаке, доверенный реестр является локальным решением для хранения данных для корпоративной версии Docker.

Docker Content Trust

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

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

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

Linux Control Groups(Cgroups)

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

Capabilities

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

Хотя привилегированные процессы или пользователи могут обойти дискреционные разрешения контроля доступа, они не могут обойти правила capabilities.

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

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

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

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

Прежде чем разместить докер на платформе Linux, вам сначала нужно проверить ядро.

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

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

git clone https://github.com/CISOfy/lynis.git

 Усиление безопасности ядра Linux

После того, как вы проверили ядро Linux на наличие системных уязвимостей, вы можете добавить еще один дополнительный уровень защиты к ядру с помощью grsecurity.
Он обеспечивает следующие функции безопасности:
    
  • Предотвращение эксплуатации переполнения буфера
  • /tmp предотвращение уязвимости race
  • Ограничения /proc, которые не пропускают информацию о владельцах процессов.
  • Предотвращение выполнения произвольного кода в ядре и так далее.
Изначально вы могли бесплатно скачать патчи с grsecurity и применить их к вашему текущему ядру.
Но теперь они не бесплатные.

Установите Docker на ВМ

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

Защита привилегий 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, вместо управления им через суперпользователя.

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

sudo groupadd docker

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

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

sudo useradd mike
Наконец, используйте команду, показанную ниже, чтобы добавить пользователя mike в группу docker для управления операциями.
sudo usermod  -aG docker mike

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

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

Если на вашем хосте не установлены cgroups, вы можете использовать следующую команду, чтобы установить пакеты:

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 CPU

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

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O
845bea7263fb        prodnginx            57.69%              1.258MiB / 985.2MiB   0.13%               578B / 0B           1.33MB / 0B
189ba15e8258        testnginx            55.85%              1.25MiB / 985.2MiB    0.13%               578b / 0B           1.33MB / 0B
Рекомендуется определять общие ресурсы ЦП для хоста Docker, когда на нем запущено несколько контейнеров.

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

Пространство имен может препятствовать запуску контейнеров в качестве привилегированных пользователей, что может помочь избежать атак на повышение привилегий.
Мы можем включить пространство имен в Docker, используя файлы /etc/subuid и /etc/subgid, как показано ниже.
Cоздйате пользователя с помощью команды adduser
sudo adduser dockremap
Настройте subuid для пользователя dockremap
sudo sh -c 'echo dockremap:400000:65536 > /etc/subuid'

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

sudo sh -c 'echo dockremap: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  restart

Обеспечение защиты демона 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 и notary server, для подписи образов, чтобы избежать подделки образов.

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

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

Проверка образов с помощью Notary Server

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

Мы будем использовать Docker Compose для настройки notary server.

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
Теперь мы можем установить notary server через docker-compose.
git clone https://github.com/theupdateframework/notary.git

Приведенная выше команда клонирует или копирует notary server из репозитория

Запустите его с помощью следующих команд:

docker-compose build
docker-compose up -d

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

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

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

export   DOCKER_CONTENT_TRUST=1
export  DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
Сгенерируйте пару ключей делегирования с помощью команды ниже

docker trust key generate mike --dir ~./docker/trust
Теперь давайте создадим новые целевые ключи в случае, если репозитория не существует
docker trust signer add --key ~/.docker/trust/mike.pub mike mikedem0/whalesay
Затем вы можете подписать свой обр, используя docker trust sign.
Вам нужно извлечь образ из Docker hub и стэгировать его, используя команды docker pull и docker tag соответственно.
docker trust sign mikedem0/nginx:latest
 Вы также можете сканировать образы  на наличие уязвимостей и недостатков конфигурации.
Вы можете посмотреть здесь, чтобы узнать, как использовать Anchor Engine для поиска уязвимостей и Docker Bench Security для проверки недостатков конфигурации.

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