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

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

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

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

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

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

    Сценарии использования

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

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

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

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

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

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

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

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

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

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

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

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

    TIP

    Для этого шага требуются права администратора кластера.

    Дополнительные сведения о 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>/test.
      • skipImageReferences: Ссылки на образы, которые нужно пропустить.
        • ghcr.io/trusted/*: будут пропущены только ссылки на образы в реестре ghcr.io/trusted.
      • imageRegistryCredentials:
        • allowInsecureRegistry: Разрешать ли небезопасный реестр.
        • secrets: Secrets, которые будут использоваться для учетных данных реестра образов.
          • registry-credentials: Имя Secret. Secret должен существовать в пространстве имен, где развернут kyverno.
      • attestors: Attestors, которые будут использоваться для проверки образа.
        • count: Количество attestors, которые должны совпасть.
        • entries: Записи attestors.
          • keys: Ключи attestors.
            • publicKeys: Открытые ключи attestors.
              • Этот открытый ключ совпадает с открытым ключом cosign.pub в Secret signing-secrets.
            • ctlog: ctlog attestors.
              • ignoreSCT: Игнорировать ли SCT.
                • В изолированных сетевых средах сначала игнорируйте SCT.
            • rekor: rekor attestors.
              • 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. Рассмотреть возможность внедрения дополнительных мер безопасности, таких как сканирование уязвимостей

    Ссылки