Подпишите образы контейнеров с использованием Notation и Artifact Signing.

Эта статья является частью серии по обеспечению целостности и подлинности образов контейнеров и других артефактов Open Container Initiative (OCI). Для полного рисунка начните с обзора, в котором объясняется, почему подписывание имеет значение и описывает различные сценарии.

В этой статье основное внимание уделяется подписанию с использованием инструментов проекта Notary, нотации и подписывания артефактов:

  • Что вы узнаете здесь: как использовать интерфейс командной строки Notation (CLI) для подписания артефактов с помощью Artifact Signing.
  • Применение: Подпись артефактов — это альтернатива Azure Key Vault. Хотя Key Vault предоставляет организациям полный контроль над управлением жизненным циклом сертификатов, Artifact Signing обеспечивает упрощенный интерфейс подписывания с полностью автоматизированным управлением жизненным циклом сертификатов и короткоживущими сертификатами.
  • Почему это важно: Подписывание артефактов упрощает работу разработчика, обеспечивая надежную гарантию идентификации. Это помогает командам снизить операционную сложность без ущерба для безопасности.

Предпосылки

Прежде чем можно будет подписывать и проверять образы контейнеров с помощью Notation и Artifact Signing, необходимо настроить ресурсы Azure и установить нужные инструменты. В этом разделе описывается, как подготовить реестр контейнеров Azure, настроить подпись артефактов и настроить Azure CLI в качестве вашей среды разработки.

Подготовка образов контейнеров в реестре контейнеров Azure

  1. Создайте или используйте реестр контейнеров для хранения образов контейнеров, артефактов OCI и подписей.
  2. Загрузите или используйте образ контейнера в ваш реестр контейнеров.

Настройка подписи артефактов

Настройте учетную запись подписи артефакта и профиль сертификата в подписке Azure.

Профиль сертификата должен содержать страну или регион (C), штат или провинцию (ST или S) организацию (O) в субъекте сертификата. Для спецификации нотаричного проекта требуются эти поля.

Настройка Azure CLI

Установите Azure CLI или используйте Azure Cloud Shell.

Установите Notation CLI и плагин для подписи артефактов.

В этом руководстве выполняются команды в Linux AMD64 и Windows в качестве примеров.

  1. Установите Notation CLI версии 1.3.2:

    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.3.2/notation_1.3.2_linux_amd64.tar.gz
    # Validate the checksum
    EXPECTED_SHA256SUM="e1a0f060308086bf8020b2d31defb7c5348f133ca0dba6a1a7820ef3cbb6dfe5"
    echo "$EXPECTED_SHA256SUM  notation.tar.gz" | sha256sum -c -
    # Continue if sha256sum matches
    tar xvzf notation.tar.gz
    cp ./notation /usr/local/bin
    

    Для других платформ см. руководство по установке нотации.

  2. Установите плагин для подписывания артефактов:

    notation plugin install --url "https://github.com/Azure/artifact-signing-notation-plugin/releases/download/v1.0.0/notation-azure-artifactsigning_1.0.0_linux_amd64.tar.gz" --sha256sum 2f45891a14aa9c88c9bee3d11a887c1adbe9d2d24e50de4bc4b4fa3fe595292f
    

    Ознакомьтесь с последним URL-адресом и хэш-суммой подключаемого модуля на странице выпуска.

  3. Проверьте установку подключаемого модуля:

    notation plugin ls
    

    Пример выходных данных:

    NAME                    DESCRIPTION                                             VERSION   CAPABILITIES                ERROR
    azure-artifactsigning   Sign OCI artifacts using the Artifact Signing Service   1.0.0     [SIGNATURE_GENERATOR.RAW]   <nil>
    

Настройка переменных среды

Задайте следующие переменные среды для использования в последующих командах. Замените заполнители фактическими значениями.

Необходимые значения можно найти на портале Azure:

  • Для информации об учетной записи подписывания артефактов перейдите в свою учетную запись и выберите Обзор.
  • Для получения информации о профиле сертификата перейдите в свою учетную запись и выберите Объекты>Профили сертификатов.
# Artifact Signing environment variables
AS_SUB_ID="<subscription-id>"
AS_ACCT_RG=<ts-account-resource-group>
AS_ACCT_NAME=<ts-account-name>
AS_ACCT_URL=<ts-account-url>
AS_CERT_PROFILE=<ts-cert-profile>
AS_CERT_SUBJECT=<ts-cert-subject>
AS_SIGNING_ROOT_CERT="https://www.microsoft.com/pkiops/certs/Microsoft%20Enterprise%20Identity%20Verification%20Root%20Certificate%20Authority%202020.crt"
AS_TSA_URL="http://timestamp.acs.microsoft.com/"
AS_TSA_ROOT_CERT="http://www.microsoft.com/pkiops/certs/microsoft%20identity%20verification%20root%20certificate%20authority%202020.crt"

