Assinar e verificar uma imagem de contêiner com a Notação no Pipeline do Azure
A tarefa Notação no Azure DevOps é uma tarefa interna para assinar e verificar imagens de contêiner e outros artefatos da OCI (Open Container Initiative) em um Pipeline do Azure. A tarefa Notação utiliza a CLI de Notação para executar essas operações, garantindo que os artefatos sejam assinados por uma entidade confiável e não tenham sido adulterados desde sua criação.
O artigo orienta você na criação de um pipeline do Azure que cria uma imagem de contêiner, envia-a por push para o ACR e adiciona assinaturas usando a Notação e o plug-in do Cofre de Chaves do Azure, fornecendo uma camada de segurança e integridade para os artefatos. O objetivo do gasoduto é:
- Crie uma imagem de contêiner e envie-a por push para o Registro de Contêiner do Azure (ACR).
- Assine a imagem com o plug-in do Cofre de Chaves do Azure de Notação e Notação. A assinatura é então enviada automaticamente para o ACR.
Pré-requisitos
- Crie um Cofre de Chaves no Cofre de Chaves do Azure e gere uma chave de assinatura e um certificado autoassinados. Você pode usar este documento para criar uma chave autoassinada e um certificado para fins de teste. Se você tiver um certificado emitido pela CA, consulte este documento para obter detalhes.
- Crie um registro no Registro de Contêiner do Azure (ACR).
- Verifique se você tem um repositório do Azure DevOps ou um repositório do GitHub.
Criar conexão de serviço
Crie uma conexão de serviço no Azure Pipelines, que permite que seu pipeline acesse serviços externos, como o Registro de Contêiner do Azure (ACR), você pode seguir estas etapas:
Assine uma imagem no Registro de Contêiner do Azure (ACR) usando credenciais ACR.
Use a tarefa do Docker no Azure Pipelines para fazer logon no ACR. A tarefa do Docker é uma tarefa interna no Azure Pipelines que permite criar, enviar e extrair imagens do Docker, entre outras coisas.
Estabeleça uma conexão de serviço do Registro do Docker no Pipeline do Azure para conceder acesso de tarefas de notação ao seu registro ACR, da seguinte maneira:
- Entre em sua organização (
https://dev.azure.com/{yourorganization}
) e selecione seu projeto. - Selecione o botão Configurações no canto inferior esquerdo.
- Vá para Pipelines e selecione Conexão de serviço.
- Escolha Nova conexão de serviço e selecione Registro do Docker.
- Em seguida, escolha Registro de Contêiner do Azure.
- Escolha Princípio de Serviço no Tipo de Autenticação e insira os detalhes da Entidade de Serviço, incluindo sua Assinatura do Azure e o registro ACR.
- Insira um Nome de conexão amigável a ser usado ao se referir a essa conexão de serviço.
- Entre em sua organização (
Crie uma conexão de serviço do Gerenciador de Recursos do Azure no Azure Pipelines para autorizar o acesso ao seu Cofre de Chaves do Azure:
- Escolha Entidade de serviço (automático).
- Em seguida, escolha Assinatura e localize sua assinatura do Azure na lista suspensa.
- Escolha um grupo de Recursos disponível na lista suspensa.
- Insira um nome de conexão de serviço amigável para usar ao se referir a essa conexão de serviço.
- Salve-o para concluir a criação.
Conceda a política de acesso à entidade de serviço seguindo estas etapas:
- Abra a conexão de serviço do Gerenciador de Recursos do Azure criada e clique em Gerenciar entidade de serviço para entrar no portal da entidade de serviço do Azure.
- Copie
Application (client) ID
. Ele será usado para conceder a permissão para a entidade de serviço. - Abra o portal do Cofre de Chaves do Azure e insira a página Políticas de Acesso.
- Crie uma nova política de acesso com
key sign
ecertificate get
secret get
permissão. - Conceda essa nova política de acesso a um princípio de serviço usando a
Application (client) ID
pasta da etapa anterior. - Salve-o para concluir a criação.
Saiba mais sobre a conexão de serviço aqui.
Criar um pipeline e usar a tarefa Notação
Crie um pipeline do Azure para seu repositório git seguindo estas etapas:
- Navegue até o projeto em sua organização AOD.
- Vá para Pipelines no menu esquerdo e selecione Novo pipeline.
- Escolha seu repositório git. Usamos o repositório de DevOps do Azure para conveniência de demonstração.
- Configure o pipeline com um Pipeline inicial se você for novo no Azure DevOps. Revise e crie o pipeline clicando em Salvar e executar.
Observação
O exemplo pressupõe que a ramificação padrão é main
. Se não estiver, siga o guia para atualizar a ramificação padrão.
Há duas maneiras de adicionar tarefas de Notação editando seu pipeline do Azure:
Use o painel Azure DevOps (ADO): o painel ADO fornece uma interface de usuário onde você pode adicionar tarefas ao seu pipeline. Você pode procurar tarefas de notação e adicioná-las ao seu pipeline usando essa interface.
Copiar de um arquivo de exemplo do Azure Pipeline: se você tiver um arquivo de exemplo do Azure Pipeline que já inclua tarefas de Notação, poderá copiar essas tarefas do arquivo de exemplo e colá-las no arquivo de pipeline.
Opção 1: Usar o painel de edição do Azure DevOps (ADO)
Pesquise a Docker
tarefa no painel de edição de pipeline no lado direito. Use seu login
comando com a conexão do serviço Registro do Docker para autenticar com o ACR.
- Escolha a conexão do serviço Registro do Docker criada na etapa anterior na lista suspensa Registro de contêiner.
- Escolha
login
na lista suspensa Comando . - Clique em Adicionar para adicionar a tarefa do Docker com
login
comando ao arquivo de pipeline à esquerda.
Da mesma forma, pesquise a Docker
tarefa no painel de edição de pipeline novamente. Use seu buildAndPush
comando para criar automaticamente o código-fonte para uma imagem e enviá-lo para o repositório ACR de destino. Ele gerará um resumo de imagem que será usado para assinatura na próxima etapa.
- Insira o nome do repositório no repositório de contêiner.
- Escolha buildAndPush na lista suspensa Comando .
- Especifique o caminho do arquivo Dockerfile. Por exemplo, use
./Dockerfile
se o Dockerfile estiver armazenado na pasta raiz. - Clique em Adicionar para adicionar a tarefa do Docker com
buildAndPush
comando ao arquivo de pipeline à esquerda.
Pesquise a Notation
tarefa no painel de edição de pipeline no lado direito.
- Escolha Instalar no comando da lista suspensa a ser executado.
- Clique em Adicionar para adicionar a
notation install
tarefa ao pipeline. - Da mesma forma, pesquise a
Notation
tarefa no painel de edição de pipeline novamente e escolha Assinar. - Você pode ignorar as referências de artefato, pois assinamos uma imagem usando seu resumo mais recente que é criado e enviado para o Registro por uma tarefa do Docker. Em vez disso, você pode especificar manualmente um resumo usando
<registry_host>/<repository>@<digest>
o . - Preencha a configuração do plugin no formulário. Usaremos o plugin AKV padrão e a conexão de serviço criada na etapa anterior. Copie o ID da Chave do AKV para o ID da Chave.
- Marque a caixa Certificado autoassinado , pois usamos um certificado autoassinado para conveniência de demonstração. Em vez disso, você pode inserir o caminho do arquivo de certificado no Caminho do Arquivo do Pacote de Certificados se quiser usar um certificado emitido pela CA.
- Clique em Adicionar para adicionar o
notation sign
ao arquivo de pipeline à esquerda.
Opção 2: Editar um arquivo de exemplo do Azure Pipeline
- Se você estiver familiarizado com o Azure Pipelines and Notation, é eficiente começar com um arquivo de pipeline de modelo.
- Copie o modelo de pipeline fornecido no documento para seu próprio arquivo de pipeline. Esse modelo foi projetado para usar tarefas de Notação, que são usadas para assinar e verificar imagens de contêiner.
- Após copiar o modelo, preencha os valores solicitados de acordo com as referências e comentários fornecidos abaixo.
Veja o modelo de tarefa de assinatura da opção 1 (Clique aqui).
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
Observação
Além de usar a tarefa do Docker, você pode assinar um resumo de imagem especificado especificando manualmente uma referência de artefato da artifactRefs
seguinte maneira.
Veja o exemplo (Clique aqui).
# 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
Disparar o pipeline
Siga as etapas para executar um pipeline no Azure DevOps e verificar sua execução.
- Depois de preencher as entradas no pipeline, salve-o e execute-o para acionar o pipeline.
- Vá para a página Trabalho do pipeline em execução. Aqui, você pode ver a execução de cada etapa. Esse pipeline criará e assinará a compilação mais recente ou o resumo especificado e, em seguida, enviará a imagem assinada junto com sua assinatura associada para o Registro.
- Após a execução bem-sucedida, você pode ver a imagem enviada por push para o Registro de Contêiner do Azure (ACR) com uma assinatura de formato COSE (Assinatura e Criptografia de Objeto) CBOR anexada.
Verificar a imagem assinada
Da mesma forma, para verificar a imagem assinada, você pode usar o painel de edição ou editar o arquivo de pipeline para adicionar a tarefa de notação verify
ao pipeline. O pipeline verificará a imagem assinada com a política de confiança e o armazenamento de confiança fornecidos.
Preparar a política de confiança de notação e o armazenamento de confiança
Em geral, o verificador é diferente do signatário. Para fins de demonstração, usamos o mesmo pipeline e repositório ADO neste exemplo. Siga as etapas abaixo para criar a diretiva de confiança de notação, o armazenamento confiável e adicionar a verify
tarefa no pipeline:
- No repositório ADO atual, crie uma pasta
.pipeline
de exemplo para armazenar a política.pipeline/trustpolicy/
de confiança de notação. Crie um arquivotrustpolicy.json
JSON de política de confiança de exemplo . Preencha o modelo de política de confiança com seus próprios valores e salve-o na pasta.
Observação
Observe que o Armazenamento Confiável de Notação oferece suporte atualmente a três tipos de identidades, incluindo certificados raiz de Autoridade de Certificação (CA), Autoridade de Assinatura e Autoridade de Carimbo de Tempo (TSA). Para fins de demonstração, usamos a Autoridade de Certificação (CA) x509/ca
na política de confiança e no armazenamento de confiança abaixo. Consulte Armazenamento confiável para obter detalhes.
Consulte o modelo de política de confiança (Clique aqui).
{
"version": "1.0",
"trustPolicies": [
{
"name": "<yourPolicyName>",
"registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
"signatureVerification": {
"level" : "strict"
},
"trustStores": [ "ca:<yourTrustStore>"],
"trustedIdentities": [
"*"
]
}
]
}
- No repositório ADO atual, crie uma nova pasta para o armazenamento
/.pipeline/truststore/x509/ca/$<yourTrustStore>/
confiável de notação para armazenar o certificado. Se você seguiu as etapas de assinatura neste documento para assinar sua imagem, use o comando abaixo para baixar seu certificado autoassinado do 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
- Carregue o certificado na pasta
/.pipeline/truststore/x509/ca/$<yourTrustStore>/
de armazenamento confiável que criamos na última etapa.
Adicionar tarefa de verificação de notação
- Pesquise a tarefa Notação no painel de edição de pipeline novamente e escolha Verificar.
- Preencha as referências do Artefato com o resumo da imagem assinada.
- Insira o valor
.pipeline/trustpolicy/trustpolicy.json
no Caminho do Arquivo de Política de Confiança. - Insira o valor
.pipeline/truststore/
no Caminho da Pasta de Armazenamento Confiável. - Clique em Adicionar para adicionar a verificação de notação ao arquivo de pipeline à esquerda.
Seu notation verify
será salvo da seguinte maneira.
Veja o exemplo (Clique aqui).
# sign the artifact
- task: Notation@0
inputs:
command: 'verify'
artifactRefs: '<registry_host>/<repository>@<digest>'
trustPolicy: .pipeline/trustpolicy.json
trustStore: .pipeline/truststore/
Acionar o pipeline (Atualizado)
Você pode acionar o pipeline novamente para verificar a imagem assinada. Após a execução bem-sucedida, você pode ver os logs da página Trabalho do pipeline em execução. O pipeline verificará a imagem assinada com a política de confiança e o armazenamento de confiança fornecidos.
Conclusão
Este artigo mostra como assinar e verificar uma imagem de contêiner com a Notação no Pipeline do Azure. Você pode usar o painel DevOps do Azure ou editar o arquivo de pipeline para adicionar tarefas de notação ao seu pipeline. O pipeline criará, enviará por push, assinará e verificará a imagem com a política de confiança e o armazenamento de confiança fornecidos. Esse processo garante que os artefatos sejam assinados por uma entidade confiável e não tenham sido adulterados desde sua criação.