Как не нужно запускать Docker контейнеры

Мне нравится доносить материал через собственные ошибки и этот пост не будет исключением.

Потребовалось поднять контейнер с базой данных PostgreSQL. Тогда я не был опытным пользователем linux и не много знал о Docker, особенно в области безопасности. Очевидно, это и стало причиной проблем, но обо всем по порядку.

База данных нужна была для работы сервисов в пределах одной машины. В ufw были разрешены только порты необходимые для https. По этому в параметрах запуска контейнера спокойно прописал порт: 5432:5432, тем самым пробросив порт за пределы контейнера, чтобы иметь доступ к базе данных из основной системы.

Решил не менять стандартные логин и пароль, ведь база данных будет доступна только внутри машины. Казалось нет смысла их менять.

Про права пользователя внутри контейнера я, конечно, ничего не знал, по этому запускал от имени root.

Опытные разработчики, наверное, уже испытывают испанский стыд. Совершенно не удивительно, что такая конфигурация привела к проблемам.

Что же случилось? Проснувшись на следующее утро, базы данных не оказалось. Её попросту стерли и оставили милое сообщение с требованием отправить деньги на указанный крипто-кошелек) А сама система была заражена майнером.

Далее пояснение для тех, кто еще не понял, почему так случилось.

Во-первых, такой проброс портов игнорирует настройки ufw и обращается напрямую к iptables. Так что от моего фаервола не было смысла, а порты базы данных благополучно торчали наружу, на всеобщее обозрение.

Во-вторых, решение не менять стандартные логин и пароль было крайне глупым. Даже если бы порты не торчали наружу, это все равно плохо. Обязательно и всегда меняйте их.

В-третьих, не запускайте приложения в контейнере от имени root и следите за правами пользователя. Именно из-за этой ошибки майнер смог пробраться за пределы контейнера, в основную систему.

Правильным было бы выделить базе данных отдельную сеть в рамках Docker и подключать к ней нужные сервисы. Но иногда нужно, чтобы база данных была доступна из основной системы, для этого можно прописать порты следующим образом: 127.0.0.1:5432:5432.

Вот такая неприятная история, когда-то давно, со мной приключилась.

P.S. Ни одна реальная система не пострадала, все эксперименты проводились на тестовом выделенном сервере.