Compartir a través de


Firma y comprobación de una imagen de contenedor con notación en Azure Pipeline

La tarea Notación de Azure DevOps es una tarea integrada para firmar y comprobar imágenes de contenedor y otros artefactos de Open Container Initiative (OCI) dentro de una canalización de Azure. La tarea Notation utiliza la CLI de notación para ejecutar estas operaciones, lo que garantiza que los artefactos están firmados por una entidad de confianza y no se han alterado desde su creación.

El artículo le guía a través de la creación de una canalización de Azure que compila una imagen de contenedor, la inserta en ACR y agrega firmas mediante notación y el complemento de Azure Key Vault que proporciona una capa de seguridad e integridad para los artefactos. El objetivo de la canalización es:

  1. Compile una imagen de contenedor e insértela en Azure Container Registry (ACR).
  2. Firme la imagen con el complemento notación y notación de Azure Key Vault. A continuación, la firma se inserta automáticamente en ACR.

Requisitos previos

  • Cree una instancia de Key Vault en Azure Key Vault y genere una clave de firma autofirmado y un certificado. Puede usar este documento para crear una clave autofirmado y un certificado con fines de prueba. Si tiene un certificado emitido por ca, consulte este documento para obtener más información.
  • Cree un registro en Azure Container Registry (ACR).
  • Asegúrese de que tiene un repositorio de Azure DevOps o un repositorio de GitHub.

Creación de Conectar de servicio

