Соответствие стандарту 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 соответствовали следующим требованиям к 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 (не встроенных в платформу) необходимо явно добавить 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 Task не может работать в режиме restricted. Это связано с тем, что buildah требует повышенных привилегий для сборки образов контейнеров.
buildah Task требует следующего 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. -
Укажите пользователя в
securityContextшагаTask: -
Укажите пользователя в
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