Подписывание и проверка образа контейнера с нотацией в Azure Pipeline
Задача нотации в Azure DevOps — это встроенная задача для подписывания и проверки образов контейнеров и других артефактов Open Container Initiative (OCI) в Azure Pipeline. Задача нотации использует интерфейс командной строки нотации для выполнения этих операций, гарантируя, что артефакты подписаны доверенной сущностью и не были изменены с момента их создания.
В этой статье описывается создание конвейера Azure, который создает образ контейнера, отправляет его в ACR и добавляет подписи с помощью нотации и подключаемого модуля Azure Key Vault, обеспечивающего уровень безопасности и целостности артефактов. Цель конвейера состоит в том, чтобы:
- Создайте образ контейнера и отправьте его в Реестр контейнеров Azure (ACR).
- Подписывание образа с помощью подключаемого модуля Нотации и нотации Azure Key Vault. Затем подпись автоматически отправляется в ACR.
Необходимые компоненты
- Создайте Key Vault в Azure Key Vault и создайте самозаверяющий ключ подписи и сертификат. Этот документ можно использовать для создания самозаверяющего ключа и сертификата для тестирования. Если у вас есть сертификат, выданный ЦС, обратитесь к этому документу для получения дополнительных сведений.
- Создайте реестр в Реестр контейнеров Azure (ACR).
- Убедитесь, что у вас есть репозиторий Azure DevOps или репозиторий GitHub.
Создание службы Подключение
Создайте подключение к службе в Azure Pipelines, что позволяет конвейеру получать доступ к внешним службам, таким как Реестр контейнеров Azure (ACR), вы можете выполнить следующие действия:
Войдите изображение в Реестр контейнеров Azure (ACR) с помощью учетных данных ACR.
Используйте задачу Docker в Azure Pipelines для входа в ACR. Задача Docker — это встроенная задача в Azure Pipelines, которая позволяет создавать, отправлять и извлекать образы Docker, помимо прочего.
Установите подключение службы реестра Docker в Azure Pipeline для предоставления доступа к реестру ACR задач нотации следующим образом:
- Войдите в свою организацию (
https://dev.azure.com/{yourorganization}
) и выберите проект. - Нажмите кнопку Параметры в левом нижнем углу.
- Перейдите к конвейерам и выберите подключение службы.
- Выберите новое подключение к службе и выберите "Реестр Docker".
- Затем выберите Реестр контейнеров Azure.
- Выберите принцип службы в типе проверки подлинности и введите сведения о субъекте-службе, включая подписку Azure и реестр ACR.
- Введите понятное имя Подключение, используемое при обращении к этому подключению к службе.
- Войдите в свою организацию (
Создайте подключение службы Azure Resource Manager в Azure Pipelines для авторизации доступа к Azure Key Vault:
- Выберите субъект-службу (автоматически).
- Затем выберите подписку и найдите подписку Azure из раскрывающегося списка.
- Выберите доступную группу ресурсов из раскрывающегося списка.
- Введите понятное имя подключения службы, используемое при обращении к этому подключению к службе.
- Сохраните его, чтобы завершить создание.
Предоставьте политику доступа субъекту-службе, выполнив следующие действия:
- Откройте созданное подключение службы Azure Resource Manager и нажмите кнопку "Управление субъектом-службой ", чтобы войти на портал субъекта-службы Azure.
- Скопируйте
Application (client) ID
. Он будет использоваться для предоставления разрешения субъекту-службе. - Откройте портал Azure Key Vault и введите страницу "Политики доступа".
- Создайте новую политику доступа с
key sign
secret get
разрешением иcertificate get
разрешением. - Предоставьте этой новой политике доступа принципу службы, используя
Application (client) ID
вставку из предыдущего шага. - Сохраните его, чтобы завершить создание.
Дополнительные сведения о подключении к службе см. здесь.
Создание конвейера и использование задачи нотации
Создайте конвейер Azure для репозитория Git, выполнив следующие действия.
- Перейдите к проекту в организации AOD.
- Перейдите к конвейерам в меню слева и выберите "Создать конвейер".
- Выберите репозиторий Git. Мы используем репозиторий Azure DevOps для демонстрации удобства.
- Настройте конвейер с помощью начального конвейера , если вы не знакомы с Azure DevOps. Просмотрите и создайте конвейер, нажав кнопку "Сохранить и запустить".
Примечание.
В примере предполагается, что ветвь по умолчанию .main
Если это не так, следуйте руководству, чтобы обновить ветвь по умолчанию.
Существует два способа добавления задач нотации путем редактирования конвейера Azure:
Используйте панель Azure DevOps (ADO): панель ADO предоставляет пользовательский интерфейс, в котором можно добавлять задачи в конвейер. Вы можете искать задачи нотации и добавлять их в конвейер с помощью этого интерфейса.
Скопируйте из примера файла Azure Pipeline: если у вас есть пример файла Azure Pipeline, который уже включает задачи нотации, можно скопировать эти задачи из примера файла и вставить их в файл конвейера.
Вариант 1. Использование панели редактирования Azure DevOps (ADO)
Docker
Выполните поиск задачи на панели редактирования конвейера справа. Используйте ее login
команду с подключением службы реестра Docker для проверки подлинности с помощью ACR.
- Выберите подключение службы реестра Docker, созданное на предыдущем шаге из раскрывающегося списка реестра контейнеров.
- Выберите в раскрывающемся
login
списке "Команда ". - Нажмите кнопку "Добавить", чтобы добавить задачу Docker с
login
командой в файл конвейера слева.
Аналогичным образом снова выполните поиск Docker
задачи из панели редактирования конвейера. Используйте ее buildAndPush
команду для автоматического создания исходного кода в образ и отправки его в целевой репозиторий ACR. Он создаст дайджест изображения, который будет использоваться для входа на следующем шаге.
- Введите имя репозитория в репозиторий контейнеров.
- Выберите buildAndPush из раскрывающегося списка команд .
- Укажите путь к файлу Dockerfile. Например, используйте
./Dockerfile
, если файл Dockerfile хранится в корневой папке. - Нажмите кнопку "Добавить", чтобы добавить задачу Docker с
buildAndPush
командой в файл конвейера слева.
Notation
Выполните поиск задачи на панели редактирования конвейера справа.
- Выберите "Установить" из раскрывающегося списка , чтобы выполнить команду.
- Нажмите кнопку "Добавить ", чтобы добавить
notation install
задачу в конвейер. - Аналогичным образом выполните поиск
Notation
задачи на панели редактирования конвейера и нажмите кнопку "Подписать". - Вы можете пропустить ссылки на Артефакты, так как мы подписываем образ с помощью своего последнего дайджеста, созданного и отправленного в реестр задачей Docker. Вместо этого можно вручную указать дайджест с помощью
<registry_host>/<repository>@<digest>
. - Заполните конфигурацию подключаемого модуля в форме. Мы будем использовать подключаемый модуль AKV по умолчанию и подключение службы, созданное на предыдущем шаге. Скопируйте идентификатор ключа из AKV в идентификатор ключа.
- Установите флажок " Самозаверяющий сертификат ", так как мы используем самозаверяющий сертификат для удобства демонстрации. Вместо этого можно ввести путь к файлу сертификата в пути к файлу пакета сертификатов, если вы хотите использовать выданный сертификат ЦС.
- Нажмите кнопку "Добавить ",
notation sign
чтобы добавить файл конвейера слева.
Вариант 2. Изменение примера файла Azure Pipeline
- Если вы знакомы с Azure Pipelines и Нотацией, можно начать с файла конвейера шаблона.
- Скопируйте шаблон конвейера, предоставленный в документе, в собственный файл конвейера. Этот шаблон предназначен для использования задач нотации, которые используются для подписывания и проверки образов контейнеров.
- После копирования шаблона заполните необходимые значения в соответствии со ссылками и комментариями, приведенными ниже.
См. шаблон задачи подписывания параметра 1 (щелкните здесь).
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
# log in to registry
- task: Docker@2
inputs:
containerRegistry: <your_docker_registry_service_connection>
command: 'login'
# build and push artifact to registry
- task: Docker@2
inputs:
repository: <your_repository_name>
command: 'buildAndPush'
Dockerfile: './Dockerfile'
# install notation
- task: Notation@0
inputs:
command: 'install'
version: '1.1.0'
# automatically detect the artifact pushed by Docker task and sign the artifact.
- task: Notation@0
inputs:
command: 'sign'
plugin: 'azureKeyVault'
akvPluginVersion: <azure_key_vault_plugin_version>
azurekvServiceConection: <your_akv_service_connection>
keyid: <your_key_id>
selfSigned: true
Примечание.
Помимо использования задачи Docker, можно подписать указанный дайджест изображения, вручную указав ссылку на артефакт, artifactRefs
как показано ниже.
См. пример (щелкните здесь).
# sign the artifact
- task: Notation@0
inputs:
artifactRefs: '<registry_host>/<repository>@<digest>'
command: 'sign'
plugin: 'azureKeyVault'
akvPluginVersion: <azure_key_vault_plugin_version>
azurekvServiceConection: <akv_service_connection>
keyid: <key_id>
selfSigned: true
Активация конвейера
Выполните действия, чтобы запустить конвейер в Azure DevOps и проверить его выполнение.
- После заполнения входных данных в конвейере сохраните и запустите его, чтобы активировать конвейер.
- Перейдите на страницу задания запущенного конвейера. Здесь можно увидеть выполнение каждого шага. Этот конвейер будет создавать и подписывать последнюю сборку или указанный дайджест, а затем отправить подписанный образ вместе с связанной с ней подписью в реестр.
- После успешного выполнения изображение будет отправлено в Реестр контейнеров Azure (ACR) с подписью и подписью формата CBOR (COSE).
Проверка подписанного образа
Аналогичным образом, чтобы проверить подписанный образ, можно использовать панель редактирования или изменить файл конвейера, чтобы добавить задачу нотации verify
в конвейер. Конвейер проверяет подписанный образ с помощью политики доверия и хранилища доверия, предоставленного вами.
Подготовка политики доверия нотации и хранилища доверия
Как правило, средство проверки отличается от подписывателя. Для демонстрационных целей мы используем тот же конвейер и репозиторий ADO в этом примере. Выполните следующие действия, чтобы создать политику доверия нотации, хранилище доверия и добавить verify
задачу в конвейер:
- В текущем репозитории ADO создайте образец папки
.pipeline
для хранения политики.pipeline/trustpolicy/
доверия нотации. Создайте пример JSON-файлаtrustpolicy.json
политики доверия. Заполните шаблон политики доверия собственными значениями и сохраните его в папке.
Примечание.
Обратите внимание, что Хранилище доверия нотации поддерживает в настоящее время три типа удостоверений, включая центр сертификации (ЦС), подписьAuthority и корневые сертификаты центра метки времени (TSA). Для демонстрационных целей мы используем центр сертификации (ЦС) x509/ca
в политике доверия и хранилище доверия ниже. Дополнительные сведения см . в хранилище доверия.
См. шаблон политики доверия (щелкните здесь).
{
"version": "1.0",
"trustPolicies": [
{
"name": "<yourPolicyName>",
"registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
"signatureVerification": {
"level" : "strict"
},
"trustStores": [ "ca:<yourTrustStore>"],
"trustedIdentities": [
"*"
]
}
]
}
- В текущем репозитории ADO создайте новую папку для хранилища доверия
/.pipeline/truststore/x509/ca/$<yourTrustStore>/
нотации для хранения сертификата. Если вы выполнили шаги подписывания в этом документе, чтобы подписать образ, используйте следующую команду, чтобы скачать самозаверяющий сертификат из Azure Key Vault (AKV):
KEY_NAME=<key_name_you_picked_when_creating_the_key>
AKV_NAME=<akv_name_where_certificate_is_stored>
CERT_ID=$(az keyvault certificate show -n $KEY_NAME --vault-name $AKV_NAME --query 'id' -o tsv)
CERT_PATH=./${KEY_NAME}.pem
az keyvault certificate download --file $CERT_PATH --id $CERT_ID --encoding PEM
- Отправьте сертификат в папку
/.pipeline/truststore/x509/ca/$<yourTrustStore>/
хранилища доверия, созданную на последнем шаге.
Добавление задачи проверки нотации
- Выполните поиск задачи нотации на панели редактирования конвейера и нажмите кнопку "Проверить".
- Заполните ссылки на артефакт с дайджестом подписанного изображения.
- Введите значение
.pipeline/trustpolicy/trustpolicy.json
в пути к файлу политики доверия. - Введите значение
.pipeline/truststore/
в пути к папке хранилища доверия. - Нажмите кнопку "Добавить", чтобы добавить нотацию в файл конвейера слева.
Вы notation verify
будете сохранены следующим образом.
См. пример (щелкните здесь).
# sign the artifact
- task: Notation@0
inputs:
command: 'verify'
artifactRefs: '<registry_host>/<repository>@<digest>'
trustPolicy: .pipeline/trustpolicy.json
trustStore: .pipeline/truststore/
Активация конвейера (обновлено)
Вы можете снова активировать конвейер, чтобы проверить подписанный образ. После успешного выполнения журналы можно просмотреть на странице задания запущенного конвейера. Конвейер проверяет подписанный образ с помощью политики доверия и хранилища доверия, предоставленного вами.
Заключение
В этой статье показано, как подписать и проверить образ контейнера с нотацией в Azure Pipeline. Вы можете использовать панель Azure DevOps или изменить файл конвейера для добавления задач Нотации в конвейер. Конвейер будет создавать, отправлять, подписывать и проверять образ с помощью политики доверия и хранилища доверия, предоставленного вами. Этот процесс гарантирует, что артефакты подписаны доверенной сущностью и не были изменены с момента их создания.