• Русский
  • Проверка подписи образа

    В Tekton Chains можно автоматически подписывать собранный образ и записывать подпись в SLSA Provenance.

    Обзор функции

    Этот метод использует Tekton Chains для автоматической подписи собранного образа, а затем использует cosign или Kyverno для проверки подписи:

    1. Настройте Tekton Chains для автоматической подписи собранного образа.
    2. Используйте Tekton Task buildah для сборки образа.
    3. (Необязательно) Используйте cosign CLI для проверки подписи.
    4. Настройте правила Kyverno, чтобы разрешать только подписанные образы.
    5. Используйте образ для создания Pod, чтобы проверить подпись.
    TIP

    По сравнению с Быстрый старт: Signed Provenance, этот метод добавляет только дополнительные шаги проверки.

    Варианты использования

    Для следующих сценариев необходимо обращаться к рекомендациям в этом документе:

    • Реализация проверки подписи образов в кластерах Kubernetes с использованием Kyverno
    • Принудительное применение политик безопасности, разрешающих к развертыванию только подписанные образы
    • Настройка автоматической проверки подписи образов в CI/CD-пайплайнах
    • Обеспечение целостности и подлинности образов в production-средах
    • Реализация механизмов безопасности цепочки поставок для контейнерных образов

    Предварительные требования

    • Кластер Kubernetes с установленными Tekton Pipelines, Tekton Chains и Kyverno
    • Registry с включенной возможностью push образов
    • Установленный и настроенный для доступа к кластеру kubectl CLI
    • Установленный инструмент cosign CLI
    • Установленный инструмент jq CLI

    Обзор процесса

    ШагОперацияОписание
    1Сгенерировать ключи подписиСоздать пару ключей для подписи артефактов с помощью cosign
    2Настроить аутентификациюНастроить учетные данные registry для push образов
    3Настроить Tekton ChainsНастроить Chains на использование OCI storage и подписи
    4Создать пример PipelineСоздать определение pipeline с необходимыми task и workspace
    5Запустить пример PipelineСоздать и запустить PipelineRun с правильной конфигурацией
    6Дождаться подписиДождаться, пока PipelineRun будет подписан Chains
    7Получить информацию об образеИзвлечь URI и digest образа из PipelineRun
    8Проверить подписи с KyvernoНастроить и проверить подпись образа с помощью политик Kyverno
    9Очистить ресурсыУдалить тестовые Pod и политики

    Пошаговые инструкции

    Шаги 1–7: Базовая настройка

    Эти шаги идентичны руководству Быстрый старт: Signed Provenance. Следуйте инструкциям в этом руководстве для:

    Шаг 8: Проверка подписи с помощью Kyverno

    В Шаге 8: Проверка образа и аттестации мы используем cosign CLI для проверки подписи. Здесь мы используем Kyverno для проверки подписи.

    Шаг 8.1: Создайте политику Kyverno, чтобы разрешить к развертыванию только подписанные образы

    TIP

    Для этого шага требуются права cluster administrator.

    Подробнее о Kyverno ClusterPolicy см. Kyverno ClusterPolicy

    Политика выглядит следующим образом:

    apiVersion: kyverno.io/v1
    kind: ClusterPolicy
    metadata:
      name: only-cosign-image-deploy
    spec:
      webhookConfiguration:
        failurePolicy: Fail
        timeoutSeconds: 30
      background: false
      rules:
        - name: check-image
          match:
            any:
              - resources:
                  kinds:
                    - Pod
                  namespaces:
                    - policy
          verifyImages:
            - imageReferences:
                - "*"
                # - "<registry>/test/*"
              skipImageReferences:
                - "ghcr.io/trusted/*"
              failureAction: Enforce
              verifyDigest: false
              required: false
              useCache: false
              imageRegistryCredentials:
                allowInsecureRegistry: true
                secrets:
                  # The credential needs to exist in the namespace where kyverno is deployed
                  - registry-credentials
    
              attestors:
                - count: 1
                  entries:
                    - keys:
                        publicKeys: |- # <- The public key of the signer
                          -----BEGIN PUBLIC KEY-----
                          MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFZNGfYwn7+b4uSdEYLKjxWi3xtP3
                          UkR8hQvGrG25r0Ikoq0hI3/tr0m7ecvfM75TKh5jGAlLKSZUJpmCGaTToQ==
                          -----END PUBLIC KEY-----
    
                        ctlog:
                          ignoreSCT: true
    
                        rekor:
                          ignoreTlog: true

    :::details {title="Пояснение полей YAML"}

    • spec.rules[].match.any[].resources: Ресурсы, которые будут сопоставлены и проверены.
      • kinds: Типы ресурсов, которые будут сопоставлены и проверены.
        • Pod: ресурсы Pod.
      • namespaces: Пространства имен ресурсов, которые будут сопоставлены и проверены.
        • policy: ресурсы в пространстве имен policy будут сопоставлены и проверены.
    • spec.rules[].verifyImages: Проверяемые образы
      • imageReferences: Ссылки на образы, которые будут проверяться.
        • *: будут проверены все ссылки на образы.
        • <registry>/test/*: будут проверены только ссылки на образы в registry <registry>/test.
      • skipImageReferences: Ссылки на образы, которые будут пропущены.
        • ghcr.io/trusted/*: будут пропущены только ссылки на образы в registry ghcr.io/trusted.
      • imageRegistryCredentials:
        • allowInsecureRegistry: Разрешать ли небезопасный registry.
        • secrets: Secret, используемые для учетных данных image registry.
          • registry-credentials: имя secret. Secret должен существовать в пространстве имен, где развернут kyverno.
      • attestors: Аттестаторы, которые будут использоваться для проверки образа.
        • count: Количество аттестаторов, которые должны совпасть.
        • entries: Записи аттестаторов.
          • keys: Ключи аттестаторов.
            • publicKeys: Открытые ключи аттестаторов.
              • Этот открытый ключ совпадает с открытым ключом cosign.pub в secret signing-secrets.
            • ctlog: ctlog аттестаторов.
              • ignoreSCT: Нужно ли игнорировать SCT.
                • В изолированных сетевых средах сначала игнорируйте SCT.
            • rekor: rekor аттестаторов.
              • ignoreTlog: Нужно ли игнорировать Tlog.
                • В изолированных сетевых средах сначала игнорируйте Tlog. :::

    Необходимо скорректировать конфигурацию

    • spec.rules[].attestors[].entries[].keys.publicKeys: Открытый ключ подписывающей стороны.

    Сохраните это в файл yaml с именем kyverno.only-cosign-image-deploy.yaml и примените его с помощью:

    $ kubectl apply -f kyverno.only-cosign-image-deploy.yaml
    
    clusterpolicy.kyverno.io/only-cosign-image-deploy configured

    Шаг 8.2: Проверьте политику

    В пространстве имен policy, где определена политика, создайте Pod для проверки политики.

    Используйте подписанный образ, созданный pipeline, для создания Pod.

    $ export NAMESPACE=<policy>
    $ export IMAGE=<<registry>/test/chains/demo-1:latest@sha256:93635f39cb31de5c6988cdf1f10435c41b3fb85570c930d51d41bbadc1a90046>
    
    $ kubectl run -n $NAMESPACE signed --image=${IMAGE} -- sleep 3600
    
    pod/signed created

    Pod будет создан успешно.

    $ export NAMESPACE=<policy>
    $ kubectl get pod -n $NAMESPACE signed
    
    NAME      READY   STATUS    RESTARTS   AGE
    signed   1/1     Running   0          10s

    Используйте неподписанный образ для создания Pod.

    $ export NAMESPACE=<policy>
    $ export IMAGE=<<registry>/test/chains/unsigned:latest>
    
    $ kubectl run -n $NAMESPACE unsigned --image=${IMAGE} -- sleep 3600

    Если вы получите такой вывод, это означает, что Pod заблокирован политикой.

    Error from server: admission webhook "mutate.kyverno.svc-fail" denied the request:
    
    resource Pod/policy/unsigned was blocked due to the following policies
    
    only-cosign-image-deploy:
      check-image: 'failed to verify image ubuntu:latest:
        .attestors[0].entries[0].keys: no signatures found'

    Шаг 9: Очистка ресурсов

    Удалите Pod, созданные на предыдущих шагах.

    $ export NAMESPACE=<policy>
    $ kubectl delete pod -n $NAMESPACE signed
    
    pod "signed" deleted

    Удалите политику.

    $ kubectl delete clusterpolicy only-cosign-image-deploy

    Ожидаемые результаты

    После выполнения этого руководства:

    • У вас будет рабочая конфигурация Tekton Chains для подписи образов и Kyverno для проверки подписи
    • Контейнерные образы будут автоматически подписываться в процессе сборки
    • Только подписанные образы можно будет развертывать в указанном пространстве имен
    • Неподписанные образы будут автоматически блокироваться политиками Kyverno
    • Вы реализуете базовый механизм контроля безопасности цепочки поставок для контейнерных образов

    Это руководство служит основой для внедрения безопасности цепочки поставок в ваши CI/CD-пайплайны. В production-среде следует:

    1. Настроить правильную изоляцию пространств имен и контроль доступа
    2. Реализовать безопасное управление ключами подписи
    3. Настроить мониторинг и оповещения о нарушениях политик
    4. Регулярно ротировать ключи подписи и обновлять политики безопасности
    5. Рассмотреть возможность внедрения дополнительных механизмов безопасности, таких как сканирование уязвимостей

    Ссылки