Partilhar via


Assinar imagens de contêiner com Notação e Azure Key Vault usando um certificado emitido pela CA

Assinar e verificar imagens de contêiner com um certificado emitido por uma Autoridade de Certificação (CA) confiável é uma prática de segurança valiosa. Essa medida de segurança ajudará você a identificar, autorizar e validar de forma responsável a identidade do editor da imagem do contêiner e da própria imagem do contêiner. As Autoridades de Certificação (CAs) Confiáveis, como GlobalSign, DigiCert e outras, desempenham um papel crucial na validação da identidade de um usuário ou organização, mantendo a segurança dos certificados digitais e revogando o certificado imediatamente após qualquer risco ou uso indevido.

Aqui estão alguns componentes essenciais que ajudam você a assinar e verificar imagens de contêiner com um certificado emitido por uma autoridade de certificação confiável:

  • O Notation é uma ferramenta de segurança da cadeia de suprimentos de código aberto desenvolvida pela comunidade Notary Project e apoiada pela Microsoft, que suporta a assinatura e verificação de imagens de contêiner e outros artefatos.
  • O Azure Key Vault (AKV), um serviço baseado na nuvem para gerenciar chaves criptográficas, segredos e certificados, ajudará você a garantir o armazenamento e o gerenciamento seguros de um certificado com uma chave de assinatura.
  • O plug-in Notation AKV azure-kv, a extensão da Notação, usa as chaves armazenadas no Cofre de Chaves do Azure para assinar e verificar as assinaturas digitais de imagens de contêiner e artefatos.
  • O Azure Container Registry (ACR) permite anexar essas assinaturas à imagem assinada e ajuda você a armazenar e gerenciar essas imagens de contêiner.

Quando você verifica a imagem, a assinatura é usada para validar a integridade da imagem e a identidade do signatário. Isso ajuda a garantir que as imagens de contêiner não sejam adulteradas e sejam de uma fonte confiável.

Neste artigo:

  • Instale a CLI de notação e o plug-in AKV
  • Criar ou importar um certificado emitido por uma autoridade de certificação no AKV
  • Criar e enviar por push uma imagem de contêiner com a tarefa ACR
  • Assinar uma imagem de contentor com a CLI de Notação e o plug-in do AKV
  • Verificar uma assinatura de imagem de contêiner com a CLI de notação
  • Carimbo de data/hora

Pré-requisitos

Nota

Recomendamos a criação de um novo Cofre da Chave do Azure apenas para armazenar certificados.

Instale a CLI de notação e o plug-in AKV

  1. Instale o Notation v1.2.0 em um ambiente Linux amd64. Siga o guia de instalação do Notation para baixar o pacote para outros ambientes.

    # Download, extract and install
    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.2.0/notation_1.2.0_linux_amd64.tar.gz
    tar xvzf notation.tar.gz
    
    # Copy the notation cli to the desired bin directory in your PATH, for example
    cp ./notation /usr/local/bin
    
  2. Instale o plug-in azure-kv Notation Azure Key Vault v1.2.0 em um ambiente Linux amd64.

    Nota

    A URL e a soma de verificação SHA256 para o plug-in Notation Azure Key Vault podem ser encontradas na página de lançamento do plug-in.

    notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.2.0/notation-azure-kv_1.2.0_linux_amd64.tar.gz --sha256sum 06bb5198af31ce11b08c4557ae4c2cbfb09878dfa6b637b7407ebc2d57b87b34
    
  3. Liste os plugins disponíveis e confirme se o plugin com versão azure-kv 1.2.0 está incluído na lista.

    notation plugin ls
    

Configurar variáveis de ambiente

Nota

Este guia usa variáveis de ambiente para conveniência ao configurar o AKV e o ACR. Atualize os valores dessas variáveis de ambiente para seus recursos específicos.

  1. Configurar variáveis de ambiente para AKV e certificados

    AKV_SUB_ID=myAkvSubscriptionId
    AKV_RG=myAkvResourceGroup
    AKV_NAME=myakv 
    
    # Name of the certificate created or imported in AKV 
    CERT_NAME=wabbit-networks-io 
    
    # X.509 certificate subject
    CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US"
    
  2. Configure variáveis de ambiente para ACR e imagens.

    ACR_SUB_ID=myAcrSubscriptionId
    ACR_RG=myAcrResourceGroup
    # 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 
    # Source code directory containing Dockerfile to build 
    IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main  
    

