Давайте посмотрим, как укрепить и обезопасить Docker в продакшен среде.
Несмотря на то, что Docker позволяет разработчикам программного обеспечения и инженерам DevOps быстро создавать и развертывать приложения, он также предоставляет большую площадку для атаки.
Мы рассмотрим, как защитить Docker на платформе Linux по следующим пунктам:
- Недостатки конфигурации
- Удаленное выполнение кода
- Переполнение буфера
- Подделка образа и так далее.
- Что такое технология контейнеров?
- Разница между VM и VE
- Что такое Docker?
- Docker Engine
- Доверенный реджестри Docker
- Docker Content Trust
- Пространства имен Linux
- Linux Control Groups(Cgroups)
- Capabilities
- Защита Docker хоста
- Сканирование ядра Linux
- Усиление безопасности ядра Linux
- Установите Docker на ВМ
- Защита привилегий root
- Пользователь Docker
- Управление контейнером с помощью Cgroups
- Управление контейнерами с пространствами имен
- Обеспечение защиты демона Docker
- Защита компонентов Docker
- Проверка образов с помощью Notary Server
Что такое технология контейнеров?
Эта технология позволяет разработчикам или инженерам 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
Пространства имен Linux
Linux Control Groups(Cgroups)
Capabilities
Хотя привилегированные процессы или пользователи могут обойти дискреционные разрешения контроля доступа, они не могут обойти правила capabilities.
Теперь давайте сосредоточимся на безопасности Docker.
Защита Docker хоста
В этом разделе мы рассмотрим, как защитить хост, на котором находится Docker.
Сканирование ядра Linux
Прежде чем разместить докер на платформе Linux, вам сначала нужно проверить ядро.
Существует несколько инструментов с открытым исходным кодом, таких как Lynis и OpenVAS, которые вы можете использовать для сканирования ядра Linux.
Скопируйте или клонируйте проект Lynis из Github с помощью команды git clone.
git clone https://github.com/CISOfy/lynis.git
Усиление безопасности ядра Linux
- Предотвращение эксплуатации переполнения буфера
- /tmp предотвращение уязвимости race
- Ограничения /proc, которые не пропускают информацию о владельцах процессов.
- Предотвращение выполнения произвольного кода в ядре и так далее.
Установите 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
Управление контейнерами с пространствами имен
sudo adduser dockremap
sudo sh -c 'echo dockremap:400000:65536 > /etc/subuid'
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
sudo chmod 700 /usr/local/bin/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 trust sign mikedem0/nginx:latest