Docker 内容信任

Azure DevOps Services

Docker 内容信任 (DCT) 允许对发送到远程 Docker 注册表的数据以及从中接收的数据使用数字签名。 这些签名允许对特定映像标记的完整性和发布者进行客户端或运行时验证。

注意

为映像签名的一个先决条件是附加了 Notary 服务器的 Docker 注册表(示例包括 Docker HubAzure 容器注册表

在 Azure Pipelines 中对映像进行签名

开发计算机上的先决条件

  1. 使用 Docker 信任的内置生成器或手动生成委派密钥对。 如果使用内置生成器,则会将委派私钥导入到本地 Docker 信任存储中。 否则,需要手动将私钥导入本地 Docker 信任存储中。 有关详细信息,请参阅手动生成密钥
  2. 使用从上述步骤生成的委派密钥,将第一个密钥上传到委派并启动存储库

提示

若要查看本地委派密钥的列表,请使用 Notary CLI 运行以下命令:$ notary key list

设置用于对映像进行签名的管道

  1. 获取委派私钥(位于之前使用的开发计算机的本地 Docker 信任存储中),并将其添加为 Pipelines 中的安全文件

  2. 授权在所有管道中使用此安全文件

  3. containerRegistryServiceConnection 关联的服务主体必须在目标容器注册表中具有 AcrImageSigner 角色。

  4. 基于以下 YAML 代码片段创建一个管道:

    pool:
      vmImage: 'Ubuntu 16.04'
    
    variables:
      system.debug: true
      containerRegistryServiceConnection: serviceConnectionName
      imageRepository: foobar/content-trust
      tag: test
    
    steps:
    - task: Docker@2
      inputs:
        command: login
        containerRegistry: $(containerRegistryServiceConnection)
    
    - task: DownloadSecureFile@1
      name: privateKey
      inputs:
        secureFile: cc8f3c6f998bee63fefaaabc5a2202eab06867b83f491813326481f56a95466f.key
    - script: |
        mkdir -p $(DOCKER_CONFIG)/trust/private
        cp $(privateKey.secureFilePath) $(DOCKER_CONFIG)/trust/private
    
    - task: Docker@2
      inputs:
        command: build
        Dockerfile: '**/Dockerfile'
        containerRegistry: $(containerRegistryServiceConnection)
        repository: $(imageRepository)
        tags: |
          $(tag)
        arguments: '--disable-content-trust=false'
    
    - task: Docker@2
      inputs: 
        command: push
        containerRegistry: $(containerRegistryServiceConnection)
        repository: $(imageRepository)
        tags: |
          $(tag)
        arguments: '--disable-content-trust=false'
      env:
        DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: $(DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE)
    

    在前面的示例中,DOCKER_CONFIG 变量由 Docker 任务中的 login 命令设置。 建议你将 DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE 设置为管道的机密变量。 在 YAML 中使用管道变量是一种替代方式,但此方式会以明文形式公开密码。 示例中的 DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE 引用私钥的密码(而非存储库密码)。 在此示例中,我们只需要私钥的密码,因为存储库已启动(先决条件)。