Iniciar sessão com a CLI do Azure

az login

Para saber mais sobre a CLI do Azure e como entrar com ela, consulte Entrar com a CLI do Azure.

Criar ou importar um certificado emitido por uma autoridade de certificação no AKV

Requisitos dos certificados

Ao criar certificados para assinatura e verificação, os certificados devem atender ao requisito de certificado do Projeto Notarial.

Aqui estão os requisitos para certificados raiz e intermediários:

  • A basicConstraints extensão deve estar presente e marcada como crítica. O CA campo deve ser definido true.
  • A keyUsage extensão deve estar presente e marcada critical. As posições de bit para keyCertSign MUST devem ser definidas.

Aqui estão os requisitos para certificados emitidos por uma autoridade de certificação:

  • Propriedades do certificado X.509:
    • O assunto deve conter nome comum (CN), país (C), estado ou província (ST) e organização (O). Neste tutorial, $CERT_SUBJECT é usado como assunto.
    • O sinalizador de uso de chave X.509 deve ser DigitalSignature apenas.
    • Os usos estendidos de chave (EKUs) devem estar vazios ou 1.3.6.1.5.5.7.3.3 (para codesign).
  • Principais propriedades:
    • A exportable propriedade deve ser definida como false.
    • Selecione um tipo e tamanho de chave suportados na especificação do Projeto Notarial.

Importante

Para garantir uma integração bem-sucedida com o Image Integrity, o tipo de conteúdo do certificado deve ser definido como PEM.

Nota

Este guia usa a versão 1.0.1 do plugin AKV. As versões anteriores do plug-in tinham uma limitação que exigia uma ordem de certificado específica em uma cadeia de certificados. A versão 1.0.1 do plugin não tem essa limitação, por isso é recomendável que você use a versão 1.0.1 ou posterior.

Criar um certificado emitido por uma autoridade de certificação

Crie uma solicitação de assinatura de certificado (CSR) seguindo as instruções em criar solicitação de assinatura de certificado.

Importante

Ao mesclar o CSR, certifique-se de mesclar toda a cadeia que trouxe de volta do fornecedor da autoridade de certificação.

Importar o certificado em AKV

Para importar o certificado:

  1. Obtenha o arquivo de certificado do fornecedor da autoridade de certificação com toda a cadeia de certificados.
  2. Importe o certificado para o Cofre da Chave do Azure seguindo as instruções em Importar um certificado.

Nota

Se o certificado não contiver uma cadeia de certificados após a criação ou importação, você poderá obter os certificados intermediários e raiz do fornecedor da autoridade de certificação. Você pode pedir ao seu fornecedor para fornecer um arquivo PEM que contenha os certificados intermediários (se houver) e o certificado raiz. Esse arquivo pode ser usado na etapa 5 de assinatura de imagens de contêiner.

Assinar uma imagem de contentor com a CLI de Notação e o plug-in do AKV

Ao trabalhar com ACR e AKV, é essencial conceder as permissões apropriadas para garantir acesso seguro e controlado. Você pode autorizar o acesso para diferentes entidades, como entidades de usuário, entidades de serviço ou identidades gerenciadas, dependendo de seus cenários específicos. Neste tutorial, o acesso é autorizado a um usuário do Azure conectado.

Acesso de criação ao ACR

As AcrPull funções e AcrPush são necessárias para criar e assinar imagens de contêiner no ACR.

  1. Definir a assinatura que contém o recurso ACR

    az account set --subscription $ACR_SUB_ID
    
  2. Atribuir as funções

    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "AcrPull" --role "AcrPush" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
    

Crie e envie imagens de contêiner para o ACR

  1. Autentique-se em seu ACR usando sua identidade individual do Azure.

    az acr login --name $ACR_NAME
    

Importante

Se você tiver o Docker instalado em seu sistema e usado az acr login ou docker login para autenticar em seu ACR, suas credenciais já estão armazenadas e disponíveis para notação. Nesse caso, você não precisa executar notation login novamente para autenticar no seu ACR. Para saber mais sobre as opções de autenticação para notação, consulte Autenticar com registros compatíveis com OCI.

  1. Crie e envie uma nova imagem com as Tarefas ACR. digest Use sempre para identificar a imagem para assinatura, já que as tags são mutáveis e podem ser substituídas.

    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
    

