Assinar imagens de contêiner com o Notation e o Azure Key Vault usando um certificado autoassinado

A assinatura de imagens de contêiner é um processo que garante autenticidade e integridade. Isso é feito adicionando uma assinatura digital à imagem de contêiner, que pode ser validada durante a implantação. A assinatura ajuda a verificar se a imagem é de um editor confiável e se não foi modificada. O Notation é uma ferramenta de cadeia de suprimentos de código aberto desenvolvida pelo Notary Project, que oferece suporte à assinatura e verificação de imagens de contêiner e outros artefatos. O AKV (Azure Key Vault) é usado para armazenar certificados com chaves de assinatura que podem ser usadas pelo Notation com o plug-in Notation AKV (azure-kv) para assinar e verificar imagens de contêiner e outros artefatos. O ACR (Registro de Contêiner do Azure) permite anexar assinaturas a imagens de contêiner e outros artefatos, bem como exibir essas assinaturas.

Neste tutorial:

  • Instalar a CLI do Notation e o plug-in AKV
  • Criar um certificado autoassinado no AKV
  • Compilar e enviar uma imagem de contêiner com as Tarefas do ACR
  • Assine uma imagem de contêiner com a CLI do Notation e o plug-in AKV
  • Valide uma imagem de contêiner em relação à assinatura com a CLI do Notation

Pré-requisitos

Instalar a CLI do Notation e o plug-in AKV

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

    # 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
    
  2. Instale o plug-in de Notação do Azure Key Vault azure-kv v1.0.2 em um ambiente de amd64 do Linux.

    Observação

    A soma de verificação de URL e SHA256 para o plug-in de Notação do Azure Key Vault, pode ser encontrada na página de lançamento do plug-in.

    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
    
  3. Liste os plug-ins disponíveis e confirme se o plug-in azure-kv com a versão 1.0.2 está incluída na lista.

    notation plugin ls
    

Configurar variáveis de ambiente

Observação

Para facilitar a execução de comandos no tutorial, forneça valores para que os recursos do Azure correspondam aos recursos existentes do ACR e do AKV.

  1. Configurar nomes de recursos do 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
    
  2. Configurar nomes de recursos de imagem e 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
    

Entrar com a CLI do Azure

az login

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

Atribuir política de acesso no AKV (CLI do Azure)

É necessário uma entidade de usuário com as permissões corretas de política de acesso para criar um certificado autoassinado e assinar artefatos. Essa entidade pode ser uma entidade de usuário, uma entidade de serviço ou uma identidade gerenciada. No mínimo, essa entidade de segurança precisa das seguintes permissões:

  • Permissões de Create para certificados
  • Permissões de Get para certificados
  • Permissões de Sign para chaves

Neste tutorial, a política de acesso é atribuída a um usuário conectado do Azure. Para saber mais sobre a atribuição de política a uma entidade de segurança, confira Atribuir Política de Acesso.

Definir a assinatura que contém o recurso AKV

az account set --subscription <your_subscription_id>

Definir a política de acesso no 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

Importante

Esse exemplo mostra as permissões mínimas necessárias para criar um certificado e assinar uma imagem de contêiner. Dependendo dos requisitos, talvez seja necessário conceder permissões adicionais.

Criar um certificado autoassinado no AKV (CLI do Azure)

As etapas a seguir mostram como criar um certificado autoassinado para fins de teste.

  1. Criar um arquivo de política de certificação.

    Quando o arquivo de política de certificado é executado conforme abaixo, ele cria um certificado válido compatível com os requisitos de certificado do Notary Project no AKV. O valor de ekus é para a assinatura de código, mas não é necessário para a notação para assinar artefatos. A entidade em questão é usada posteriormente como a identidade de confiança na qual o usuário irá confiar durante a verificação.

    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
    
  2. Criar o certificado.

    az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
    

Assine uma imagem de contêiner com a CLI do Notation e o plug-in AKV

  1. Faça a autenticação no ACR usando sua identidade individual do Azure.

    az acr login --name $ACR_NAME
    

Importante

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

  1. Compilar e enviar por push uma nova imagem com Tarefas do ACR. Sempre use o valor de resumo da mensagem para identificar a imagem para assinatura, pois as marcas 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á foi criada e armazenada no registro, a marca servirá como um identificador para essa imagem por conveniência.

    IMAGE=$REGISTRY/${REPO}:$TAG
    
  2. Obtenha a ID de Chave da chave de assinatura. Um certificado no AKV pode ter várias versões; o comando a seguir obtém a ID de Chave da versão mais recente.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
    
  3. Assine a imagem de contêiner com o formato de assinatura COSE usando a ID da chave de assinatura. Para assinar com um certificado autoassinado, você precisa definir o valor de self_signed=true da configuração do plug-in.

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
    
  4. Veja o grafo de imagens assinadas e assinaturas associadas.

    notation ls $IMAGE
    

Verificar uma imagem de contêiner com a CLI do Notation

Para verificar a imagem de contêiner, adicione o certificado raiz que assina o certificado folha ao armazenamento confiável e crie políticas de confiança para verificação. No caso do certificado autoassinado usado neste tutorial, o certificado raiz é o próprio certificado autoassinado.

  1. Baixar certificado público.

    az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
    
  2. Adicione o certificado público baixado ao repositório confiável nomeado para a verificação da assinatura.

    STORE_TYPE="ca"
    STORE_NAME="wabbit-networks.io"
    notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
    
  3. Liste o certificado a ser confirmado.

    notation cert ls
    
  4. 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 com ajuste fino. O exemplo a seguir configura uma política de confiança chamada wabbit-networks-images, que se aplica a todos os artefatos em $REGISTRY/$REPO e usa o repositório confiável $STORE_NAME nomeado do tipo $STORE_TYPE. Ele também pressupõe que o usuário confia em uma identidade específica com o assunto X.509 $CERT_SUBJECT. Para obter mais detalhes, confira Especificação do repositório confiável e da 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
    
  5. Use a notation policy para importar a configuração de política de confiança de um arquivo JSON que criamos anteriormente.

    notation policy import ./trustpolicy.json
    notation policy show
    
  6. Use notation verify para verificar se a imagem de contêiner não foi alterada desde o momento da compilação.

    notation verify $IMAGE
    

    Após a verificação bem-sucedida da imagem usando a política de confiança, o código hash sha256 da imagem verificada será retornado em uma mensagem de saída bem-sucedida.

Próximas etapas

Confira Usar a Integridade da Imagem para validar as imagens assinadas antes de implantá-las nos seus clusters do AKS (Serviço de Kubernetes do Azure) e Ratificar no Azure para começar a verificar e auditar as imagens assinadas antes de implantá-las no AKS.