Соответствие стандарту Pod Security Restricted
Содержание
Обзор функцииСценарии использованияПредварительные требованияПонимание стандарта RestrictedШаги1. Настройте Tekton для добавления securityContext в init контейнерыВариант A: Настройка через TektonPipelineВариант B: Настройка через TektonConfig2. Добавьте securityContext в пользовательские определения Task3. Настройте образы контейнеров для запуска от не-root пользователяРезультаты работыИспользование инструментов принудительного соблюдения политикиУстранение неполадокВстроенные Tasks и стандарт RestrictedTaskRun завершается с ошибками пользователя контейнераTaskRun завершается с ошибкой "Forbidden: cannot set securityContext.capabilities"Init контейнеры завершаются с ошибками разрешенийДополнительная информацияОбзор функции
Стандарт pod-security.kubernetes.io/enforce=restricted является самым строгим из Pod Security Standard, обеспечивая соблюдение современных лучших практик по усилению безопасности подов. Когда пространство имён помечено этим стандартом, все поды, создаваемые в нём, должны соответствовать жёстким требованиям безопасности.
В этом руководстве объясняется, как настроить Tekton Pipelines для соответствия стандарту restricted, гарантируя, что все контейнеры в ваших Tasks смогут успешно запускаться в пространствах имён с ограничениями.
Сценарии использования
- Запуск
Tekton Pipelinesв пространствах имён с меткойpod-security.kubernetes.io/enforce=restricted - Выполнение требований организационной безопасности и соответствия
- Повышение уровня безопасности ваших CI/CD конвейеров
- Запуск рабочих нагрузок в строго регулируемых средах
Предварительные требования
Tekton Pipelinesустановлен через CRTektonPipelineилиTektonConfig- У вас есть права на изменение ресурсов
TektonPipelineилиTektonConfig - Вы можете создавать или редактировать определения
Task - Для пользовательских образов у вас есть доступ к изменению
Containerfilesи пересборке образов
Понимание стандарта Restricted
Стандарт pod-security.kubernetes.io/enforce=restricted требует, чтобы все три типа контейнеров в Pod соответствовали следующим требованиям безопасности контекста:
- Обычные контейнеры (
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 (не встроенных в платформу) необходимо явно добавить securityContext к каждому шагу.
Пример Task с securityContext:
Важно: Этот шаг относится к пользовательским
Tasks. ВстроенныеTasks, предоставляемые платформой (за исключениемbuildah, см. раздел «Устранение неполадок»), совместимы с этими ограничениями безопасности, но их определенияTaskне содержат явных конфигурацийsecurityContext, так как они разработаны для работы в различных контекстах безопасности, а не только в режиме restricted.
3. Настройте образы контейнеров для запуска от не-root пользователя
Образы контейнеров должны быть настроены на запуск от не-root пользователя. Пользователь должен быть указан с помощью числового UID, а не имени пользователя.
В вашем Containerfile добавьте не-root пользователя и установите его по умолчанию. Пример для образов на базе Alpine:
Примечание: Синтаксис команды
adduserзависит от базового образа. См. ссылки ниже для примеров с другими базовыми образами.
Проверьте конфигурацию образа:
Подробные инструкции по настройке Containerfiles смотрите в Adjust Containerfile for Building Task-Compatible Custom Images.
Результаты работы
После выполнения вышеуказанных шагов:
- Init контейнеры: init контейнеры, создаваемые
Tekton, автоматически будут соответствовать стандартуrestricted - Пользовательские Tasks: шаги ваших пользовательских
Tasksбудут иметь требуемый securityContext - Образы контейнеров: образы будут запускаться от не-root пользователей с минимальными привилегиями
Вы можете проверить соответствие, создав TaskRun в пространстве имён с ограничениями:
Успешный TaskRun показывает SUCCEEDED как True и REASON как Succeeded, что означает успешный запуск всех контейнеров с требуемыми ограничениями безопасности.
Использование инструментов принудительного соблюдения политики
Для более автоматизированного подхода можно использовать инструменты принудительного соблюдения политики, такие как Kyverno, чтобы автоматически внедрять требуемый securityContext во все контейнеры. Создавая Kyverno Policy (с apiVersion: kyverno.io/v1 и kind: Policy), вы можете автоматически мутировать Pods, добавляя необходимые конфигурации securityContext.
Для дополнительной информации обратитесь к Scenario 4: Specified Namespace Security Context Enforcement.
Этот подход устраняет необходимость ручной настройки securityContext для каждого Task, упрощая управление соответствием.
Подробные инструкции по настройке политик Kyverno для этой цели смотрите по ссылкам:
Устранение неполадок
Встроенные Tasks и стандарт Restricted
Из встроенных Tasks, предоставляемых платформой, только buildah не может работать в режиме restricted. Это связано с тем, что buildah требует повышенных привилегий для сборки контейнерных образов.
buildah требует следующий securityContext:
Решения:
- Используйте
buildahTaskв отдельном пространстве имён с режимомbaselineвместоrestricted(например, с меткойpod-security.kubernetes.io/enforce=baseline) - Рассмотрите альтернативные методы сборки контейнерных образов с другими требованиями безопасности
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
Решения:
-
Пересоберите образ с числовым 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, проверьте:
- Наличие соответствующих политик безопасности в пространстве имён
- Конфигурацию образов контейнеров, используемых
Tekton, на запуск от не-root пользователя - Актуальность установки
Tekton