• Русский
  • (Необязательно) Проверка подписи без ключей

    TIP
    • Если вас интересует проверка подписи без ключей, продолжайте читать следующий материал.
    • Содержимое этой главы должно иметь доступ к общедоступной сети.
    • Однако, если вы уже развернули частные службы Rekor, вы можете использовать их.
    NOTE
    • Этот метод требует, чтобы среда имела доступ к Интернету.
    • Если вы развернули частные службы Rekor, вы также можете использовать эти возможности, скорректировав соответствующие настройки.
    • Развертывание частных служб Rekor выходит за рамки этого документа, пожалуйста, обратитесь к соответствующей документации.

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

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

    Обзор функциональности

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

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

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

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

    • Реализация подписи и проверки без ключей для образов контейнеров в кластерах Kubernetes
    • Применение политик безопасности для проверки подписей образов без управления ключами подписи
    • Настройка автоматической проверки журнала прозрачности в CI/CD pipeline
    • Обеспечение происхождения и целостности образов с помощью журналов прозрачности Rekor
    • Реализация средств контроля безопасности supply chain путем проверки подписей образов через публичные службы Rekor

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

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

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

    ШагОперацияОписание
    1Генерация ключей подписиСоздайте пару ключей для подписи артефактов с помощью cosign
    2Настройка аутентификацииНастройте учетные данные registry для отправки образов
    3Настройка Tekton ChainsНастройте Chains для использования хранилища OCI и подписи
    4Повторный запуск pipelineЗапустите новый pipeline, чтобы создать записи журнала прозрачности
    5Получение индекса журнала RekorИзвлеките индекс журнала Rekor из аннотаций PipelineRun
    6Проверка подписи RekorИспользуйте curl для получения и проверки подписи Rekor
    7Использование Rekor CLIПолучайте и проверяйте подписи с помощью инструмента rekor-cli
    8Проверка с помощью KyvernoНастройте политику Kyverno с проверкой Rekor

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

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

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

    TIP
    • Если у вас есть частные службы Rekor, вы можете задать transparency.url как URL вашего сервера Rekor.
      • transparency.url: "<https://rekor.sigstore.dev>"

    Дополнительные сведения о конфигурации см. в разделе Transparency Log

    Шаг 4: Повторно запустите pipeline, чтобы создать образ

    TIP
    • Поскольку мы изменили конфигурацию журнала прозрачности, нам нужно запустить новый pipeline в Signed Provenance.
    • Это позволит Tekton Chains создать записи журнала прозрачности для нового образа и PipelineRun.

    Шаг 5: Получите индекс журнала rekor

    Получите индекс журнала rekor из аннотаций 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 с помощью curl

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

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

    $ 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"
        }
      }
    }

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

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

    Получить подпись по индексу журнала

    # 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 .

    Получить подпись по 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: Нужно ли игнорировать журнал прозрачности.
        • Если false, сервер rekor будет проверяться.
      • url: URL сервера rekor.
        • Если не задано, будет использоваться сервер rekor по умолчанию https://rekor.sigstore.dev.
      • pubkey: Публичный ключ подписывающей стороны.
        • Если не задано, публичный ключ будет получен с сервера rekor.
        • Если сервер rekor является частным, необходимо получить публичный ключ с сервера rekor.
          • curl <https://rekor.sigstore.dev>/api/v1/log/publicKey

    Если ваш образ не подписан, 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 для подписи без ключей и интеграции с Rekor
    • Ваши образы контейнеров будут автоматически подписываться, а их подписи будут сохраняться в журналах прозрачности Rekor
    • Подписи образов можно будет проверять без управления ключами подписи
    • В указанном namespace можно будет развертывать только те образы, которые имеют действительные подписи в Rekor
    • Вы реализуете контроль безопасности supply chain без ключей, проверяя подписи образов через Rekor

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

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

    Ссылки