Как небольшие правки в Docker уменьшат количество ваших проблем
Недавно занимался развертыванием одного проекта на сервере. Столкнулся с проблемой, что проект начал периодически отваливаться. Сначала по логам я не понимал, в чем проблема (пример логов скинул на скриншоте).
Начал искать проблему в подключении к базе данных: в коде, в .env, в Docker. Но проблема оставалась.
Через некоторое время я вспомнил рассказ своего коллеги про похожий случай, в котором его проект тоже в какой-то момент упал из-за брутфорс-атаки. Далее он рассказал про злоумышленников, которые сканируют IP в сети и ищут открытые порты на сервере. После используя brute-force, пытаются подобрать креды для получения доступа к сервису.
Сделав предположение, что проблема в этом, я заглянул в свой docker-compose и увидел следующее:
...
postgres:
image: postgres:15
container_name: product_cards_postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres123
POSTGRES_DB: product_cards
volumes:
- postgres_data:/var/lib/postgresql/data
...
Здесь мы видим сразу несколько ошибок, которые я допустил:
1. Секция ports: "5432:5432".
Приложение было открыто для подключений с любого устройства в интернете. Поэтому тот самый подбор в целом мог сделать любой бот-сканнер.
2. Секция environment: POSTGRES_USER, POSTGRES_PASSWORD.
Здесь я думаю даже комментировать не нужно. Сразу после локального тестирования пытаться такое заливать на сервер - большая ошибка. Тот самый подбор тут срабатывал отлично. Стоило произвести всего лишь базовый перебор наиболее популярных паролей.
После этого я исправил эти грубые ошибки безопасности.
Для этого я закрыл доступ извне, убрав секцию ports (сервисы, которые запущены в одном compose вместе с этой БД - находятся в одной сети).
Еще это можно сделать, разрешив подключения к базе только внутри самого сервера:
...
ports:
- "127.0.0.1:5432:5432"
...
Также я поменял логин и пароль на более сложные.
И естественно после этого ошибки с
FATAL: password authentication failed for user "postgres" перестали появляться =)
Из этого случая вынес урок: после локальной разработки, при развертывании, не стоит оставлять "двери" (порты) открытыми, а пароль и логин - простыми. Возможно, эти вещи кажутся банальными, но зато я сам убедился, к чему приводит их игнорирование.
Максим Максимов // IT, AI
Недавно занимался развертыванием одного проекта на сервере. Столкнулся с проблемой, что проект начал периодически отваливаться. Сначала по логам я не понимал, в чем проблема (пример логов скинул на скриншоте).
Начал искать проблему в подключении к базе данных: в коде, в .env, в Docker. Но проблема оставалась.
Через некоторое время я вспомнил рассказ своего коллеги про похожий случай, в котором его проект тоже в какой-то момент упал из-за брутфорс-атаки. Далее он рассказал про злоумышленников, которые сканируют IP в сети и ищут открытые порты на сервере. После используя brute-force, пытаются подобрать креды для получения доступа к сервису.
Сделав предположение, что проблема в этом, я заглянул в свой docker-compose и увидел следующее:
...
postgres:
image: postgres:15
container_name: product_cards_postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres123
POSTGRES_DB: product_cards
volumes:
- postgres_data:/var/lib/postgresql/data
...
Здесь мы видим сразу несколько ошибок, которые я допустил:
1. Секция ports: "5432:5432".
Приложение было открыто для подключений с любого устройства в интернете. Поэтому тот самый подбор в целом мог сделать любой бот-сканнер.
2. Секция environment: POSTGRES_USER, POSTGRES_PASSWORD.
Здесь я думаю даже комментировать не нужно. Сразу после локального тестирования пытаться такое заливать на сервер - большая ошибка. Тот самый подбор тут срабатывал отлично. Стоило произвести всего лишь базовый перебор наиболее популярных паролей.
После этого я исправил эти грубые ошибки безопасности.
Для этого я закрыл доступ извне, убрав секцию ports (сервисы, которые запущены в одном compose вместе с этой БД - находятся в одной сети).
Еще это можно сделать, разрешив подключения к базе только внутри самого сервера:
...
ports:
- "127.0.0.1:5432:5432"
...
Также я поменял логин и пароль на более сложные.
И естественно после этого ошибки с
FATAL: password authentication failed for user "postgres" перестали появляться =)
Из этого случая вынес урок: после локальной разработки, при развертывании, не стоит оставлять "двери" (порты) открытыми, а пароль и логин - простыми. Возможно, эти вещи кажутся банальными, но зато я сам убедился, к чему приводит их игнорирование.
Максим Максимов // IT, AI