Безопасное развертывание с Docker Compose + Ubuntu
В стартапах Кремниевой долины Docker Compose является одним из предпочтительных инструментов для быстрого развертывания и управления контейнерными приложениями. Однако удобство часто сопряжено с рисками безопасности. Как инженер по надежности сайта (SRE), я прекрасно осознаю, что уязвимости безопасности могут привести к катастрофическим последствиям. В этой статье я поделюсь лучшими практиками безопасности, которые я обобщил в своей реальной работе, сочетая Docker Compose с системами Ubuntu, помогая вам наслаждаться удобством Docker Compose, обеспечивая при этом безопасность системы.
I. Укрепление безопасности системы Ubuntu
Перед развертыванием контейнеров крайне важно обеспечить безопасность самой хост-системы Ubuntu. Вот несколько ключевых шагов:
1. Регулярное обновление Ubuntu и Docker
Убедитесь, что как система, так и Docker постоянно обновляются для исправления известных уязвимостей:
sudo apt update && sudo apt upgrade -y
sudo apt install docker-ce docker-compose-plugin
2. Ограничение прав управления Docker
Строго контролируйте права управления Docker, чтобы предотвратить атаки с повышением привилегий:
sudo usermod -aG docker deployuser
# Предотвратить легкое получение обычными пользователями прав управления Docker
3. Настройка брандмауэра Ubuntu (UFW)
Разумно ограничьте сетевой доступ, чтобы предотвратить несанкционированный доступ:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
4. Правильная настройка взаимодействия Docker и UFW
По умолчанию Docker обходит UFW для настройки iptables, поэтому рекомендуется ручное управление:
Измените файл конфигурации Docker:
sudo nano /etc/docker/daemon.json
Добавьте следующее содержимое:
{
"iptables": false,
"ip-forward": true,
"userland-proxy": false
}
Перезапустите службу Docker:
sudo systemctl restart docker
Явно привяжите адреса в Docker Compose:
services:
webapp:
ports:
- "127.0.0.1:8080:8080"
II. Лучшие практики безопасности Docker Compose
Следующие конфигурации применимы к Docker Compose v2.4 и выше. Обратите внимание на различия между режимами без Swarm и Swarm.
1. Ограничение прав контейнера
Контейнеры, работающие от имени root по умолчанию, представляют высокие риски; переключитесь на пользователей без прав root:
services:
app:
image: your-app:v1.2.3
user: "1000:1000" # Пользователь без прав root
read_only: true # Файловая система только для чтения
volumes:
- /tmp/app:/tmp # Монтируйте определенные каталоги, если требуется доступ для записи
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
Пояснение:
- Файловая система только для чтения предотвращает несанкционированное изменение внутри контейнера.
- Убедитесь, что монтируемые тома ограничены необходимыми каталогами.
2. Сетевая изоля ция и управление портами
Точно разделите внутренние и внешние сети, чтобы избежать exposing чувствительных сервисов общественности:
networks:
frontend:
internal: false
backend:
internal: true
services:
nginx:
networks: [frontend, backend]
database:
networks:
- backend
- Сеть Frontend: Может быть открыта для публичного доступа.
- Сеть Backend: Строго ограничена, только для внутренней связи.
3. Безопасное управление секретами
Конфиденциальные данные никогда не должны размещаться непосредственно в файлах Compose:
В одномашинном режиме:
services:
webapp:
environment:
- DB_PASSWORD_FILE=/run/secrets/db_password
volumes:
- ./secrets/db_password.txt:/run/secrets/db_password:ro
В режиме Swarm:
services:
webapp:
secrets:
- db_password
environment:
DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
db_password:
external: true # Управляется через встроенное управление Swarm
Примечание:
- Встроенные секреты Docker Swarm не могут напрямую использовать внешние инструменты, такие как Vault или AWS Secrets Manager.
- Если требуется внешнее хранилище секретов, интегрируйте процесс чтения самостоятельно.
4. Ограничение ресурсов (адаптируйте к версии Docker Compose)
Ограничения ресурсов контейнера предотвращают исчерпание ресурсов хоста одним контейнером.
Режим Docker Compose для одной машины (рекомендуется v2.4):
version: "2.4"
services:
api:
image: your-image:1.4.0
mem_limit: 512m
cpus: 0.5
Режим Docker Compose Swarm (v3 и выше):
services:
api:
deploy:
resources:
limits:
cpus: "0.5"
memory: 512M
reservations:
cpus: "0.25"
memory: 256M
Примечание: В средах без Swarm ограничения ресурсов в разделе
deployне действуют, обязательно обращайте внимание на версию файла Compose.
5. Проверки работоспособности контейнеров
Настройте проверки работоспособности, чтобы заблаговременно выявлять проблемы и сокращать время простоя сервиса:
services:
webapp:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
6. Избегайте использования тега Latest
Избегайте неопределенности, связанной с тегом latest в производственных средах, используйте конкретные версии образов:
services:
api:
image: your-image:1.4.0
7. Правильное управление журналами
Предотвратите исчерпание дискового пространства журналами контейнеров:
services:
web:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"