• Русский
  • (Optional) Проверка подписей без ключей

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

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

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

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

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

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

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

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

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

    Требования

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

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

    ШагОперацияОписание
    1Генерация ключей подписиСоздание пары ключей для подписания артефактов с помощью cosign
    2Настройка аутентификацииКонфигурация учетных данных реестра для пуша образов
    3Настройка Tekton ChainsНастройка Chains для использования OCI хранилища и подписи
    4Повторный запуск пайплайнаЗапуск нового выполнения пайплайна для создания записей журнала прозрачности
    5Получение индекса журнала RekorИзвлечение индекса журнала Rekor из аннотаций PipelineRun
    6Проверка подписи Rekor через curlИспользование 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: Повторный запуск пайплайна для генерации образа

    TIP
    • Поскольку мы изменили конфигурацию журнала прозрачности, необходимо запустить новый пайплайн в 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 без необходимости иметь учетные данные реестра образов, что делает проверку более удобной и доступной.

    Шаг 7: Получение подписи rekor через rekor-cli

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

    # индекс журнала совпадает с тем, что в аннотациях PipelineRun
    $ rekor-cli get --log-index 232330257 --format json | jq -r .Attestation | jq .

    Получить подпись по дайджесту образа

    # получить uuid по дайджесту образа
    $ rekor-cli search --sha da4885861a8304abad71fcdd569c92daf33422073d1102013a1fed615dfb285a
    
    Found matching entries (listed by UUID):
    108e9186e8c5677a1364e68001a916d3a7316bc2580bd6b5fbbce39a9c62f13282d3e974a6b434ab
    
    # получить подпись по 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: |- # <- Публичный ключ подписанта
                          -----BEGIN PUBLIC KEY-----
                          MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFZNGfYwn7+b4uSdEYLKjxWi3xtP3
                          UkR8hQvGrG25r0Ikoq0hI3/tr0m7ecvfM75TKh5jGAlLKSZUJpmCGaTToQ==
                          -----END PUBLIC KEY-----
    
                        rekor:
                          ignoreTlog: false
                          # url: <https://rekor.sigstore.dev>
                          # # получить публичный ключ с сервера rekor
                          # # 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.
        • Если не указан, используется сервер по умолчанию 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
    • Подписи образов можно проверять без управления ключами подписи
    • В указанном пространстве имён можно развертывать только образы с действительными подписями в Rekor
    • Вы реализовали контроль безопасности цепочки поставок без ключей, проверяя подписи образов через Rekor

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

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

    Ссылки