Docker 内容信任

Azure DevOps Services

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

注释

若要对映像进行签名,需要使用附加的公证服务器(示例包括 Docker 中心Azure 容器注册表)的 Docker 注册表。

在 Azure Pipelines 中对镜像进行签名

开发计算机上的先决条件

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

小窍门

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

设置用于签名映像的管道

  1. 从开发计算机上的本地 Docker 信任存储中获取委派私钥,并将其添加为管道中的 安全文件

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

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

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

    pool:
      vmImage: 'ubuntu-latest'
    
    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)
    
     - task: Docker@2
       inputs:
         command: push
         containerRegistry: $(containerRegistryServiceConnection)
         repository: $(imageRepository)
         tags: |
           $(tag)
       env:
         DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: $(DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE)
         DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE: $(rootPassphrase)
    

    在前面的示例中,变量 DOCKER_CONFIGlogin Docker 任务中的命令设置。 为你的管道将 DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASEDOCKER_CONTENT_TRUST_ROOT_PASSPHRASE 设置为 机密变量

    DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE 在此示例中,引用私钥的通行短语(而不是存储库通行短语)。 此示例中只需要私钥的通行短语,因为存储库已启动(先决条件)。