Neste tutorial, se a imagem já tiver sido criada e estiver armazenada no Registro, a tag servirá como um identificador para essa imagem por conveniência.

IMAGE=$REGISTRY/${REPO}@$TAG

Acesso de criação ao AKV

  1. Definir a subscrição que contém o recurso AKV

    az account set --subscription $AKV_SUB_ID
    
  2. Atribuir as funções

    Se o certificado contiver toda a cadeia de certificados, a entidade de segurança deverá ser atribuída com as seguintes funções:

    • Key Vault Secrets User para ler segredos
    • Key Vault Certificates Userpara leitura de certificados
    • Key Vault Crypto User para operações de assinatura
    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Secrets User" --role "Key Vault Certificates User" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

    Se o certificado não contiver a cadeia, a entidade de segurança deverá ser atribuída com as seguintes funções:

    • Key Vault Certificates Userpara leitura de certificados
    • Key Vault Crypto User para operações de assinatura
    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Certificates User" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

Para saber mais sobre o acesso ao Cofre da Chave com o RBAC do Azure, consulte Usar um RBAC do Azure para gerenciar o acesso.

Política de acesso de uso (Legado)

Para definir a assinatura que contém os recursos AKV, execute o seguinte comando:

az account set --subscription $AKV_SUB_ID

Se o certificado contiver toda a cadeia de certificados, a entidade de segurança deverá receber permissão Signde chave, permissão Getsecreta e permissões Getde certificado. Para conceder essas permissões à entidade de segurança:

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --key-permissions sign --secret-permissions get --certificate-permissions get --object-id $USER_ID

Se o certificado não contiver a cadeia, a entidade de segurança deverá receber permissão Signde chave e permissões Getde certificado. Para conceder essas permissões à entidade de segurança:

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --key-permissions sign --certificate-permissions get --object-id $USER_ID

Para saber mais sobre como atribuir política a uma entidade de segurança, consulte Atribuir política de acesso.

Assinar imagens de contêiner usando o certificado no AKV

  1. Obtenha o ID da chave para um certificado. Um certificado no AKV pode ter várias versões, o comando a seguir obtém o ID da chave para a versão mais recente do $CERT_NAME certificado.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv) 
    
  2. Assine a imagem do contêiner com o formato de assinatura COSE usando o ID da chave.

    Se o certificado contiver toda a cadeia de certificados, execute o seguinte comando:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv 
    

    Se o certificado não contiver a cadeia, use o --plugin-config ca_certs=<ca_bundle_file> parâmetro para passar os certificados CA em um arquivo PEM para o plug-in AKV, execute o seguinte comando:

    notation sign --signature-format cose $IMAGE --id $KEY_ID --plugin azure-kv --plugin-config ca_certs=<ca_bundle_file> 
    

    Para autenticar com AKV, por padrão, os seguintes tipos de credenciais, se ativados, serão testados na ordem:

    Se você quiser especificar um tipo de credencial, use uma configuração de plug-in adicional chamada credential_type. Por exemplo, você pode definir credential_type explicitamente para azurecli usar a credencial da CLI do Azure, conforme demonstrado abaixo:

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config credential_type=azurecli $IMAGE
    

    Consulte a tabela abaixo para obter os valores de para vários tipos de credential_type credenciais.

    Tipo de credencial Valor para credential_type
    Credencial de ambiente environment
    Credencial de identidade da carga de trabalho workloadid
    Credencial de identidade gerenciada managedid
    Credencial da CLI do Azure azurecli
  3. Veja o gráfico de imagens assinadas e assinaturas associadas.

    notation ls $IMAGE
    

    No exemplo de saída a seguir, uma assinatura do tipo application/vnd.cncf.notary.signature identificada por digest sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e está associada ao $IMAGE.

    myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f
    └── application/vnd.cncf.notary.signature
        └── sha256:d7258166ca820f5ab7190247663464f2dcb149df4d1b6c4943dcaac59157de8e
    

