Подписывание образов контейнеров с помощью Нотации и Azure Key Vault с помощью самозаверяющего сертификата
Подписывание образов контейнеров — это процесс, обеспечивающий их подлинность и целостность. Это достигается путем добавления цифровой подписи в образ контейнера, который можно проверить во время развертывания. Сигнатура помогает убедиться, что изображение находится у доверенного издателя и не было изменено. Нотация — это средство открытый код цепочки поставок, разработанное нотариальной проектом, которое поддерживает подписывание и проверку образов контейнеров и других артефактов. Azure Key Vault (AKV) используется для хранения сертификатов с ключами подписывания, которые могут использоваться нотацией с подключаемым модулем Нотации AKV (azure-kv) для подписывания и проверки образов контейнеров и других артефактов. Реестр контейнеров Azure (ACR) позволяет присоединять подписи к образам контейнеров и другим артефактам, а также просматривать эти подписи.
В этом руководстве рассматриваются следующие темы:
- Установка интерфейса командной строки нотации и подключаемого модуля AKV
- Создание самозаверяющего сертификата в AKV
- Создание и отправка образа контейнера с помощью задач ACR
- Подписывание образа контейнера с помощью интерфейса командной строки нотации и подключаемого модуля AKV
- Проверка образа контейнера с помощью нотации CLI
Необходимые компоненты
- Создание или использование Реестр контейнеров Azure для хранения образов и подписей контейнеров
- Создание или использование Azure Key Vault для управления сертификатами
- Установка и настройка последних команд Azure CLI или выполнение команд в Azure Cloud Shell
Установка интерфейса командной строки нотации и подключаемого модуля AKV
Установите нотацию версии 1.1.0 в среде Linux amd64. Следуйте инструкциям по установке нотации, чтобы скачать пакет для других сред.
# Download, extract and install curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.1.0/notation_1.1.0_linux_amd64.tar.gz tar xvzf notation.tar.gz # Copy the Notation binary to the desired bin directory in your $PATH, for example cp ./notation /usr/local/bin
Установите подключаемый модуль
azure-kv
Нотации Azure Key Vault версии 1.0.2 в среде Linux amd64.Примечание.
URL-адрес и SHA256 проверка sum для подключаемого модуля Нотации Azure Key Vault можно найти на странице выпуска подключаемого модуля.
notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.0.2/notation-azure-kv_1.0.2_linux_amd64.tar.gz --sha256sum f2b2e131a435b6a9742c202237b9aceda81859e6d4bd6242c2568ba556cee20e
Список доступных подключаемых модулей и убедитесь, что
azure-kv
подключаемый модуль с версией1.0.2
включен в список.notation plugin ls
Настройка переменных среды
Примечание.
Для упрощения выполнения команд из учебника укажите значения для ресурсов Azure, чтобы они соответствовали существующим ресурсам ACR и AKV.
Настройте имена ресурсов AKV.
# Name of the existing AKV used to store the signing keys AKV_NAME=myakv # Name of the certificate created in AKV CERT_NAME=wabbit-networks-io CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US" CERT_PATH=./${CERT_NAME}.pem
Настройте имена ресурсов ACR и изображений.
# Name of the existing registry example: myregistry.azurecr.io ACR_NAME=myregistry # Existing full domain of the ACR REGISTRY=$ACR_NAME.azurecr.io # Container name inside ACR where image will be stored REPO=net-monitor TAG=v1 IMAGE=$REGISTRY/${REPO}:$TAG # Source code directory containing Dockerfile to build IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main
Вход с помощью Azure CLI
az login
Дополнительные сведения о Azure CLI и его входе см. в статье "Вход с помощью Azure CLI".
Назначение политики доступа в AKV (Azure CLI)
Субъект-пользователь с правильными разрешениями политики доступа необходим для создания самозаверяющего сертификата и подписывания артефактов. Этот субъект может быть субъектом-пользователем, субъектом-службой или управляемым удостоверением. Как минимум, этому субъекту требуются следующие разрешения:
Create
разрешения для сертификатовGet
разрешения для сертификатовSign
разрешения для ключей
В этом руководстве политика доступа назначается пользователю Azure, вошедшего в систему. Дополнительные сведения о назначении политики субъекту см. в статье "Назначение политики доступа".
Задайте подписку, содержащую ресурс AKV
az account set --subscription <your_subscription_id>
Настройка политики доступа в AKV
USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --certificate-permissions create get --key-permissions sign --object-id $USER_ID
Внимание
В этом примере показаны минимальные разрешения, необходимые для создания сертификата и подписывания образа контейнера. В зависимости от ваших требований может потребоваться предоставить дополнительные разрешения.
Создание самозаверяющего сертификата в AKV (Azure CLI)
Ниже показано, как создать самозаверяющий сертификат для тестирования.
Создайте файл политики сертификата.
После выполнения файла политики сертификата, как показано ниже, он создает допустимый сертификат, совместимый с требованием сертификата нотаричного проекта в AKV. Значение для
ekus
подписывания кода, но не требуется для нотации для подписывания артефактов. Тема используется позже в качестве удостоверения доверия, которое пользователь доверяет во время проверки.cat <<EOF > ./my_policy.json { "issuerParameters": { "certificateTransparency": null, "name": "Self" }, "keyProperties": { "exportable": false, "keySize": 2048, "keyType": "RSA", "reuseKey": true }, "secretProperties": { "contentType": "application/x-pem-file" }, "x509CertificateProperties": { "ekus": [ "1.3.6.1.5.5.7.3.3" ], "keyUsage": [ "digitalSignature" ], "subject": "$CERT_SUBJECT", "validityInMonths": 12 } } EOF
Создайте сертификат.
az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
Подписывание образа контейнера с помощью интерфейса командной строки нотации и подключаемого модуля AKV
Проверка подлинности в ACR с помощью отдельного удостоверения Azure.
az acr login --name $ACR_NAME
Внимание
Если вы установили Docker в системе и использовали или docker login
выполнили az acr login
проверку подлинности в ACR, ваши учетные данные уже хранятся и доступны для нотации. В этом случае вам не нужно выполнять notation login
проверку подлинности в ACR. Дополнительные сведения о параметрах проверки подлинности для нотации см. в статье Аутентификация с помощью реестров, совместимых с OCI.
Создание и отправка нового образа с помощью задач ACR. Всегда используйте значение дайджеста для идентификации изображения для подписывания, так как теги являются изменяемыми и могут быть перезаписаны.
DIGEST=$(az acr build -r $ACR_NAME -t $REGISTRY/${REPO}:$TAG $IMAGE_SOURCE --no-logs --query "outputImages[0].digest" -o tsv) IMAGE=$REGISTRY/${REPO}@$DIGEST
В этом руководстве, если образ уже создан и хранится в реестре, тег служит идентификатором этого образа для удобства.
IMAGE=$REGISTRY/${REPO}:$TAG
Получите идентификатор ключа подписывания. Сертификат в AKV может иметь несколько версий, следующая команда получает идентификатор ключа последней версии.
KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
Подписывание образа контейнера с помощью формата подписи COSE с помощью идентификатора ключа подписи. Чтобы подписаться с помощью самозаверяющего сертификата, необходимо задать значение
self_signed=true
конфигурации подключаемого модуля.notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
Просмотрите график подписанных изображений и связанных подписей.
notation ls $IMAGE
Проверка образа контейнера с помощью интерфейса командной строки нотации
Чтобы проверить образ контейнера, добавьте корневой сертификат, который подписывает конечный сертификат в хранилище доверия и создает политики доверия для проверки. Для самозаверяющего сертификата, используемого в этом руководстве, корневой сертификат — самозаверяющий сертификат.
Скачайте общедоступный сертификат.
az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
Добавьте скачанный общедоступный сертификат в именованное хранилище доверия для проверки подписи.
STORE_TYPE="ca" STORE_NAME="wabbit-networks.io" notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
Список сертификатов для подтверждения.
notation cert ls
Настройте политику доверия перед проверкой.
Политики доверия позволяют пользователям указывать настроенные политики проверки. В следующем примере настраивается политика доверия с именем
wabbit-networks-images
, которая применяется ко всем артефактам$REGISTRY/$REPO
и использует именованное хранилище$STORE_NAME
доверия типа$STORE_TYPE
. Кроме того, предполагается, что пользователь доверяет определенному удостоверению с субъектом$CERT_SUBJECT
X.509. Дополнительные сведения см . в спецификации политики доверия и хранилища доверия.cat <<EOF > ./trustpolicy.json { "version": "1.0", "trustPolicies": [ { "name": "wabbit-networks-images", "registryScopes": [ "$REGISTRY/$REPO" ], "signatureVerification": { "level" : "strict" }, "trustStores": [ "$STORE_TYPE:$STORE_NAME" ], "trustedIdentities": [ "x509.subject: $CERT_SUBJECT" ] } ] } EOF
Используется
notation policy
для импорта конфигурации политики доверия из файла JSON, созданного ранее.notation policy import ./trustpolicy.json notation policy show
Используется
notation verify
для проверки того, что образ контейнера не был изменен с момента сборки.notation verify $IMAGE
После успешной проверки изображения с помощью политики доверия возвращается дайджест sha256 проверенного образа в успешном выходном сообщении.
Следующие шаги
Ознакомьтесь с разделом "Целостность изображений", чтобы проверить подписанные образы перед развертыванием в кластерах Служба Azure Kubernetes (AKS) (предварительная версия) и Утвердить в Azure, чтобы приступить к проверке и аудиту подписанных образов перед развертыванием в AKS.