вторник, 15 июля 2025 г.

Привилегии приложений в контейнерах

Хорошей практикой является принцип наименьших привилегий (давать только те права которые нужны для выполнения задачи). На практике разработчики зачастую идут путём наименьшего сопротивления и копируют "рецепты" из интернета.

Далее несколько частых случаев с которыми мне доводится сталкиваться и варианты их решения.

Прослушивание портов ниже 1024

Если программа требует повышения привилегий для прослушивания портов 80 и 443 (или любых других до 1024), то можно изменить конфигурацию для прослушивания портов выше 1024 (например 8080 и 8443), а на балансировщике сделать преобразование портов. Если переназначение портов невозможно, то можно воспользоваться Linux capabilities и выдать только CAP_NET_BIND_SERVICE вместо выдачи прав пользователя root.

Отладка в контейнере

Хорошей практикой является создание непривилегированного пользователя и группы в контейнере с правами которого будет выполняться программа.

Например

RUN groupadd -g 1001 app && \
	useradd -u 1001 -g 1001 -s /bin/false -d /app app

USER app:app

Если разработчику требуется зайти в контейнер и установить дополнительные утилиты, то в docker exec нужно добавить параметр -u 0 и тогда команда будет выполнена с правами root.

Например

docker exec -it -u 0 app-backend apt-get install -y dnsutils

Для kubernetes потребуется использовать kubectl debug.

Инициализация контейнера

Если нужно выполнить какие-либо действия, которые требуют повышенных привилегий (например смена владельца и прав доступа при монтировании дискового тома в Docker), то сбросить права для программы которая не может это сделать самостоятельно можно через:

  • su-exec (пакет только в Alpine?)
  • gosu
  • setpriv (util-linux)
  • chroot --userspec

При этом внутри контейнера программа будет иметь PID 1 и будет правильно реагировать на сигналы.

Комментариев нет:

Отправить комментарий