Поделиться через


Подписывание и проверка образа контейнера с нотацией в Azure Pipeline

Задача нотации в Azure DevOps — это встроенная задача для подписывания и проверки образов контейнеров и других артефактов Open Container Initiative (OCI) в Azure Pipeline. Задача нотации использует интерфейс командной строки нотации для выполнения этих операций, гарантируя, что артефакты подписаны доверенной сущностью и не были изменены с момента их создания.

В этой статье описывается создание конвейера Azure, который создает образ контейнера, отправляет его в ACR и добавляет подписи с помощью нотации и подключаемого модуля Azure Key Vault, обеспечивающего уровень безопасности и целостности артефактов. Цель конвейера состоит в том, чтобы:

  1. Создайте образ контейнера и отправьте его в Реестр контейнеров Azure (ACR).
  2. Подписывание образа с помощью подключаемого модуля Нотации и нотации 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 задач нотации следующим образом:

    1. Войдите в свою организацию (https://dev.azure.com/{yourorganization}) и выберите проект.
    2. Нажмите кнопку Параметры в левом нижнем углу.
    3. Перейдите к конвейерам и выберите подключение службы.
    4. Выберите новое подключение к службе и выберите "Реестр Docker".
    5. Затем выберите Реестр контейнеров Azure.
    6. Выберите принцип службы в типе проверки подлинности и введите сведения о субъекте-службе, включая подписку Azure и реестр ACR.
    7. Введите понятное имя Подключение, используемое при обращении к этому подключению к службе.
  • Создайте подключение службы Azure Resource Manager в Azure Pipelines для авторизации доступа к Azure Key Vault:

    1. Выберите субъект-службу (автоматически).
    2. Затем выберите подписку и найдите подписку Azure из раскрывающегося списка.
    3. Выберите доступную группу ресурсов из раскрывающегося списка.
    4. Введите понятное имя подключения службы, используемое при обращении к этому подключению к службе.
    5. Сохраните его, чтобы завершить создание.
  • Предоставьте политику доступа субъекту-службе, выполнив следующие действия:

    1. Откройте созданное подключение службы Azure Resource Manager и нажмите кнопку "Управление субъектом-службой ", чтобы войти на портал субъекта-службы Azure.
    2. Скопируйте Application (client) ID. Он будет использоваться для предоставления разрешения субъекту-службе.
    3. Откройте портал Azure Key Vault и введите страницу "Политики доступа".
    4. Создайте новую политику доступа с key signsecret get разрешением и certificate get разрешением.
    5. Предоставьте этой новой политике доступа принципу службы, используя Application (client) ID вставку из предыдущего шага.
    6. Сохраните его, чтобы завершить создание.

Дополнительные сведения о подключении к службе см. здесь.

Создание конвейера и использование задачи нотации

Создайте конвейер Azure для репозитория Git, выполнив следующие действия.

  1. Перейдите к проекту в организации AOD.
  2. Перейдите к конвейерам в меню слева и выберите "Создать конвейер".
  3. Выберите репозиторий Git. Мы используем репозиторий Azure DevOps для демонстрации удобства.
  4. Настройте конвейер с помощью начального конвейера , если вы не знакомы с Azure DevOps. Просмотрите и создайте конвейер, нажав кнопку "Сохранить и запустить".

Примечание.

В примере предполагается, что ветвь по умолчанию .main Если это не так, следуйте руководству, чтобы обновить ветвь по умолчанию.

Существует два способа добавления задач нотации путем редактирования конвейера Azure:

Используйте панель Azure DevOps (ADO): панель ADO предоставляет пользовательский интерфейс, в котором можно добавлять задачи в конвейер. Вы можете искать задачи нотации и добавлять их в конвейер с помощью этого интерфейса.

Скопируйте из примера файла Azure Pipeline: если у вас есть пример файла Azure Pipeline, который уже включает задачи нотации, можно скопировать эти задачи из примера файла и вставить их в файл конвейера.

Вариант 1. Использование панели редактирования Azure DevOps (ADO)

Docker Выполните поиск задачи на панели редактирования конвейера справа. Используйте ее login команду с подключением службы реестра Docker для проверки подлинности с помощью ACR.

  1. Выберите подключение службы реестра Docker, созданное на предыдущем шаге из раскрывающегося списка реестра контейнеров.
  2. Выберите в раскрывающемся login списке "Команда ".
  3. Нажмите кнопку "Добавить", чтобы добавить задачу Docker с login командой в файл конвейера слева.

Аналогичным образом снова выполните поиск Docker задачи из панели редактирования конвейера. Используйте ее buildAndPush команду для автоматического создания исходного кода в образ и отправки его в целевой репозиторий ACR. Он создаст дайджест изображения, который будет использоваться для входа на следующем шаге.

  1. Введите имя репозитория в репозиторий контейнеров.
  2. Выберите buildAndPush из раскрывающегося списка команд .
  3. Укажите путь к файлу Dockerfile. Например, используйте ./Dockerfile , если файл Dockerfile хранится в корневой папке.
  4. Нажмите кнопку "Добавить", чтобы добавить задачу Docker с buildAndPush командой в файл конвейера слева.

Notation Выполните поиск задачи на панели редактирования конвейера справа.

  1. Выберите "Установить" из раскрывающегося списка , чтобы выполнить команду.
  2. Нажмите кнопку "Добавить ", чтобы добавить notation install задачу в конвейер.
  3. Аналогичным образом выполните поиск Notation задачи на панели редактирования конвейера и нажмите кнопку "Подписать".
  4. Вы можете пропустить ссылки на Артефакты, так как мы подписываем образ с помощью своего последнего дайджеста, созданного и отправленного в реестр задачей Docker. Вместо этого можно вручную указать дайджест с помощью <registry_host>/<repository>@<digest>.
  5. Заполните конфигурацию подключаемого модуля в форме. Мы будем использовать подключаемый модуль AKV по умолчанию и подключение службы, созданное на предыдущем шаге. Скопируйте идентификатор ключа из AKV в идентификатор ключа.
  6. Установите флажок " Самозаверяющий сертификат ", так как мы используем самозаверяющий сертификат для удобства демонстрации. Вместо этого можно ввести путь к файлу сертификата в пути к файлу пакета сертификатов, если вы хотите использовать выданный сертификат ЦС.
  7. Нажмите кнопку "Добавить ", notation sign чтобы добавить файл конвейера слева.

Вариант 2. Изменение примера файла Azure Pipeline

  1. Если вы знакомы с Azure Pipelines и Нотацией, можно начать с файла конвейера шаблона.
  2. Скопируйте шаблон конвейера, предоставленный в документе, в собственный файл конвейера. Этот шаблон предназначен для использования задач нотации, которые используются для подписывания и проверки образов контейнеров.
  3. После копирования шаблона заполните необходимые значения в соответствии со ссылками и комментариями, приведенными ниже.
См. шаблон задачи подписывания параметра 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 и проверить его выполнение.

  1. После заполнения входных данных в конвейере сохраните и запустите его, чтобы активировать конвейер.
  2. Перейдите на страницу задания запущенного конвейера. Здесь можно увидеть выполнение каждого шага. Этот конвейер будет создавать и подписывать последнюю сборку или указанный дайджест, а затем отправить подписанный образ вместе с связанной с ней подписью в реестр.
  3. После успешного выполнения изображение будет отправлено в Реестр контейнеров Azure (ACR) с подписью и подписью формата CBOR (COSE).

Проверка подписанного образа

Аналогичным образом, чтобы проверить подписанный образ, можно использовать панель редактирования или изменить файл конвейера, чтобы добавить задачу нотации verify в конвейер. Конвейер проверяет подписанный образ с помощью политики доверия и хранилища доверия, предоставленного вами.

Подготовка политики доверия нотации и хранилища доверия

Как правило, средство проверки отличается от подписывателя. Для демонстрационных целей мы используем тот же конвейер и репозиторий ADO в этом примере. Выполните следующие действия, чтобы создать политику доверия нотации, хранилище доверия и добавить verify задачу в конвейер:

  1. В текущем репозитории 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": [
                "*"
            ]
        }
    ]
}
  1. В текущем репозитории 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
  1. Отправьте сертификат в папку /.pipeline/truststore/x509/ca/$<yourTrustStore>/ хранилища доверия, созданную на последнем шаге.

Добавление задачи проверки нотации

  1. Выполните поиск задачи нотации на панели редактирования конвейера и нажмите кнопку "Проверить".
  2. Заполните ссылки на артефакт с дайджестом подписанного изображения.
  3. Введите значение .pipeline/trustpolicy/trustpolicy.json в пути к файлу политики доверия.
  4. Введите значение .pipeline/truststore/ в пути к папке хранилища доверия.
  5. Нажмите кнопку "Добавить", чтобы добавить нотацию в файл конвейера слева.

Вы 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 или изменить файл конвейера для добавления задач Нотации в конвейер. Конвейер будет создавать, отправлять, подписывать и проверять образ с помощью политики доверия и хранилища доверия, предоставленного вами. Этот процесс гарантирует, что артефакты подписаны доверенной сущностью и не были изменены с момента их создания.