~ / посты / a-read-only-proxy-in-front-of-the-docker-socket

Сокет Docker у агента логов заменили прокси — и обзор нашёл, что без списка сетей агент ослеп бы молча_

агенты

Агент, который собирает журналы контейнеров, держал сокет Docker. У меня это записано исключением с названной ценой: дефект в агенте логов равен узлу. Я хотел эту цену снизить — не отменить исключение, а отрезать агенту всё, кроме чтения.

Белый список собрал по тому, что агент правда просит: список контейнеров, инспект контейнера (оттуда берётся признак TTY, без него поток не разобрать на stdout и stderr) и сами строки журнала. Ни одного POST.

Споткнулся на независимом обзоре до слияния. Обзор полез в исходники обнаружения контейнеров и нашёл: после списка контейнеров агент запрашивает ещё и список сетей — ради меток, как это делает Prometheus. С закрытым разделом сетей обновление целей падает целиком. Healthcheck зелёный, прокси отвечает, агент жив — и ни одной строки журнала с узла. Ни одна моя проверка этого бы не увидела.

Решил так: раздел сетей открыл, а границу переписал честно. Сокет теперь держит отдельный готовый прокси — haproxy с ACL по разделам Docker API, закреплённый тегом и дайджестом. Открыты два раздела на чтение, POST выключен целиком: создание контейнера, exec, остановка и удаление получают отказ на самом прокси, не доходя до сокета. Агент и прокси сидят одни во внутренней сети, у агента больше нет ни сокета, ни группы root. Новая проверка гейта спрашивает прокси изнутри контейнера агента — тем же путём, которым ходит он сам: список контейнеров 200, создание контейнера 403. Реестр проверок стал 50.

Свой белый список запросов, который закрыл бы и инспект, я отверг. Инспект агенту нужен, пока библиотека сбора его требует, а конфиг пришлось бы держать согласованным с версией агента: обновил агента — переписывай фильтр. Названным путём он остаётся на случай, если требование уйдёт.

Чем плачу. Остаток записан в решении, а не спрятан: любое чтение двух открытых разделов по-прежнему отдаёт окружение любого контейнера и его файловую систему. Гранулярность готового прокси — раздел и метод, тоньше не бывает. «Дефект в агенте равен узлу» превратилось в «агент читает всё, что есть в стеке, но ничего не запускает». Это меньше, но не ноль.

Дальше бюджет: новый сервис в описании стека, в профилях, в документе безопасности и в бюджетах. Доля памяти 32 МиБ взята у шлюза моделей (1 ГиБ → 992 МиБ), общий потолок 4 ГиБ не поднят: haproxy с одним бэкендом и одним клиентом живёт в десятке мегабайт, а у шлюза запас в сотни.

И честно про замер: живьём это не раскатано. Docker на узле я остановил в тот же день, так что проверка написана и зелена в гейте, а не на работающем стеке.

#агенты

$ echo "читать серию"

← Все посты