Azure DevOps Services
Docker Content Trust (DCT) を使用すると、リモート Docker レジストリとの間で送受信されるデータにデジタル署名を使用できます。 これらの署名を使用すると、クライアント側または実行時に特定のイメージ タグの整合性と発行元を確認できます。
注
イメージに署名するには、Notary サーバーが接続された Docker レジストリが必要です (たとえば、 Docker Hub や Azure Container Registry など)。
Azure Pipelines でのイメージの署名
開発用コンピューターの前提条件
- Docker 信頼の組み込みジェネレーターを使用するか、委任キー ペアを手動で生成します。 組み込みジェネレーターが使用されている場合、委任秘密キーはローカル Docker 信頼ストアにインポートされます。 それ以外の場合は、ローカルの Docker 信頼ストアに秘密キーを手動でインポートする必要があります。 詳細については、 キーの手動生成を 参照してください。
- 前の手順で生成した委任キーを使用して、最初のキーを委任にアップロードし、 リポジトリを開始します。
ヒント
ローカル委任キーの一覧を表示するには、Notary CLI を使用して次のコマンドを実行します: $ notary key list
。
イメージに署名するためのパイプラインを設定する
開発マシン上のローカル Docker 信頼ストアから委任秘密キーを取得し、パイプラインで セキュリティで保護されたファイル として追加します。
このセキュリティで保護されたファイル をすべてのパイプラインで使用することを承認します。
containerRegistryServiceConnection
に関連付けられているサービス プリンシパルには、ターゲット コンテナー レジストリに AcrImageSigner ロールが必要です。次の 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_CONFIG
変数は Docker タスクのlogin
コマンドによって設定されています。 パイプラインのDOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE
としてDOCKER_CONTENT_TRUST_ROOT_PASSPHRASE
とを設定します。DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE
この例では、(リポジトリパスフレーズではなく) 秘密キーのパスフレーズを参照しています。 リポジトリが既に開始されているため(前提条件)、この例では秘密キーのパスフレーズのみが必要です。