Verificar uma imagem de contentor com a CLI de Notação

  1. Adicione o certificado raiz a um armazenamento confiável nomeado para verificação de assinatura. Se você não tiver o certificado raiz, poderá obtê-lo da sua autoridade de certificação. O exemplo a seguir adiciona o certificado $ROOT_CERT raiz ao $STORE_NAME armazenamento confiável.

    STORE_TYPE="ca" 
    STORE_NAME="wabbit-networks.io" 
    notation cert add --type $STORE_TYPE --store $STORE_NAME $ROOT_CERT  
    
  2. Liste o certificado raiz para confirmar que o $ROOT_CERT foi adicionado com êxito.

    notation cert ls 
    
  3. Configure a política de confiança antes da verificação.

    As políticas de confiança permitem que os usuários especifiquem políticas de verificação ajustadas. Use o comando a seguir para configurar a política de confiança.

    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
    

    O arquivo acima trustpolicy.json define uma política de confiança chamada wabbit-networks-images. Esta política de confiança aplica-se a todos os artefactos armazenados nos $REGISTRY/$REPO repositórios. O armazenamento $STORE_NAME de confiança nomeado do tipo $STORE_TYPE contém os certificados raiz. Ele também assume que o usuário confia em uma identidade específica com o assunto $CERT_SUBJECTX.509. Para obter mais detalhes, consulte Armazenamento confiável e especificação de política de confiança.

  4. Use notation policy para importar a configuração da política de confiança do trustpolicy.json.

    notation policy import ./trustpolicy.json
    
  5. Mostrar a configuração da política de confiança para confirmar sua importação bem-sucedida.

    notation policy show
    
  6. Use notation verify para verificar a integridade da imagem:

    notation verify $IMAGE
    

    Após a verificação bem-sucedida da imagem usando a política de confiança, o resumo sha256 da imagem verificada é retornado em uma mensagem de saída bem-sucedida. Um exemplo de saída:

    Successfully verified signature for myregistry.azurecr.io/net-monitor@sha256:17cc5dd7dfb8739e19e33e43680e43071f07497ed716814f3ac80bd4aac1b58f

Carimbo de data/hora

Desde o lançamento do Notation v1.2.0, o Notation suporta carimbo de data/hora compatível com RFC 3161 . Esse aprimoramento amplia a confiança das assinaturas criadas dentro do período de validade do certificado confiando em uma Autoridade de Carimbo de Data/Hora (TSA), permitindo a verificação bem-sucedida da assinatura mesmo depois que os certificados expirarem. Como signatário de imagem, você deve garantir que assina imagens de contêiner com carimbos de data/hora gerados por um TSA confiável. Como verificador de imagem, para verificar carimbos de data/hora, você deve garantir que confia no signatário da imagem e no TSA associado e estabelecer confiança por meio de armazenamentos de confiança e políticas de confiança. O carimbo de data/hora reduz os custos, eliminando a necessidade de assinar imagens novamente periodicamente devido à expiração do certificado, o que é especialmente crítico ao usar certificados de curta duração. Para obter instruções detalhadas sobre como assinar e verificar usando o carimbo de data/hora, consulte o guia de carimbo de data/hora do Projeto Notarial.

FAQ

  • O que devo fazer se o certificado expirar?

    Se o certificado tiver expirado, você precisará obter um novo de um fornecedor de CA confiável junto com uma nova chave privada. Um certificado expirado não pode ser usado para assinar imagens de contêiner. Para imagens que foram assinadas antes do certificado expirar, elas ainda podem ser validadas com êxito se tiverem sido assinadas com carimbo de data/hora. Sem carimbo de data/hora, a verificação de assinatura falhará e você precisará assinar novamente essas imagens com o novo certificado para uma verificação bem-sucedida.

  • O que devo fazer se o certificado for revogado?

    Se o certificado for revogado, a assinatura será invalidada. Isso pode acontecer por vários motivos, como a chave privada ser comprometida ou alterações na afiliação do titular do certificado. Para resolver esse problema, você deve primeiro garantir que seu código-fonte e ambiente de compilação estejam atualizados e seguros. Em seguida, crie imagens de contêiner a partir do código-fonte, obtenha um novo certificado de um fornecedor de CA confiável junto com uma nova chave privada e assine novas imagens de contêiner com o novo certificado seguindo este guia.

Próximos passos

A Notation também fornece soluções de CI/CD no Pipeline do Azure e no Fluxo de Trabalho de Ações do GitHub:

Para validar a implantação de imagem assinada no AKS ou Kubernetes: