Соответствие стандарту Pod Security Restricted
Содержание
Обзор функциональностиСценарии использованияПредварительные требованияПонимание стандарта RestrictedШаги1. Настройте Tekton для добавления security context в init containersВариант A: Настройка через TektonPipelineВариант B: Настройка через TektonConfig2. Добавьте security context в определения пользовательских Task3. Настройте контейнерные образы для использования пользователей без root-правРезультаты выполненияИспользование инструментов принудительного применения политикУстранение неполадокВстроенные Tasks и стандарт RestrictedTaskRun завершается ошибкой из-за пользователя контейнераTaskRun завершается ошибкой "Forbidden: cannot set securityContext.capabilities"Init containers завершаются ошибками доступаПодробнееОбзор функциональности
Стандарт 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
- Запуск workloads в средах с высокими требованиями к регулированию
Предварительные требования
Tekton Pipelinesустановлен через CRTektonPipelineилиTektonConfig- У вас есть разрешение на изменение ресурсов
TektonPipelineилиTektonConfig - Вы можете создавать или редактировать определения
Task - Для пользовательских образов у вас есть доступ к изменению
Containerfileи пересборке образов
Понимание стандарта Restricted
Стандарт pod-security.kubernetes.io/enforce=restricted требует, чтобы все три типа контейнеров в Pod соответствовали следующим требованиям к security context:
- Обычные контейнеры (
containers) - Init containers (
initContainers) - Ephemeral containers (
ephemeralContainers)
Каждый контейнер должен иметь следующую конфигурацию security context:
Разбор конфигурации:
Шаги
1. Настройте Tekton для добавления security context в init containers
Tekton создает init containers для каждого управляемого им Pod. Чтобы соответствовать стандарту restricted, необходимо включить автоматическое добавление требуемого security context к этим init containers.
Вариант A: Настройка через TektonPipeline
Если вы управляете Tekton напрямую через CR TektonPipeline:
Примените конфигурацию:
Вариант B: Настройка через TektonConfig
Если вы управляете Tekton через CR TektonConfig:
Примените конфигурацию:
Примечание: Это изменение конфигурации вступает в силу немедленно и не требует перезапуска контроллера
Tekton. НовыеTaskRunsиPipelineRuns, созданные после этого изменения, автоматически получат требуемый security context для init containers.
2. Добавьте security context в определения пользовательских Task
Для пользовательских Tasks (не встроенных Tasks, предоставляемых платформой) необходимо явно добавить security context для каждого шага.
Пример Task с security context:
Важно: Этот шаг относится к пользовательским
Tasks. ВстроенныеTasks, предоставляемые платформой (за исключениемbuildah, см. раздел «Устранение неполадок»), совместимы с этими ограничениями безопасности, но их определенияTaskне содержат явных настроекsecurityContext, поскольку они рассчитаны на работу в различных контекстах безопасности, а не только в режиме restricted.
3. Настройте контейнерные образы для использования пользователей без root-прав
Контейнерные образы должны быть настроены на запуск от имени пользователя, не являющегося root. Пользователь должен быть указан с использованием числового UID, а не имени пользователя.
В вашем Containerfile добавьте пользователя без root-прав и установите его в качестве пользователя по умолчанию. Ниже приведен пример для образов на основе Alpine:
Примечание: Синтаксис команды
adduserзависит от базового образа. См. приведенную ниже документацию с примерами для других базовых образов.
Проверьте конфигурацию образа:
Для подробных рекомендаций по настройке Containerfile см. Настроить Containerfile для сборки пользовательских образов, совместимых с Task.
Результаты выполнения
После выполнения указанных выше шагов:
- Init Containers: init containers, создаваемые
Tekton, будут автоматически соответствовать стандартуrestricted - Пользовательские Tasks: ваши пользовательские шаги
Taskбудут иметь требуемый security context - Контейнерные образы: образы будут запускаться от имени пользователей без root-прав с минимальными привилегиями
Вы можете проверить соответствие, создав TaskRun в namespace с ограничениями:
Успешный TaskRun отображает SUCCEEDED со значением True и REASON со значением Succeeded, что указывает на то, что все контейнеры были успешно запущены с требуемыми ограничениями безопасности.
Использование инструментов принудительного применения политик
Для более автоматизированного подхода можно использовать инструменты принудительного применения политик, такие как Kyverno, чтобы автоматически внедрять требуемый security context во все контейнеры. Создав Policy Kyverno (с использованием apiVersion: kyverno.io/v1 и kind: Policy), вы можете автоматически изменять Pods, добавляя необходимые настройки security context.
Подробнее см. Сценарий 4: Принудительное применение security context для указанного namespace.
Этот подход на основе Kyverno не делает встроенный Task buildah совместимым со стандартом restricted. Описание ограничения buildah см. в разделе Встроенные Tasks и стандарт Restricted ниже.
Этот подход устраняет необходимость вручную настраивать security context для каждого Task, упрощая управление соответствием требованиям.
Подробные рекомендации по настройке политик Kyverno для этой цели см. здесь:
Устранение неполадок
Встроенные Tasks и стандарт Restricted
Среди встроенных Tasks, предоставляемых платформой, только Task buildah не может работать в рамках стандарта restricted. Это связано с тем, что для сборки контейнерных образов buildah требуются повышенные привилегии.
Это ограничение сохраняется даже при использовании Kyverno для автоматического внедрения требуемого security context restricted в Pods. Kyverno может добавить поля, требуемые стандартом restricted, но не может сделать встроенный Task buildah совместимым с restricted, поскольку buildah требует привилегий, запрещенных этим стандартом.
Task buildah требует следующую конфигурацию security context:
Решения:
-
Используйте
Taskbuildahв отдельном namespace с режимомbaselineвместо режимаrestricted.Чтобы workloads
buildahмогли выполняться, необходимо изменитьpod-security.kubernetes.io/enforceнаbaseline. Меткиwarnиauditне блокируют допуск.После изменения метки namespace создайте новый
TaskRunилиPipelineRun, использующийTaskbuildahв этом namespace. Если правильно настроены учетные данные реестра,Containerfileи workspace,Taskbuildahможет нормально выполняться в рамках стандартаbaseline. -
Рассмотрите альтернативные способы сборки container image, которые могут иметь другие требования к безопасности.
TaskRun завершается ошибкой из-за пользователя контейнера
Вы можете столкнуться с одной из следующих ошибок:
- "container has runAsNonRoot and image will run as root" — в контейнерном образе отсутствует директива
USERвContainerfile(по умолчанию используется 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задает security context на уровне Pod, который наследуется всеми контейнерами, если не переопределен на уровне контейнера.
Варианты 2 и 3 полезны, когда вы не можете изменить контейнерный образ.
TaskRun завершается ошибкой "Forbidden: cannot set securityContext.capabilities"
Эта ошибка возникает, когда в security context пытаются добавить capabilities при одновременном удалении всех capabilities.
Решение: Убедитесь, что ваш Task не добавляет никаких capabilities. Оставляйте только удаление capabilities, как показано в примерах.
Init containers завершаются ошибками доступа
Если после установки set-security-context: true init containers завершаются ошибками доступа, проверьте, что:
- В namespace заданы соответствующие политики безопасности
- Контейнерные образы, используемые
Tekton, настроены на запуск от имени пользователя без root-прав - Установка
Tektonобновлена до актуальной версии