Если вдруг в вашем docker-compose.yml порты объявлены так:
ports: - "5432:5432"
…это привязка к 0.0.0.0 - то есть порт торчит наружу на всех интерфейсах. Проблема в том, что Docker прописывает свои правила прямо в iptables, в обход UFW. Ваш файрвол честно «закрыт», а порт на самом деле открыт всему интернету.
Проверить просто. Посмотрите, на каких интерфейсах реально слушается порт внутри ОС::
ss -tlnp | grep 5432
# или через docker: docker port <container_name>
Если в выводе 0.0.0.0:5432 вместо 127.0.0.1:5432 - порт открыт наружу.
Исправление - одна строка (явно укажите localhost, чтобы Docker слушал только loopback-интерфейс, и порт оставался доступным только внутри хоста):
ports:
- "127.0.0.1:5432:5432"
Docker будет слушать только на loopback, и порт останется доступным только с хоста.
Почему сканеры не помогут
Паттерн "5432:5432" без явного 127.0.0.1: - это слепое пятно для Trivy, Checkov, Semgrep и Snyk. Ни один из них не флагует такой биндинг как эксплойт, потому что это мисконфиг а не уязвимость. Рассчитывать на CI-сканеры в этом случае нельзя - проверять нужно глазами или кастомным правилом.
Еще одна поучительная история из жизни с Linux, специально чтобы вы потеряли сон и покой, узнав что такое вообще возможно.
Тот самый баг, смотрит на вас с экрана.
Вводная
Эмм с чего бы такого начать, чтобы не испугать раньше времени и не заставить устанавливать *BSD.
Есть на свете одна компания, которой мы помогаем с ИТ и есть у нее несколько виртуальных серверов на Ubuntu Linux, используемых для половых утех разработки и тестирования.
Ubuntu там использовалась нормальной (для сервера) LTS‑версии, но в какой‑то момент — в погоне за патчами безопасности ее обновили до текущей.
Не совсем «текущей-текущей», которую используют разработчики Ubuntu для обкатки новых версий дистрибутива, а просто без долгой поддержки — примерно то, что ставят себе обычные пользователи Ubuntu Linux на домашние компьютеры.
Все происходило летом 2025 года, поэтому речь про версию 25.04 Ubuntu Linux, которая использует ядро 6.14 (запомните этот важный момент):
Баг
Однажды сисадмин компании-заказчика заметил слишком частую и сильную нагрузку на CPU, создаваемую процессом snapd, который является частью пакетного менеджера Snap.
Скриншот был взят из сети, поэтому «шакальего» качества;)
Эта проблема с перегрузкой CPU для snapd мягко говоря не нова — «проклятый snapd» гадил линуксоидам с момента своего появления на свет и вообще видимо был не придуман а ниспослан свыше, в качестве кары за грехи.
Нет, это не осеннее обострение, дело происходило летом.
Разумеется первым делом были опробованы стандартные методы решения, вроде снижения частоты проверок обновлений или полного отключения проклятого сервиса:
Отдельно порадовал ответ ИИ:
Дословно «снести и использовать что-то другое» — первый разумный совет от машины за всю историю развития искусственного интеллекта.
Дальнейшие изыскания привели в багтрекер snapd к упомянутому багу, где уже третий комментарий от разработчика snapd, с приложенной трассировкой вызовов показал что проблема именно в ядре:
Тут стоит добавить, что почти сразу встал вопрос проверки бага на локальной машине, поскольку на момент изучения ситуации локально все успело неоднократно обновиться, а отлаживать ядро Linux на сервере заказчика все же не очень хорошая затея.
Чуть ниже по переписке видно, что баг особо ярко проявляется на ноутбуке, работающем от батареи:
Так что решено было пробовать отловить именно в таких условиях.
На счастье, на машине осталась сборка 6.14 версии ядра с патчами от Xanmod, которая использовалась для статьи про l9ec.
В последние годы в проекте ядра Linux выпускается сильно много промежуточных релизов, поэтому на какой именно версии внутри 6.14 ветки что-то пошло не так еще пришлось выяснять:
Обратите внимание на загрузку CPU и блокировку выхода из приложения
Как видите, в очередной раз проблема прикладного сервиса уперлась в ядро операционной системы.
Патч целиком находится тут, место исправления выглядит как-то так:
Да, как видите ситуацию радикально исправляет буквально пара символов логической конструкции, главное знать где исправлять.
Текущее состояние
Формально проблема была решена еще летом этого года, патч попал в mainline и пакет с обновлением ядра от команды Ubuntu:
На осень 2025 года даже стабильная версия ядра Linux уже имеет версию 6.16 — т. е. паровоз разработки уехал очень далеко вперед от описываемых проблем:
Так что на момент написания данной статьи вы (по идее) не должны столкнуться с данной проблемой, а если и столкнетесь — все легко решается банальным обновлением версии ядра из пакетов дистрибутива.
При подозрении на описанный баг — попробуйте собрать тестовое приложение (см. выше) и запустить в своем окружении.
Если начнется 100% загрузка CPU запущенным процессом — проблема точно есть, поскольку в ядрах с патчем поведение тестового приложения отличается:
В исправленном ядре тестовое приложение немедленно завершится.
Что касается заказчика, поскольку решение а затем и патч были опубликованы довольно оперативно — раньше чем нам сообщили о проблеме, на время разборок с согласованиями и попаданием в mainline ядра, мы банальным образом перенесли патч вручную в ту версию ядра, которая использовалась на сервере.
Позже обновили уже штатными средствами дистрибутива до текущей актуальной версии.
Эпилог
Если вы не являетесь разработчиком ядра и не пишете патчи каждый день, засыпая в обнимку с отладчиком — т. е. далеки от реалий системного программирования, то из этой статьи сможете вынести несколько интересных выводов и внезапных открытий:
1. Linux — могила, *BSD - сила
Шучу, разумеется неподготовленным пользователям в BSD-системы лучше не лезть совсем, но задуматься (или хотя-бы просто знать) о реалиях функционирования Linux все же стоит. Чтобы факт выноса мозга ядру из прикладного ПО не стал для вас неприятным сюрпризом.
2. Граница между прикладкой и системной разработкой весьма абстрактна
Проще говоря — ее нетсовсем и в любой произвольный момент времени у вас есть неиллюзорный шанс наткнуться на баг ядра, даже программируя на JavaScript в браузере.
3. Любой уважающий себя сисадмин и DevOps должны знать С
Пусть на самом примитивном уровне, но хотя-бы собрать и запустить тестовое приложение, демонстрирующее проблему надо уметь. К сожалению все глубокие изыскания по теме «где оно тормозит» или «почему оно упало» рано или поздно приводят к коду на С и отладчику ядра.
И поверьте моему печальному опыту:
изучать эти штуки лучше днем и в спокойной обстановке, а не в режиме аврала и поздно ночью на работе в выходной день.
4. Считайте деньги, хотя-бы иногда
Описанная в статье проблема случилась в локализованном окружении (на собственных физических серверах компании), но точно такая же Ubuntu используется и облачными провайдерами вроде Amazon, где есть тарификация за использование ресурсов, в первую очередь CPU.
Как нетрудно догадаться, 100% загрузка процессора с интервалом в пять минут в облаке, если ее вовремя не заметить и не исправить — больно отразится на счете, который вам потом выставят.
Так что проверяйте загруженность, пиковых 100% в современных системах быть не должно, если только вы целенаправленно не занимаетесь вычислительными задачами.
В копилку стабильности — и с конкретным обновлением под капотом.
Во время работы с высокопроизводительными серверами на Ryzen 7950X нашли причину редких зависаний нод. На старом ядре Ubuntu 22.04 эти процессоры могли работать нестабильно.
Это могло обернуться внезапной недоступностью виртуальных машин, хотя с самими проектами все было в порядке.
Чтобы устранить проблему, обновили ОС и ядро на всех Ryzen-серверах в московской локации.
Переезд выполнили поэтапно: сначала подняли резервные серверы, перенесли на них проекты и только потом приступили к обновлению основных хостов. Поэтому пользователи не столкнулись с простоем.
Теперь гипервизоры работают на новом ядре, а риски возможных зависаний нод осталась в прошлом.
Если вам нужны мощные серверы в Москве, есть еще одна новость — расширили парк Ryzen 7950X, чтобы было больше доступных конфигураций под ваши проекты.
Главной премьерой вечера стал огромный 116-дюймовый телевизор Hisense 116UX. Удивляли гостей не только размеры экрана — компания решила отказаться от привычной презентации.
Технологии на языке искусства
Новую линейку телевизоров компания представила в формате арт-галереи. Вместо привычных стендов — тематические инсталляции, вместо списка характеристик — пространство, где технологии можно увидеть и услышать.
Все это — чтобы показать, насколько яркими и живыми могут быть цвета, как выглядит глубокий черный и на что способна встроенная акустика. Над экранами разместили большие художественные полотна, которые продолжали происходящее на дисплеях.
Новые модели от Hisense
На презентации продемонстрировали несколько моделей новой линейки — UR8S, UR9S и флагманский Hisense 116UX.
Особенность новинок — технология RGB MiniLED. Теперь телевизор точнее управляет цветом и светом, поэтому изображение выглядит ярче, контрастнее и естественнее.
Менеджер по продуктам ТВ- и аудиокатегории Hisense Шон Ли:
«Запуск технологии RGB Mini-LED на российском рынке является новым этапом в развитии Hisense. Мы задали новый стандарт визуального опыта, который уже получил признание на глобальном уровне».
Больше всего внимания собрал Hisense 116UX. Это телевизор с трехметровой диагональю. На таком экране особенно хорошо заметны детали: яркие сцены остаются насыщенными, темные — глубокими, а изображение выглядит объемным и живым. За качество картинки отвечает фирменный процессор Hisense, а встроенная многоканальная акустика создает эффект домашнего кинотеатра без дополнительных колонок.
Вместо лекций — живое общение
Для любителей игр организовали отдельную зону. К телевизорам подключили консоли, чтобы гости могли проверить, как новинки ведут себя в динамике.
Организаторы отказались и от длинных технических презентаций. Гости переходили между зонами, сравнивали модели, задавали вопросы специалистам и тестировали телевизоры в удобном для себя темпе.
Линейка уже поступила в продажу. Доступны модели UR8S в нескольких размерах экрана, серия UR9S и флагманский 116UX. Телевизоры можно приобрести у крупных российских ритейлеров и на популярных маркетплейсах.
Возникла необходимость перенести Kaspersky Security Center 16 с Windows на Ubuntu, и возникли проблемы. Инструкции на сайте Каспера — кривой, бесполезный кусок говна. Нейронки тоже не справились с помощью. На данный момент развернут сервер Ubuntu 24.04, введен в домен AD, установлен сервер KAC и Web Console. Веб-морда грузится, даже нафиг ненужное нововведение в виде обязательной двойной авторизации работает.
Проблема в том, что сервер Каспера не опрашивает домен (только через точки распространения). Нет пункта «Единый вход», чтобы настроить авторизацию под доменными учетками. Может, у кого-то есть нормальная, собранная инструкция, или кто-то сталкивался с такой проблемой — помогите, пожалуйста, уже голова кипит.
Контейнеры обеспечивают нам изоляцию, но по умолчанию они используют ядро хоста напрямую. А это значит, что общая поверхность атаки остается куда шире, чем многие думают. AppArmor (и его родственник SELinux, о котором мы поговорим как-нибудь позже) позволяет применять мандатный контроль доступа (MAC) на уровне приложений. Используя его связке с Podman или Docker, вы можете кардинально урезать возможности скомпрометированного процесса внутри контейнера по отношению к хост-системе.
В этом посте разберем процесс генерации рабочего профиля, его принудительного применения, отладки нарушений и чистой интеграции с вашей средой выполнения контейнеров - и всё это на базе типичной системы Debian/Ubuntu.
Зачем нужен AppArmor для контейнеров?
Казалось бы, ну ведь стандартные среды выполнения контейнеров уже дропают возможности (capabilities) и используют seccomp, нафига AppArmor? Но AppArmor добавляет к этому правила на основе путей и отслеживания возможностей, которые легко аудировать. Профиль может:
Запретить запись в чувствительные пути хоста, даже если внутри контейнера процесс запущен от root.
Ограничить разрешенные системные вызовы и операции с файлами сверх того, что предоставляет рантайм.
Выдавать вам понятные человеку логи, когда что-то пытается выбраться из своей «песочницы».
В Ubuntu AppArmor включен по умолчанию, а в Debian и Arch его активация - дело пары пустяков.
Генерируем первый профиль
Для начала установим инструменты (пример для Debian/Ubuntu):
Переведем целевое приложение в режим обучения (complain mode), чтобы понаблюдать за его реальным поведением:
sudo aa-genprof podman # или docker, или имя вашего бинарника
Утилита aa-genprof запускает программу в режиме обучения и следит за логами. Теперь запустите ваш контейнер в обычном рабочем режиме:
podman run --rm -it nginx:alpine sh
Погоняйте контейнер в хвост и в гриву (поустанавливайте пакеты, позаписывайте файлы и т.д.). Затем выйдете из него и позвольте утилите aa-logprof провести вас по процессу создания правил.
Минимальный готовый профиль (/etc/apparmor.d/podman-nginx) может выглядеть примерно так:
# Запрещаем доступ на запись к большей части /proc и /sys по умолчанию
deny /proc/** w,
deny /sys/** w,
# Разрешаем только конкретное чтение при необходимости
/proc/cpuinfo r,
/proc/meminfo r,
# Бинарник вашего приложения и библиотеки
/usr/sbin/nginx mr,
/usr/lib/nginx/** mr,
# Обработка сигналов
signal (receive) set=term,
# Запрещаем всё остальное по умолчанию
deny /** wl,
}
Инструмент aa-logprof шаг за шагом проведет вас по каждому залогированному событию и позволит выбрать: разрешить его, запретить или проигнорировать.
Принудительное применение профиля в Podman
У Podman отличная интеграция с AppArmor. Запустите контейнер следующим образом:
podman run --security-opt apparmor=podman-nginx -p 8080:80 nginx:alpine
Убедитесь, что профиль действительно загружен:
sudo aa-status | grep podman-nginx
Вы должны увидеть его в режиме enforce (принудительное исполнение).
Для Docker (если вы всё еще его используете):
docker run --security-opt apparmor=podman-nginx nginx:alpine
Отладка и итерация
Если что-то ломается, проверьте логи ядра:
sudo dmesg | grep apparmor
# или
sudo journalctl -xe | grep apparmor
Затем снова воспользуйтесь интерактивным профилировщиком:
sudo aa-logprof
Он покажет, какого именно правила не хватало. Типичный сценарий: нужно добавить конкретный путь вида /run/… или /tmp/…, который легитимно требуется вашему приложению.
В продакшене вы можете временно переключить профиль в режим обучения (complain):
sudo aa-complain /etc/apparmor.d/podman-nginx
После настройки верните всё обратно в режим принудительного исполнения:
sudo aa-enforce /etc/apparmor.d/podman-nginx
С чего начать изучение
Запускайте каждый новый образ контейнера с автоматически сгенерированным профилем в режиме обучения (complain) на протяжении недели.
Храните профили в Git рядом с вашими манифестами развертывания.
Сочетайте это с флагом --cap-drop=ALL и строгим профилем seccomp для эшелонированной защиты.
Периодически используйте утилиту aa-unconfined, чтобы находить процессы, которые работают без ограничений.
Параметры безопасности Podman: man podman-run (ищите по ключевому слову apparmor)
Man-страницы для aa-genprof(8), aa-logprof(8) и apparmor(7)
Профили AppArmor относятся к той категории инструментов, которые настраиваются один раз и довольно долго не меняются (если конечно хорошо к этому подойти в первый раз). Первоначальные вложения времени в изучение aa-logprof окупятся в первый же раз, когда вы поймаете контейнер на попытке сделать то, чего он делать не должен.
Если вы уже гоняете Podman или Docker в продакшене без кастомных профилей AppArmor, то это одно из самых высокодоходных (с точки зрения ROI) улучшений безопасности, которые вы можете сделать на этой неделе. Начните с одного критически важного сервиса и двигайтесь дальше.
Чтобы поднять сервер, базу и бакет под новый проект — можно просто создать AI-агента в связке с Timeweb Cloud MCP. Пишете агенту, что нужно, он запрашивает подтверждение и после вашего разрешения берется за работу.
Причем наш MCP можно подключить и к стороннему агенту — например, Cursor, Claude или своему боту. Подробнее про подключение → в доке.
Из последних апдейтов — открыли для MCP почти весь публичный API. Доступны все методы, кроме удаления, добавим их позже.
Что вы можете поручить агенту в связке с Timeweb Cloud MCP:
Запустить инфраструктуру с нуля
Создай сервер на Ubuntu 24.04 с 4 ГБ RAM в Москве для тестов
Мониторить работу
Покажи список серверов и их статус, а еще оцени состояние кластера
Собрать контур под проект
Создай балансировщик и добавь в него 2 сервера, а потом настрой приватную сеть между ними
Хорошо, а если я это всё знаю? Ну например на последних двух местах работы требовалось работать с выданного организацией ноутбука с виндой. Хотя мне по долгу службы нужно было знать почти всё из вышеназванного, профессия такая. И в винде приходится половину действий выполнять через WSL. А работать одновременно и в WSL и в винде над одной и той же задачей неудобно. Например, в Linux и Windows полный путь файла выглядит по-другому (как минимум слеши разные). Получается, я не могу скопипастить путь из проводника Windows в консоль WSL и наоборот. А ещё, например, винда не умеет определять тип файла по содержимому. Таким образом, если я в винде хочу открыть текстовый файл без расширения (в Linux таких полно, те же Dockerfile, с которыми по работе мне приходится постоянно работать), то постоянно приходится вручную указывать, что нужно открыть в текстовом редакторе.
Ну есть определённая категория людей, для которых всё вышеперечисленное — как два пальца об асфальт. Но им не дают пользоваться линуксом. Меня даже поддержка VPN-сервиса для обхода самизнаетечего отшила. Хотя тот клиент, который они используют, имеет Linux-версию. Но по какой-то причине наблюдалась проблема с DNS. Я подробно описал проблему. Но они отшили с мотивировкой "у нас нет специалистов по Linux". Хотя вся серверная инфраструктура у них явно не на винде.
В виду нынешней ситуации с тем, что интернетов может не быть, а фильмы подвергаются цензуре, их могут изъять из доступа, а то и вовсе подвергнуть кринжатине(из последнего - смотрели в новогодние каникулы "Один дома", дубляж был тот же, с которым я смотрел его в 1993-м в кинотеатре "Искра", но три раза нейросеткой добавили рекламу сраного Альфабанка), решил я вновь собрать коллекцию фильмов, пока это ещё можно сделать. У меня с давних пор трудится старенький D-link DNS-320L
Который я купил, в паре с диском на 3TB, потому что он был тупо самый дешёвый NAS, который я мог себе позволить, в бюджете было тыщ 8(были ж времена...). Плюс, благодаря модифицированной прошивке от программиста Владимира Твердохлеба, можно было ставить всякие аддоны, без необходимости заниматься подломом системы через SSH. В принципе, меня всё устраивало - в трансмишн с работы накидал всякого, домой пришёл, всё уже скачалось. Пока хватит, а там устройства войдут в обиход, будет лучше и дешевле. Ага, подешевело, проверяй...
Ну и старенький D-Link уже не вывозил, новые прошивки с трудом ворочались на его стареньком железе. Прошивка Alt-F работала в разы лучше, но была довольно непроста в освоении, плюс тот же трансмишн периодически давал всяких приколдесов, победить которые у меня никак не получалось. Решил я поменять NAS и... И охренел, натурально говоря. Совершенно невразумительные цены, самые всратые Synology и Qnap'ы, даже с рук стоили почти под 10-ку. Читал я про вариант сделать NAS из HP Microserver Gen8
Но, к сожалению, за Gen8 хотели, даже за б/у каких-то невменяемых денег, а покупать Gen7 на устаревшем железе, это прям совсем за гранью. Был у меня опыт с Terramaster'ом F2-212
Вот, вроде бы, устройство на голову превосходит мой старый D-Link, операционная система похожа на Synology/Qnap, всякие аддоны, цена адекватна(на момент покупки 13,5 тыщ), но... Всё какое-то кривое, косое, тот же трансмишн, или новомодный qbittorrent в докере ставило систему раком при работе. В общем, немного помучившись я сдал его назад, снова запустив D-link. И тут мне попадается статья про то, что можно NAS сделать самому и получится, как минимум не хуже. Хмм, подумал я и принялся за дело. Разумеется начать хочется с корпуса, сейчас есть много вариантов, я, как и автор статьи, остановился на вот этом красавце от INNOVISION.
Нашёл и купил материнскую плату MINI-ITX Asus P8H77-I
Помимо того, что у неё был старый добрый 1155 сокет и DDR3 память, у неё целых 6(ШЕСТЬ!!!) портов SATA. 16 гигов памяти у меня осталось, от каких-то времён, процик i3 я купил. Но потом мне в руки попался i5 3570k, который на ней радостно завёлся.
Вентилятор и блок питания купил по аналогии с той статьёй. Вентиль ID Cooling IS-30
Блок питания Exegate БП 300W ExeGate ServerPRO-1U-F300S, вроде как, судя по словам автора статьи с тихим вентилятором.
Итого по ценнику вышло
Материнская плата - 2500
Блок питания - 1339
Заглушка для материнки - 289
Флешка 4Gb маленькая, под загрузчик XPenology - 278
Кулер 1303
Процессор i3 452 (не пригодился)
Корпус с доставкой - 7475
Проц+Память+Sata шлейфаки 0
В итоге имеем те же 13 500 рубасов, но в разы лучшии характеристики.
Да, не всё оказалось так радужно, как я себе думал. Статья была написана в 2022-м году и похоже за это время у Exegate что-то поменялось, ибо у блока нет переключателя.
Но ладно, хрен бы с ним, мне же лучше - не надо пилить заглушку на корпусе, но вертушка ревёт что маленькая турбина. Я решил было сделать ход конём, заменив вертушку на NOCTUA, которая, по заверениям продавцов и челиком на ютубе, типа БЕСШУМНАЯ отдав за неё почти 2к. Две, ёб вашу мать тыщи, Карл, дороже целого блока питания!!! А она такая же шумная, где эти 14,5 децибел, я вас спрашиваю?!!!
Ну тут, я допускаю, может быть я сам пропёрся, ибо этих NOCTUA целых четыре варианта, я, насмотревшись ютубов, купил не разбираясь, может в этом дело. Сейчас с продаваном пытаюсь решить, можно ли взад сдать, учитывая что те же скотч-локи легко заменить. В общем, собрал я тачанку, не без геморроя, конечно, ибо всё очень впритык, но завелось. Хвалёная Xpenology заводилась с большим трудом, завелась, но почему-то центр приложений работать наотрез отказывался. Я решил обновить DSM, но там уже загрузчик мне сказал иди на хер, пересборки результата не дали, читать тонну текстов, почему так, мне было влом, ну я пока на это дело забил. И пока что моим решением было следующее - Ubuntu Server(Ну или Debian)+CasaOS. Ставится - не бей лежачего, скачиваешь Ubuntu, ставишь на SSD-шник, в самой минималке, главное SSH сервак поставить галочку. Затем скриптом ставишь эту Касу, профит. Удобный веб интерфейс для всех функций, который позволяет делать всё, что мне нужно, при этом не запирая меня в какие-то рамки - ежеди мне чего-то надобно, я всегда могу подключиться к серверу по ssh и чего-то доставить.
То есть, за относительно небольшие деньги всё же получается сделать себе сервачок, который на голову превзойдёт то, что тебе предлагает рынок. А предлагает он, мягко говоря, сверхдорогую хрень.