Соответствие ограниченному стандарту Pod Security
Содержание
Обзор возможностиСценарии использованияПредварительные требованияПонимание ограниченного стандартаШаги1. Настройте Tekton для добавленияsecurityContext в init-контейнерыВариант A: Настройка через TektonPipelineВариант B: Настройка через TektonConfig2. Добавьте securityContext в пользовательские определения Task3. Настройте контейнерные образы для использования пользователей без rootРезультаты выполненияИспользование инструментов принудительного применения политикУстранение неполадокВстроенные Tasks и ограниченный стандартTaskRun завершается ошибками, связанными с пользователем контейнераTaskRun завершается ошибкой "Forbidden: cannot set securityContext.capabilities"Init-контейнеры завершаются ошибками доступаПодробнееОбзор возможности
Стандарт pod-security.kubernetes.io/enforce=restricted является наиболее строгим Pod Security Standard и применяет текущие лучшие практики hardening для pod. Если namespace помечен этим стандартом, все pod, создаваемые в этом namespace, должны соответствовать строгим требованиям безопасности.
В этом руководстве объясняется, как настроить Tekton Pipelines для соответствия стандарту безопасности restricted, чтобы все контейнеры в ваших Tasks могли успешно запускаться в namespace с ограниченными настройками безопасности.
Сценарии использования
- Запуск
Tekton Pipelinesв namespace с меткойpod-security.kubernetes.io/enforce=restricted - Выполнение требований организационной безопасности и соответствия
- Повышение уровня безопасности ваших CI/CD pipeline
- Запуск workload в средах с высокими требованиями к регулированию
Предварительные требования
Tekton Pipelinesустановлен через CRTektonPipelineилиTektonConfig- У вас есть разрешение на изменение ресурсов
TektonPipelineилиTektonConfig - Вы можете создавать или изменять определения
Task - Для пользовательских образов у вас есть доступ к изменению
Containerfilesи пересборке образов
Понимание ограниченного стандарта
Стандарт pod-security.kubernetes.io/enforce=restricted требует, чтобы все три типа контейнеров в Pod соответствовали следующим требованиям к securityContext:
- Обычные контейнеры (
containers) - Init-контейнеры (
initContainers) - Эфемерные контейнеры (
ephemeralContainers)
Каждый контейнер должен иметь следующую конфигурацию securityContext:
Разбор конфигурации:
Шаги
1. Настройте Tekton для добавления securityContext в init-контейнеры
Tekton создает init-контейнеры для каждого управляемого им Pod. Чтобы соответствовать стандарту restricted, необходимо включить автоматическое добавление требуемого securityContext к этим init-контейнерам.
Вариант A: Настройка через TektonPipeline
Если вы управляете Tekton напрямую через CR TektonPipeline:
Примените конфигурацию:
Вариант B: Настройка через TektonConfig
Если вы управляете Tekton через CR TektonConfig:
Примените конфигурацию:
Примечание: Это изменение конфигурации вступает в силу немедленно и не требует перезапуска контроллера
Tekton. НовыеTaskRunsиPipelineRuns, созданные после этого изменения, автоматически получат необходимыйsecurityContext, примененный к init-контейнерам.
2. Добавьте securityContext в пользовательские определения Task
Для пользовательских Tasks (не встроенных Tasks, предоставляемых платформой) необходимо явно добавить securityContext к каждому шагу.
Пример Task с securityContext:
Важно: Этот шаг относится к пользовательским
Tasks. ВстроенныеTasks, предоставляемые платформой (за исключениемbuildah, см. раздел «Устранение неполадок»), совместимы с этими ограничениями безопасности, но их определенияTaskне содержат явных конфигурацийsecurityContext, поскольку они рассчитаны на работу в различных контекстах безопасности, а не только в режиме restricted.
3. Настройте контейнерные образы для использования пользователей без root
Контейнерные образы должны быть настроены на запуск от имени пользователя, не являющегося root. Пользователь должен быть указан с помощью числового UID, а не имени пользователя.
В вашем Containerfile добавьте пользователя без root и сделайте его пользователем по умолчанию. Ниже приведен пример для образов на основе Alpine:
Примечание: Синтаксис команды
adduserзависит от базового образа. См. приведенную ниже документацию с примерами для других базовых образов.
Проверьте конфигурацию образа:
Подробные рекомендации по настройке Containerfile см. в Настройка Containerfile для сборки пользовательских образов, совместимых с Task.
Результаты выполнения
После выполнения указанных выше шагов:
- Init Containers: init-контейнеры, создаваемые
Tekton, будут автоматически соответствовать стандартуrestricted - Пользовательские Tasks: шаги ваших пользовательских
Taskбудут иметь требуемыйsecurityContext - Container Images: образы будут запускаться от имени пользователей без root с минимальными привилегиями
Вы можете проверить соответствие, создав TaskRun в namespace с ограниченными настройками безопасности:
Успешный TaskRun показывает SUCCEEDED как True и REASON как Succeeded, что означает, что все контейнеры успешно выполнились с требуемыми ограничениями безопасности.
Использование инструментов принудительного применения политик
Для более автоматизированного подхода можно использовать инструменты принудительного применения политик, такие как Kyverno, чтобы автоматически внедрять необходимый securityContext во все контейнеры. Создав Kyverno Policy (с использованием apiVersion: kyverno.io/v1 и kind: Policy), можно автоматически изменять Pod, добавляя необходимые конфигурации securityContext.
Для получения дополнительной информации см. Сценарий 4: Принудительное применение `SecurityContext` в указанном namespace.
Этот подход устраняет необходимость вручную настраивать securityContext для каждого Task, упрощая управление соответствием требованиям.
Подробные рекомендации по настройке политик Kyverno для этой цели см. в:
Устранение неполадок
Встроенные Tasks и ограниченный стандарт
Среди встроенных Tasks, предоставляемых платформой, только buildah Task не может выполняться в рамках стандарта restricted. Это связано с тем, что buildah требует повышенных привилегий для сборки контейнерных образов.
buildah Task требует следующего securityContext:
Решения:
- Используйте
buildahTaskв отдельном namespace с режимомbaselineвместо режимаrestricted(например,pod-security.kubernetes.io/enforce=baseline) - Рассмотрите альтернативные способы сборки контейнерных образов, которые могут иметь другие требования к безопасности
TaskRun завершается ошибками, связанными с пользователем контейнера
Вы можете столкнуться с одной из следующих ошибок:
- "container has runAsNonRoot and image will run as root" — в образе контейнера в
Containerfileотсутствует директиваUSER(по умолчанию используется root) либо явно указанUSER 0илиUSER root - "container has runAsNonRoot and image has non-numeric user" — образ контейнера использует символьное имя пользователя (например,
USER appuser) вместо числового UID
Решения:
-
Пересоберите образ, используя числовой идентификатор пользователя без root, как описано в шаге 3. Например, используйте
USER 65532вместоUSER appuserилиUSER root. -
Укажите пользователя в
securityContextTask: -
Укажите пользователя в
podTemplateTaskRun:
Примечание:
podTemplate.securityContextзадаетsecurityContextна уровнеPod, который наследуется всеми контейнерами, если не переопределен на уровне контейнера.
Варианты 2 и 3 полезны, если вы не можете изменить образ контейнера.
TaskRun завершается ошибкой "Forbidden: cannot set securityContext.capabilities"
Эта ошибка возникает, когда securityContext пытается добавить capabilities при одновременном удалении всех capabilities.
Решение: Убедитесь, что ваш Task не добавляет никаких capabilities. Удаляйте только capabilities, как показано в примерах.
Init-контейнеры завершаются ошибками доступа
Если init-контейнеры после установки set-security-context: true завершаются ошибками доступа, проверьте следующее:
- В namespace настроены соответствующие политики безопасности
- Образы контейнеров, используемые
Tekton, настроены на запуск без root - Установка
Tektonобновлена до актуальной версии