Gymterview
junior

Что такое принцип наименьших привилегий и как он применяется в контейнерах?

Принцип наименьших привилегий (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 – это набор, который ожидают услышать.