Хорошей практикой является принцип наименьших привилегий (давать только те права которые нужны для выполнения задачи). На практике разработчики зачастую идут путём наименьшего сопротивления и копируют "рецепты" из интернета.
Далее несколько частых случаев с которыми мне доводится сталкиваться и варианты их решения.
Прослушивание портов ниже 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 и будет правильно реагировать на сигналы.
Комментариев нет:
Отправить комментарий