Docker コンテンツの信頼

Azure DevOps Services

Docker コンテンツの信頼 (DCT) を使用すると、リモート Docker レジストリとの間で送受信されるデータにデジタル署名を使用できます。 これらの署名を使用すると、特定のイメージ タグの整合性と発行元をクライアント側またはランタイムで検証できます。

注意

イメージに署名するための前提条件は、Notary サーバーがアタッチされた Docker レジストリです (例: Docker Hub または Azure Container Registry)

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 では、(リポジトリのパスフレーズではなく) 秘密キーのパスフレーズを参照しています。 リポジトリは既に開始されているため (前提条件)、この例では秘密キーのパスフレーズのみが必要です。