Что такое принцип наименьших привилегий и как он применяется в контейнерах?
Принцип наименьших привилегий (Principle of Least Privilege, PoLP) – это фундаментальный принцип информационной безопасности, согласно которому каждый субъект (пользователь, процесс, контейнер) должен иметь только те права и ресурсы, которые минимально необходимы для выполнения его задачи.
Представьте кассира в банке: ему дают ключ только от своей кассы, а не от хранилища. Контейнеру точно так же нужно давать только те привилегии, без которых он не может работать.
Применение в Docker
Запуск процессов не от root – указание непривилегированного пользователя через инструкцию USER в Dockerfile:
Пример
FROM eclipse-temurin:21-jre-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
Удаление лишних capabilities – Linux capabilities позволяют дробить монолитные root-привилегии на отдельные единицы:
Пример
# Запуск с удалением всех capabilities и добавлением только нужных
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-java-app
Запрет привилегированного режима и эскалации привилегий:
Пример
# Никогда не использовать в production:
docker run --privileged my-app # ОПАСНО!
# Правильно:
docker run --security-opt=no-new-privileges my-app
Read-only файловая система:
Пример
docker run --read-only --tmpfs /tmp my-java-app
Применение в Kubernetes
Полный манифест пода с минимальными привилегиями
apiVersion: v1
kind: Pod
metadata:
name: secure-java-app
spec:
containers:
- name: app
image: my-registry/java-app:1.0.0
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir:
sizeLimit: 100Mi
automountServiceAccountToken: false
Ключевые параметры
| Параметр | Назначение |
|---|---|
runAsNonRoot: true |
Запрещает запуск от root |
allowPrivilegeEscalation: false |
Блокирует setuid-бинарники и получение дополнительных привилегий дочерними процессами |
capabilities.drop: [ALL] |
Удаляет все Linux capabilities |
readOnlyRootFilesystem: true |
Запрещает запись в файловую систему контейнера |
automountServiceAccountToken: false |
Отключает монтирование токена сервисного аккаунта, если поду не нужен доступ к Kubernetes API |
seccompProfile.type: RuntimeDefault |
Ограничивает набор доступных системных вызовов |
Вывод
Принцип наименьших привилегий – это не одна настройка, а комплекс мер: отказ от root, удаление capabilities, read-only ФС, запрет эскалации и отключение ненужных токенов. Регуляторные требования (PCI DSS Requirement 7) прямо требуют ограничения доступа к данным по принципу need-to-know.
На собеседовании: покажите, что знаете не только определение, но и конкретные механизмы реализации. Перечислите
runAsNonRoot,cap-drop=ALL,readOnlyRootFilesystem,allowPrivilegeEscalation: false– это набор, который ожидают услышать.