# Azure Container Registry and image environment variables
ACR_SUB_ID="<acr-subscription-id>"
ACR_RG=<acr-resource-group>
ACR_NAME=<registry-name>
ACR_LOGIN_SERVER=$ACR_NAME.azurecr.io
REPOSITORY=<repository>
TAG=<tag>
IMAGE=$ACR_LOGIN_SERVER/${REPOSITORY}:$TAG

Вход в Azure

Используйте Azure CLI для входа с помощью удостоверения пользователя:

az login
USER_ID=$(az ad signed-in-user show --query id -o tsv)

Замечание

В этом руководстве демонстрируется вход с помощью учетной записи пользователя. Другие параметры удостоверений, включая управляемое удостоверение, см. в статье "Аутентификация в Azure" с помощью Azure CLI.

Назначение разрешений для реестра контейнеров Azure и подписывания артефактов

Предоставьте учетной записи необходимые роли для доступа к реестру контейнеров:

  • Для реестров с поддержкой управления доступом на основе атрибутов (ABAC) назначьте:
    • Container Registry Repository Reader
    • Container Registry Repository Writer
  • Для реестров, отличных от ABAC, назначьте:
    • AcrPull
    • AcrPush
az role assignment create --role "Container Registry Repository Reader" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
az role assignment create --role "Container Registry Repository Writer" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"

Назначьте роль Artifact Signing Certificate Profile Signer вашему удостоверению, чтобы вы могли подписывать с использованием Artifact Signing.

az role assignment create --assignee $USER_ID --role "Artifact Signing Certificate Profile Signer" --scope "/subscriptions/$AS_SUB_ID/resourceGroups/$AS_ACCT_RG/providers/Microsoft.CodeSigning/codeSigningAccounts/$AS_ACCT_NAME/certificateProfiles/$AS_CERT_PROFILE"

Подпишите образ контейнера

# Authenticate to Azure Container Registry
az acr login --name $ACR_NAME

# Download the timestamping root certificate
curl -o msft-tsa-root-certificate-authority-2020.crt $AS_TSA_ROOT_CERT

# Sign the image
notation sign --signature-format cose --timestamp-url $AS_TSA_URL --timestamp-root-cert "msft-tsa-root-certificate-authority-2020.crt" --id $AS_CERT_PROFILE --plugin azure-artifactsigning --plugin-config accountName=$AS_ACCT_NAME --plugin-config baseUrl=$AS_ACCT_URL --plugin-config certProfile=$AS_CERT_PROFILE $IMAGE

Основные флаги описаны:

  • --signature-format cose: использует формат объектной подписи и шифрования CBOR (COSE) для создания подписей.
  • --timestamp-url: использует сервер метки времени, который поддерживает подписывание артефактов.
  • --plugin-config: передает конфигурацию подключаемого модуля подписи Артефакта.

Список подписанных изображений и подписей:

notation ls $IMAGE

Пример выходных данных:

myregistry.azurecr.io/myrepo@sha256:5d0bf1e8f5a0c74a4c22d8c0f962a7cfa06a4f9d8423b196e482df8af23b5d55
└── application/vnd.cncf.notary.signature
    └── sha256:d3a4c9fbc17e27b19a0b28e7b6a33f2c0f541dbdf8d2e5e8d0d79a835e8a76f2a

Проверка образа контейнера

  1. Скачайте и добавьте корневые сертификаты:

    curl -o msft-root-certificate-authority-2020.crt $AS_SIGNING_ROOT_CERT
    SIGNING_TRUST_STORE="myRootCerts"
    notation cert add --type ca --store $SIGNING_TRUST_STORE msft-root-certificate-authority-2020.crt
    
    curl -o msft-tsa-root-certificate-authority-2020.crt $AS_TSA_ROOT_CERT
    TSA_TRUST_STORE="myTsaRootCerts"
    notation cert add -t tsa -s $TSA_TRUST_STORE msft-tsa-root-certificate-authority-2020.crt
    notation cert ls
    

  1. Создайте JSON-файл политики доверия:

    cat <<EOF > trustpolicy.json
    {
        "version": "1.0",
        "trustPolicies": [
            {
                "name": "myPolicy",
                "registryScopes": [ "$ACR_LOGIN_SERVER/$REPOSITORY" ],
                "signatureVerification": {
                    "level" : "strict"
                },
                "trustStores": [ "ca:$SIGNING_TRUST_STORE", "tsa:$TSA_TRUST_STORE" ],
                "trustedIdentities": [
                    "x509.subject: $AS_CERT_SUBJECT"
                ]
            }
        ]
    }
    EOF
    

    Импортируйте и проверьте политику:

    notation policy import trustpolicy.json
    notation policy show
    

  1. Проверьте изображение:

    notation verify $IMAGE
    

    Пример выходных данных:

    Successfully verified signature for myregistry.azurecr.io/myrepo@sha256:5d0bf1e8f5a0c74a4c22d8c0f962a7cfa06a4f9d8423b196e482df8af23b5d55
    

    Если проверка завершается ошибкой, убедитесь, что политика доверия и сертификаты настроены правильно.