861просмотров
26 июля 2025 г.
story📷 ФотоScore: 947
Я не root, но всё могу Cчитаете, что без privileged: true или runAsRoot: false вы уже в безопасности?
Даже если контейнер работает от обычного пользователя, он всё ещё может обладать опасными привилегиями - благодаря так называемым default capabilities. В Linux права суперпользователя разбиты на отдельные возможности - capabilities. Это позволяет точечно выдавать привилегии, а не всё сразу. Однако по умолчанию Kubernetes предоставляет контейнерам целый набор таких возможностей - даже если не указали ничего явно. Если в securityContext ничего не указано, Pod получает следующий набор default capabilities: CAP_CHOWN - изменение владельца и группы файлов.
CAP_DAC_OVERRIDE - игнорирование прав доступа к файлам (чтение, запись, выполнение).
CAP_FOWNER - обход проверок при изменении метаданных файлов (например, chmod, utime).
CAP_FSETID - управление битами setuid/setgid при изменении файлов.
CAP_KILL — отправка сигналов любым процессам (включая SIGKILL).
CAP_SETGID / CAP_SETUID - смена GID/UID процесса.
CAP_SETPCAP - изменение собственных и чужих capabilities.
CAP_SETFCAP - установка capabilities на исполняемые файлы.
CAP_NET_BIND_SERVICE - привязка к портам ниже 1024.
CAP_NET_RAW — использование RAW-сокетов (например, для ping или сниффинга).
CAP_SYS_CHROOT - выполнение chroot.
CAP_MKNOD - создание специальных файлов (устройства, FIFO и т.д.).
CAP_AUDIT_WRITE - запись в системный аудит. Решение - отключаем все, что не используем: securityContext: capabilities: drop: - ALL Потом включаем то, что понадобится: add: - NET_BIND_SERVICE - CHOWN Для демонстрации, создаем под порождающий процесс с отключением всех capabilities: kubectl apply -f <(cat <<EOF
apiVersion: v1
kind: Pod
metadata: name: cap-secure-bind
spec: containers: - name: python image: python:3.12-slim command: ["python3", "-m", "http.server", "80"] securityContext: runAsUser: 1000 runAsGroup: 1000 allowPrivilegeEscalation: true capabilities: drop: - ALL restartPolicy: Never
EOF
) Даже с расширенными привилегиями под упал, так как мы отключили возможности, активированные по умолчанию, в том числе CAP_NET_BIND_SERVICE: kubectl logs cap-secure-bind
>>> PermissionError: [Errno 13] Permission denied #DevSecOps