• Русский
  • (Optional) Проверка keyless signing

    TIP
    • Если вас интересует проверка keyless signing, вы можете продолжить чтение следующего материала.
    • Для работы с содержимым этой главы требуется доступ к публичной сети.
    • Однако вы можете использовать private Rekor services, если уже развернули их.
    NOTE
    • Для этого метода требуется, чтобы среда имела доступ к Internet.
    • Если вы развернули private Rekor services, вы также можете использовать эти возможности, скорректировав соответствующие настройки.
    • Развертывание private Rekor services не входит в область применения этого документа, пожалуйста, обратитесь к соответствующей документации.

    Хотя ACP (Alauda Container Platform) в настоящее время не предоставляет возможность развертывания private Rekor instances, она поддерживает интеграцию с Rekor services.

    Здесь в качестве примера интеграции с public Rekor мы покажем, как использовать эти services. Если вы уже развернули private Rekor services, обратитесь к соответствующей документации для настройки.

    Обзор возможностей

    Этот метод использует transparency logs для повышения безопасности, устраняя необходимость в управлении ключами:

    1. Настроить Tekton Chains для использования keyless signing.
    2. Использовать Tekton Task buildah для сборки image.
    3. Настроить правила Kyverno для проверки keyless signature.
    4. Использовать image для создания Pod, чтобы проверить keyless signature.

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

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

    • Реализация keyless signing и verification для container images в Kubernetes clusters
    • Принудительное применение security policies для проверки image signatures без управления signing keys
    • Настройка автоматической проверки transparency log в CI/CD pipelines
    • Обеспечение provenance и integrity image через Rekor transparency logs
    • Реализация controls безопасности supply chain путем проверки image signatures по public Rekor services

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

    • Kubernetes cluster с установленными Tekton Pipelines, Tekton Chains и Kyverno
    • Registry с включенной возможностью загрузки image
    • Установленный и настроенный kubectl CLI для доступа к вашему cluster
    • Установленный cosign CLI tool
    • Установленный jq CLI tool
    • Установленный curl
    • Установленный rekor-cli
      • Используется для проверки и взаимодействия с attestations, хранящимися на сервере Rekor transparency log.

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

    ШагОперацияОписание
    1Generate Signing KeysСоздать пару ключей для подписания artifacts с помощью cosign
    2Set up AuthenticationНастроить учетные данные registry для загрузки image
    3Configure Tekton ChainsНастроить Chains на использование OCI storage и конфигурацию signing
    4Re-run PipelineЗапустить новый pipeline run для создания записей transparency log
    5Get Rekor Log IndexИзвлечь Rekor log index из аннотаций PipelineRun
    6Verify Rekor SignatureИспользовать curl для получения и проверки Rekor signature
    7Use Rekor CLIПолучить и проверить signatures с помощью rekor-cli tool
    8Verify with KyvernoНастроить Kyverno policy с проверкой Rekor

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

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

    Эти шаги идентичны руководству Quick Start: Signed Provenance. Пожалуйста, следуйте инструкциям в этом руководстве для выполнения следующих шагов:

    TIP
    • Если у вас есть private Rekor services, вы можете установить transparency.url в URL вашего Rekor server.
      • transparency.url: "<https://rekor.sigstore.dev>"

    Подробнее о настройке см. в Transparency Log

    Шаг 4: Повторно запустите pipeline для создания image

    TIP
    • Поскольку мы изменили настройку transparency log, нам нужно запустить новый pipeline run в Signed Provenance.
    • Это позволит Tekton Chains создать записи transparency log для нового image и PipelineRun.

    Шаг 5: Получите rekor log index

    Получите rekor log index из аннотаций PipelineRun.

    $ export NAMESPACE=<pipeline-namespace>
    $ export PIPELINERUN_NAME=<pipelinerun-name>
    $ kubectl get pipelinerun -n $NAMESPACE $PIPELINERUN_NAME -o jsonpath='{.metadata.annotations.chains\.tekton\.dev/transparency}'
    
    https://rekor.sigstore.dev/api/v1/log/entries?logIndex=232330257

    Шаг 6: Получите rekor signature с помощью curl

    $ curl -s "https://rekor.sigstore.dev/api/v1/log/entries?logIndex=232330257" | jq

    Если вам нужно просмотреть содержимое rekor signature, выполните следующую команду:

    $ curl -s "https://rekor.sigstore.dev/api/v1/log/entries?logIndex=232330257" | jq -r '.[keys[0]].attestation.data | @base64d' | jq .
    
    {
      "_type": "https://in-toto.io/Statement/v0.1",
      "subject": null,
      "predicateType": "https://slsa.dev/provenance/v0.2",
      "predicate": {
        "buildType": "tekton.dev/v1beta1/PipelineRun",
        "builder": {
          "id": "https://alauda.io/builders/tekton/v1"
        },
        "materials": [
          {
            "digest": {
              "sha256": "8d5ea9ecd9b531e798fecd87ca3b64ee1c95e4f2621d09e893c58ed593bfd4c4"
            },
            "uri": "oci://<registry>/devops/tektoncd/hub/buildah"
          }
        ],
        "metadata": {
          "buildFinishedOn": "2025-06-08T03:11:52Z",
          "buildStartedOn": "2025-06-08T03:10:33Z"
        }
      }
    }

    Это содержимое совпадает с attestation в image, что подтверждает подлинность и целостность содержимого image. Информацию об attestation можно получить из Rekor без необходимости использовать учетные данные registry image, что делает проверку более удобной и доступной.

    Шаг 7: Получите rekor signature с помощью rekor-cli

    Получите signature по log index

    # the log index is same as the one in the annotations of the PipelineRun
    $ rekor-cli get --log-index 232330257 --format json | jq -r .Attestation | jq .

    Получите signature по image digest

    # get the uuid by image digest
    $ rekor-cli search --sha da4885861a8304abad71fcdd569c92daf33422073d1102013a1fed615dfb285a
    
    Found matching entries (listed by UUID):
    108e9186e8c5677a1364e68001a916d3a7316bc2580bd6b5fbbce39a9c62f13282d3e974a6b434ab
    
    # get the signature by uuid
    $ rekor-cli get --uuid 108e9186e8c5677a1364e68001a916d3a7316bc2580bd6b5fbbce39a9c62f13282d3e974a6b434ab --format json | jq -r .Attestation | jq .

    Шаг 8: Проверьте Rekor в Kyverno

    Измените секцию keys в ClusterPolicy, чтобы добавить проверку Rekor.

    apiVersion: kyverno.io/v1
    kind: ClusterPolicy
    metadata:
    spec:
      rules:
        - name: check-image
          verifyImages:
            - attestors:
                - count: 1
                  entries:
                    - keys:
                        publicKeys: |- # <- The public key of the signer
                          -----BEGIN PUBLIC KEY-----
                          MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFZNGfYwn7+b4uSdEYLKjxWi3xtP3
                          UkR8hQvGrG25r0Ikoq0hI3/tr0m7ecvfM75TKh5jGAlLKSZUJpmCGaTToQ==
                          -----END PUBLIC KEY-----
    
                        rekor:
                          ignoreTlog: false
                          # url: <https://rekor.sigstore.dev>
                          # # get the public key from the rekor server
                          # # curl <https://rekor.sigstore.dev>/api/v1/log/publicKey
                          # pubkey: |-
                          #   -----BEGIN PUBLIC KEY-----
                          #   MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2G2Y+2tabdTV5BcGiBIx0a9fAFwr
                          #   kBbmLSGtks4L3qX6yYY0zufBnhC8Ur/iy55GhWP/9A/bY2LhC30M9+RYtw==
                          #   -----END PUBLIC KEY-----
    Пояснение полей YAML
    • rekor: Конфигурация проверки rekor.
      • ignoreTlog: Следует ли игнорировать transparency log.
        • Если false, будет выполняться проверка rekor server.
      • url: URL rekor server.
        • Если не задан, будет использоваться сервер rekor по умолчанию https://rekor.sigstore.dev.
      • pubkey: Публичный ключ signer.
        • Если не задан, публичный ключ будет получен с rekor server.
        • Если rekor server private, необходимо получить публичный ключ с rekor server.
          • curl <https://rekor.sigstore.dev>/api/v1/log/publicKey

    Если ваш image не подписан, Pod будет заблокирован.

    Error from server: admission webhook "mutate.kyverno.svc-fail" denied the request:
    
    resource Pod/policy/sign was blocked due to the following policies
    
    only-cosign-image-deploy:
      check-image: 'failed to verify image <registry>/test/chains/demo-1:latest:
        .attestors[0].entries[0].keys: no matching signatures: searching log query: Post
        "http:///api/v1/log/entries/retrieve": POST http:///api/v1/log/entries/retrieve
        giving up after 4 attempt(s): Post "http:///api/v1/log/entries/retrieve": http:
        no Host in request URL'

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

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

    • У вас будет рабочая конфигурация Tekton Chains для keyless signing и интеграции с Rekor
    • Ваши container images будут автоматически подписываться, а их signatures будут сохраняться в Rekor transparency logs
    • Подписи image можно будет проверять без управления signing keys
    • В указанном namespace можно будет развертывать только images с действительными подписями в Rekor
    • Вы реализуете механизм безопасности supply chain без ключей, проверяя image signatures через Rekor

    Это руководство закладывает основу для внедрения keyless signing и verification в ваших CI/CD pipelines. В production environment вам следует:

    1. Настроить корректную изоляцию namespace и контроль доступа
    2. Настроить monitoring и alerting для сбоев проверки подписей
    3. Регулярно пересматривать и обновлять security policies
    4. Рассмотреть возможность развертывания private Rekor instances для повышения безопасности

    Ссылки