Cree una conexión de servicio en Azure Pipelines, lo que permite que la canalización acceda a servicios externos como Azure Container Registry (ACR), puede seguir estos pasos:

  • Inicie sesión en una imagen en Azure Container Registry (ACR) mediante credenciales de ACR.

  • Use la tarea Docker en Azure Pipelines para iniciar sesión en ACR. La tarea de Docker es una tarea integrada en Azure Pipelines que permite compilar, insertar y extraer imágenes de Docker, entre otras cosas.

  • Establezca una conexión del servicio Docker Registry en Azure Pipeline para conceder acceso a las tareas de notación al registro de ACR, como se indica a continuación:

    1. Inicie sesión en la organización (https://dev.azure.com/{yourorganization}) y seleccione el proyecto.
    2. Seleccione el botón Configuración en la esquina inferior izquierda.
    3. Vaya a Canalizaciones y seleccione Conexión de servicio.
    4. Elija Nueva conexión de servicio y seleccione Docker Registry.
    5. A continuación, elija Azure Container Registry.
    6. Elija Entidad de servicio en Tipo de autenticación y escriba los detalles de la entidad de servicio, incluida la suscripción de Azure y el registro de ACR.
    7. Escriba un nombre de conexión fácil de usar al hacer referencia a esta conexión de servicio.
  • Cree una conexión de servicio de Azure Resource Manager en Azure Pipelines para autorizar el acceso a Azure Key Vault:

    1. Elija Entidad de servicio (automática).
    2. A continuación, elija Suscripción y busque la suscripción de Azure en la lista desplegable.
    3. Elija un grupo de recursos disponible en la lista desplegable.
    4. Escriba un nombre de conexión de servicio descriptivo que se usará al hacer referencia a esta conexión de servicio.
    5. Guárdelo para finalizar la creación.
  • Conceda la directiva de acceso a la entidad de servicio siguiendo estos pasos:

    1. Abra la conexión de servicio de Azure Resource Manager creada y haga clic en Administrar entidad de servicio para escribir el portal de la entidad de servicio de Azure.
    2. Copie el valor de Application (client) ID. Se usará para conceder el permiso para la entidad de servicio.
    3. Abra el portal de Azure Key Vault y escriba la página Directivas de acceso.
    4. Cree una nueva directiva de acceso con key signel permiso y secret getcertificate get .
    5. Conceda esta nueva directiva de acceso a un principio de servicio mediante el Application (client) ID pegado del paso anterior.
    6. Guárdelo para finalizar la creación.

Obtenga más información sobre la conexión de servicio aquí.

Creación de una canalización y uso de la tarea Notación

Cree una canalización de Azure para el repositorio de Git siguiendo estos pasos:

  1. Vaya al proyecto en la organización de AOD.
  2. Vaya a Canalizaciones en el menú de la izquierda y seleccione Nueva canalización.
  3. Elija el repositorio git. Usamos el repositorio de Azure DevOps para facilitar la demostración.
  4. Configure la canalización con una canalización de inicio si no está familiarizado con Azure DevOps. Revise y cree la canalización haciendo clic en Guardar y ejecutar.

Nota:

En el ejemplo se supone que la rama predeterminada es main. Si no es así, siga la guía para actualizar la rama predeterminada.

Hay dos maneras de agregar tareas de notación editando la canalización de Azure:

Use el panel de Azure DevOps (ADO): el panel ADO proporciona una interfaz de usuario donde puede agregar tareas a la canalización. Puede buscar tareas de notación y agregarlas a la canalización mediante esta interfaz.

Copia desde un archivo de Azure Pipeline de ejemplo: si tiene un archivo de Azure Pipeline de ejemplo que ya incluye tareas de notación, puede copiar estas tareas desde el archivo de ejemplo y pegarlas en el archivo de canalización.

Opción 1: Uso del panel de edición de Azure DevOps (ADO)

Busque la Docker tarea desde el panel de edición de canalización en el lado derecho. Use su login comando con la conexión del servicio registro de Docker para autenticarse con ACR.

  1. Elija la conexión del servicio Docker Registry creada en el paso anterior en la lista desplegable Registro de contenedor .
  2. Elija login en la lista desplegable Comando .
  3. Haga clic en Agregar para agregar la tarea de Docker con login el comando a la izquierda del archivo de canalización.

Del mismo modo, vuelva a buscar la Docker tarea desde el panel de edición de canalización. Use su buildAndPush comando para compilar automáticamente el código fuente en una imagen e insertarlo en el repositorio de ACR de destino. Generará un resumen de imagen que se usará para iniciar sesión en el paso siguiente.

  1. Escriba el nombre del repositorio en El repositorio contenedor.
  2. Elija buildAndPush en la lista desplegable Comando .
  3. Especifique la ruta de acceso del archivo dockerfile. Por ejemplo, use ./Dockerfile si el Dockerfile se almacena en la carpeta raíz.
  4. Haga clic en Agregar para agregar la tarea de Docker con buildAndPush el comando a la izquierda del archivo de canalización.

Busque la Notation tarea desde el panel de edición de canalización en el lado derecho.

  1. Elija Instalar en el comando de lista desplegable que se va a ejecutar.
  2. Haga clic en Agregar para agregar la notation install tarea a la canalización.
  3. De forma similar, vuelva a buscar la Notation tarea en el panel de edición de canalización y elija Firmar.
  4. Puede omitir las referencias de artefacto, ya que firmamos una imagen con su resumen más reciente que se compila e inserta en el registro mediante una tarea de Docker. En su lugar, puede especificar manualmente un resumen mediante <registry_host>/<repository>@<digest>.
  5. Rellene la configuración del complemento en el formulario. Usaremos el complemento de AKV predeterminado y la conexión de servicio creada en el paso anterior. Copie el identificador de clave de AKV en el identificador de clave.
  6. Active la casilla Certificado autofirmado, ya que usamos un certificado autofirmado para facilitar la demostración. En su lugar, puede escribir la ruta de acceso del archivo de certificado en Ruta de acceso del archivo de agrupación de certificados si desea usar un certificado emitido por la entidad de certificación.
  7. Haga clic en Agregar para agregar el archivo notation sign de canalización a la izquierda.

Opción 2: Edición de un archivo de Azure Pipeline de ejemplo

  1. Si está familiarizado con Azure Pipelines y notación, es eficaz empezar con un archivo de canalización de plantilla.
  2. Copie la plantilla de canalización proporcionada en el documento en su propio archivo de canalización. Esta plantilla está diseñada para usar tareas de notación, que se usan para firmar y comprobar imágenes de contenedor.
  3. Después de copiar la plantilla, rellene los valores necesarios según las referencias y los comentarios proporcionados a continuación.
Consulte la plantilla de tarea de firma de la opción 1 (Haga clic aquí).
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

Nota:

Además de usar la tarea docker, puede firmar manualmente un resumen de imagen especificado especificando una referencia de artefacto de artifactRefs la siguiente manera.

Vea el ejemplo (Haga clic aquí).
# 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

Desencadenamiento de la canalización

Siga los pasos para ejecutar una canalización en Azure DevOps y comprobar su ejecución.

  1. Después de rellenar las entradas de la canalización, guárdela y ejecútela para desencadenar la canalización.
  2. Vaya a la página Trabajo de la canalización en ejecución. Aquí puede ver la ejecución de cada paso. Esta canalización compilará y firmará la compilación más reciente o el resumen especificado y, a continuación, insertará la imagen firmada junto con su firma asociada al registro.
  3. Tras una ejecución correcta, puede ver la imagen insertada en Azure Container Registry (ACR) con una firma de formato CBOR Object Signing and Encryption (COSE) adjuntada.

Comprobación de la imagen firmada

Del mismo modo, para comprobar la imagen firmada, puede usar el panel de edición o editar el archivo de canalización para agregar la tarea de notación verify a la canalización. La canalización comprobará la imagen firmada con la directiva de confianza y el almacén de confianza que proporcionó.

Preparar la directiva de confianza de notación y el almacén de confianza

En general, el comprobador es diferente del firmante. Para fines de demostración, usamos la misma canalización y el mismo repositorio de ADO en este ejemplo. Siga los pasos siguientes para crear la directiva de confianza de notación, el almacén de confianza y agregar la verify tarea en la canalización:

  1. En el repositorio de ADO actual, cree una carpeta .pipeline de ejemplo para almacenar la directiva .pipeline/trustpolicy/de confianza de notación . Cree un archivo trustpolicy.jsonJSON de directiva de confianza de ejemplo . Rellene la plantilla de directiva de confianza con sus propios valores y guárdela en la carpeta .

Nota:

Tenga en cuenta que el Almacén de confianza de notación admite actualmente tres tipos de identidades, incluidos los certificados raíz de la entidad de certificación (CA), SigningAuthority y La entidad de marca de tiempo (TSA). Para fines de demostración, usamos la entidad de certificación (CA) x509/ca en la directiva de confianza y el almacén de confianza siguiente. Consulte almacén de confianza para obtener más información.

Consulte la plantilla de directiva de confianza (haga clic aquí).
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "<yourPolicyName>",
            "registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
            "signatureVerification": {
                "level" : "strict" 
            },
            "trustStores": [ "ca:<yourTrustStore>"],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
  1. En el repositorio de ADO actual, cree una carpeta para que el almacén /.pipeline/truststore/x509/ca/$<yourTrustStore>/ de confianza de notación almacene el certificado. Si ha seguido los pasos de firma de este documento para firmar la imagen, use el comando siguiente para descargar el certificado autofirmado de 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. Cargue el certificado en la carpeta /.pipeline/truststore/x509/ca/$<yourTrustStore>/ del almacén de confianza que creamos en el último paso.

Agregar tarea de comprobación de notación

  1. Vuelva a buscar la tarea Notación en el panel de edición de canalización y elija Comprobar.
  2. Rellene las referencias de artefacto con el resumen de la imagen firmada.
  3. Escriba el valor .pipeline/trustpolicy/trustpolicy.json en la ruta de acceso del archivo de directiva de confianza.
  4. Escriba el valor .pipeline/truststore/ en la ruta de acceso de carpeta del almacén de confianza.
  5. Haga clic en Agregar para agregar la comprobación de notación al archivo de canalización izquierdo.

Se notation verify guardará como se indica a continuación.

Vea el ejemplo (Haga clic aquí).
# sign the artifact
- task: Notation@0
  inputs:
    command: 'verify'
    artifactRefs: '<registry_host>/<repository>@<digest>'
    trustPolicy: .pipeline/trustpolicy.json
    trustStore: .pipeline/truststore/

Desencadenamiento de la canalización (actualizado)

Puede volver a desencadenar la canalización para comprobar la imagen firmada. Tras una ejecución correcta, puede ver los registros en la página Trabajo de la canalización en ejecución. La canalización comprobará la imagen firmada con la directiva de confianza y el almacén de confianza que proporcionó.

Conclusión

En este artículo se muestra cómo firmar y comprobar una imagen de contenedor con Notación en Azure Pipeline. Puede usar el panel de Azure DevOps o editar el archivo de canalización para agregar tareas de notación a la canalización. La canalización compilará, insertará, firmará y comprobará la imagen con la directiva de confianza y el almacén de confianza que proporcionó. Este proceso garantiza que los artefactos están firmados por una entidad de confianza y no se han alterado desde su creación.