Docker на Debian / Ubuntu без соблюдения параметров ufw firewall с открытыми портами
Docker обходит настройки ufw firewall и подвергает порты внешнему миру, что является очень серьезной утечкой информации.
Еще одна неожиданная проблема Docker . В предыдущем сообщении я описывал, почему и как вы должны заставить Docker использовать subnet, чтобы предотвратить неожиданные изменения в сети с такими последствиями, как прекращение работы почты.
Это сообщение о Docker не соответствует параметрам firewall , по крайней мере при запуске Debian / Ubuntu и ufw (Q4_537_TNEEKALPER). Docker не говорит вам об этом и обнажает порты, поэтому такое поведение совершенно неожиданно.
Мой сервер ISPConfig работает под управлением Debian Stretch. Я использую ufw в качестве firewall, ниже приведены основные настройки.
ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
8080/tcp ALLOW IN Anywhere
25 ALLOW IN Anywhere
Как видите, все входящие соединения заблокированы, за исключением нескольких разрешенных.
Мои веб-приложения Docker Python используют сервер Gunicorn WSGI HTTP для обслуживания приложения Python Flask . Nginx работает на хосте и конфигурируется как обратный proxy для этих приложений. Работает как шарм. В файле docker-compose.yml порты загружаются из файла .env:
services:
web:
...
env_file:
- ./.env
ports:
- "${SERVER_PORT_HOST}:${SERVER_PORT_CONTAINER}"
Для одного приложения .env файл содержит эти строки:
SERVER_PORT_HOST=8001
SERVER_PORT_CONTAINER=8001
Таким образом, фактически используется строка docker-compose :
ports:
- "8001:8001"
Проблема: Docker порт 8001 подвергается воздействию внешней сети, даже если ufw настроен на блокировку входящих соединений.
Это означает, что приложение/сервис Docker также отображается на <SERVER-IP>:8001. Это не только очень плохо, но и совершенно неожиданно, поскольку ufw был настроен на блокировку всех входящих соединений.
Решения
Для этого есть несколько решений, здесь я выбираю привязку порта к хост-машине. Тогда строки docker-compose.yml становятся:
ports:
- "127.0.0.1:8001:8001"
Это работает на меня.
Другими способами решения этой проблемы являются предотвращение того, чтобы Docker связывался с firewall, добавление правил в файл ufw /etc/ufw/ After.rules и т.д. См. ссылки ниже.
Резюме
Некоторые люди рассматривают поведение Docker как ошибку, и я могу только согласиться с этим. Ufw - это программа firewall, очень важная для управления безопасностью. Ufw очень широко используется и если другая программа обходит свое поведение, пользователь должен быть проинформирован. До тех пор пока это не будет исправлено, как минимум Docker должен выдавать большое предупреждающее сообщение при запуске приложения.
Ссылки / кредиты
Be careful with Docker ports!
https://dev.to/kovah/be-careful-with-docker-ports-3pih
Docker service exposed publicly though made to expose ports to localhost only
https://stackoverflow.com/questions/50621936/docker-service-exposed-publicly-though-made-to-expose-ports-to-localhost-only
Docker services only available to the local host
https://stackoverflow.com/questions/54261105/docker-services-only-available-to-the-local-host
How to fix the Docker and UFW security flaw
https://www.techrepublic.com/article/how-to-fix-the-docker-and-ufw-security-flaw/
The dangers of UFW + Docker
https://blog.viktorpetersson.com/2014/11/03/the-dangers-of-ufw-docker.html
What is the best practice of docker + ufw under Ubuntu
https://stackoverflow.com/questions/30383845/what-is-the-best-practice-of-docker-ufw-under-ubuntu
Подробнее
Docker
Оставить комментарий
Комментируйте анонимно или войдите в систему, чтобы прокомментировать.
Комментарии (1)
Оставьте ответ
Ответьте анонимно или войдите в систему, чтобы ответить.
Ein wirklich schweres und immer noch aktuelles Sicherheitsproblem. Danke für die schnelle Lösung für Docker Compose.
Недавний
- Скрытие первичных ключей базы данных UUID вашего веб-приложения
- Don't Repeat Yourself (DRY) с Jinja2
- SQLAlchemy, PostgreSQL, максимальное количество строк для user
- Показать значения в динамических фильтрах SQLAlchemy
- Безопасная передача данных с помощью шифрования Public Key и pyNaCl
- rqlite: альтернатива dist с высокой степенью готовности и SQLite
Большинство просмотренных
- Используя Python pyOpenSSL для проверки SSL-сертификатов, загруженных с хоста
- Использование UUID вместо Integer Autoincrement Primary Keys с SQLAlchemy и MariaDb
- Подключение к службе на хосте Docker из контейнера Docker
- Использование PyInstaller и Cython для создания исполняемого файла Python
- SQLAlchemy: Использование Cascade Deletes для удаления связанных объектов
- Flask Удовлетворительный запрос API проверка параметров запроса с помощью схем Маршмэллоу