UFW говорит «всё закрыто», а Postgres торчит наружу: пишем аудит портов для docker compose на Python
A post revisits a familiar incident in which a fresh VPS had UFW set to default deny incoming and only ports 22, 80 and 443 exposed, but a docker compose file later added a 5432:5432 port mapping. A couple of days later, a note with a bitcoin wallet was found in the database. The post says the cause has already been explained in detail and instead focuses on how to stop such a compose file from reaching the server at all. It proposes two small Python scripts.
На этой неделе в топе снова всплыла старая история: свежий VPS, ufw default deny incoming , наружу только 22, 80 и 443, а потом в compose-файле появляется ports: - "5432:5432" — и через пару дней в базе лежит записка с биткойн-кошельком. Почему так происходит, уже разобрали подробно. Я хочу про другое: как сделать так, чтобы такой compose-файл вообще не доехал до сервера. Ниже — два небольших скрипта на Python. Первый проверяет compose-файлы до деплоя и падает с ненулевым кодом, если порт опубликован на все интерфейсы. Второй смотрит, что реально слушает на машине, без ss и netstat , прямо из /proc . Весь код я запускал на Python 3.13 и PyYAML 6.0.3, вывод в статье — настоящий. Читать далее