Azure Pipeline で Notation を使用してコンテナー イメージに署名して検証する
Azure DevOps の Notation タスクは、Azure Pipeline 内でコンテナー イメージやその他の Open Container Initiative (OCI) 成果物に署名して検証するための組み込みタスクです。 Notation タスクでは、Notation CLI を使用してこれらの操作を実行し、成果物が信頼されたエンティティによって署名され、作成後に改ざんされていないことを確認します。
この記事では、コンテナー イメージを構築し、それを ACR にプッシュし、Notation と Azure Key Vault プラグインを使用して署名を追加する Azure パイプラインを作成し、成果物のセキュリティと整合性のレイヤーを提供する手順について説明します。 パイプラインの目標は次のとおりです。
- コンテナー イメージをビルドし、Azure Container Registry (ACR) にプッシュします。
- Notation と Notation Azure Key Vault プラグインを使用してイメージに署名します。 その後、署名は自動的に ACR にプッシュされます。
前提条件
- Azure Key Vault に Key Vault を作成し、自己署名署名キーと証明書を生成します。 この ドキュメント は、テスト目的で自己署名キーと証明書を作成するために使用できます。 CA が発行した証明書がある場合は、この ドキュメント を参照して詳細を確認してください。
- Azure Container Registry (ACR) でレジストリを作成します。
- Azure DevOps リポジトリまたは GitHub リポジトリがあることを確認します。
サービス接続の作成
Azure Pipelines でサービス接続を作成します。これにより、パイプラインは Azure Container Registry (ACR) などの外部サービスにアクセスできます。次の手順を実行できます。
ACR 資格情報を使用して Azure Container Registry (ACR) でイメージに署名します。
Azure Pipelines の Docker タスク を使用して、ACR にログインします。 Docker タスクは、特に Docker イメージをビルド、プッシュ、プルできる Azure Pipelines の組み込みタスクです。
次のように、Azure Pipeline で Docker Registry サービス接続を確立して、Notation タスクに ACR レジストリへのアクセスを許可します。
- 組織 (
https://dev.azure.com/{yourorganization}
) にサインインし、プロジェクトを選択します。 - 左下隅にある [設定] ボタンを選択します。
- [パイプライン] に移動し、[サービス接続] を選択します。
- [新しいサービス接続] を選択し、[Docker Registry] を選択します。
- 次に、[Azure Container Registry] を選択 します。
- [認証の種類] で [サービス プリンシパル] を選択し、Azure サブスクリプションや ACR レジストリなどのサービス プリンシパルの詳細を入力します。
- このサービス接続を参照するときに使用するわかりやすい接続名を入力します。
- 組織 (
Azure Pipelines で Azure Resource Manager サービス接続を作成し、Azure Key Vault へのアクセスを承認します。
- [サービス プリンシパル (自動)] を選択します。
- 次に、[サブスクリプション] を選択し、ドロップダウン リストから Azure サブスクリプションを見つけます。
- ドロップダウン リストから使用可能なリソース グループを選択します。
- このサービス接続を参照するときに使用するわかりやすい サービス接続名 を入力します。
- 保存して作成を完了します。
次の手順に従って、サービス プリンシパルにアクセス ポリシーを付与します。
- 作成した Azure Resource Manager サービス接続を開き、[サービス プリンシパルの管理] をクリックして Azure サービス プリンシパル ポータルに入ります。
Application (client) ID
をコピーします。 サービス プリンシパルのアクセス許可を付与するために使用されます。- Azure Key Vault ポータルを開き、アクセス ポリシー ページを入力します。
- アクセス許可を持つ新しいアクセス ポリシーを
key sign
secret get
certificate get
作成します。 - 前の手順の貼り付けを使用して、この新しいアクセス ポリシーを
Application (client) ID
サービス プリンシパルに付与します。 - 保存して作成を完了します。
サービス接続 の詳細については、こちらをご覧ください。
パイプラインを作成し、Notation タスクを使用する
次の手順に従って、Git リポジトリ用の Azure パイプラインを作成します。
- AOD 組織内のプロジェクトに移動します。
- 左側のメニューから [パイプライン] に移動し、[新しいパイプライン] を選択します。
- Git リポジトリを選択します。 デモンストレーションの利便性のために Azure DevOps リポジトリを使用します。
- Azure DevOps を初めて使用する場合は、スターター パイプラインを使用してパイプラインを構成します。 [保存して実行] をクリックして、パイプラインを確認して作成します。
Note
この例では、既定のブランチmain
が . そうでない場合は、ガイドに従って既定のブランチを更新してください。
Azure パイプラインを編集して Notation タスクを追加するには、次の 2 つの方法があります。
Azure DevOps (ADO) パネルを使用する: ADO パネルには、パイプラインにタスクを追加できるユーザー インターフェイスが用意されています。 Notation タスクを検索し、このインターフェイスを使用してパイプラインに追加できます。
サンプルの Azure Pipeline ファイルからコピーする: Notation タスクが既に含まれているサンプル Azure Pipeline ファイルがある場合は、サンプル ファイルからこれらのタスクをコピーしてパイプライン ファイルに貼り付けることができます。
オプション 1: Azure DevOps (ADO) 編集パネルを使用する
右側の Docker
パイプライン編集パネルからタスクを検索します。 login
そのコマンドを Docker レジストリ サービス接続と共に使用して、ACR で認証します。
- [コンテナー レジストリ] ドロップダウン リストから、前の手順で作成した Docker レジストリ サービス接続を 選択します。
- [コマンド] ドロップダウン リストから選択
login
します。 - [追加] をクリックして、コマンドを含む
login
Docker タスクをパイプライン ファイルに左に追加します。
同様に、パイプライン編集パネルからタスクをもう一度検索 Docker
します。 その buildAndPush
コマンドを使用して、ソース コードをイメージに自動的にビルドし、ターゲット ACR リポジトリにプッシュします。 次の手順での署名に使用されるイメージ ダイジェストが生成されます。
- リポジトリ名をコンテナー リポジトリに 入力します。
- [コマンド] ドロップダウン リストから buildAndPush を選択します。
- Dockerfile のファイル パスを指定します。 たとえば、Dockerfile がルート フォルダーに格納されている場合に使用
./Dockerfile
します。 - [追加] をクリックして、コマンドを含む
buildAndPush
Docker タスクをパイプライン ファイルに左に追加します。
右側の Notation
パイプライン編集パネルからタスクを検索します。
- 実行するドロップダウン リスト コマンドから [インストール] を選択します。
- [追加] をクリックして、タスクを
notation install
パイプラインに追加します。 - 同様に、パイプライン編集パネルからタスクをもう一度検索
Notation
し、[署名] を選択します。 - Docker タスクによってビルドされてレジストリにプッシュされた最新のダイジェストを使用してイメージに署名するため、アーティファクト参照をスキップできます。 代わりに、次を使用して
<registry_host>/<repository>@<digest>
手動でダイジェストを指定できます。 - フォームにプラグインの構成を入力します。 前の手順で作成した既定の AKV プラグインとサービス接続を使用します。 キー ID を AKV からキー ID にコピーします。
- デモンストレーションの利便性のために 自己署名証明書 を使用するため、[自己署名証明書] ボックスをオンにします。 CA によって発行された証明書を使用する場合は、証明書バンドル ファイル パスに 証明書ファイル パス を入力できます。
- [追加] をクリックして、
notation sign
パイプライン ファイルを左に追加します。
オプション 2: サンプルの Azure Pipeline ファイルを編集する
- Azure Pipelines と Notation に慣れている場合は、テンプレート パイプライン ファイルから始めるのが効率的です。
- ドキュメントに用意されているパイプライン テンプレートを独自のパイプライン ファイルにコピーします。 このテンプレートは、コンテナー イメージの署名と検証に使用される Notation タスクを使用するように設計されています。
- テンプレートをコピーした後、以下に示す参照とコメントに従って、必要な値を入力します。
オプション 1 の署名タスク テンプレートを参照してください (ここをクリック)。
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
Note
Docker タスクを使用する以外に、次のようにアーティファクト参照を手動で指定することで、指定されたイメージ ダイジェストに artifactRefs
署名できます。
例を参照してください (ここをクリックしてください)。
# 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
パイプラインをトリガーする
Azure DevOps でパイプラインを実行し、その実行を確認する手順に従います。
- パイプライン内の入力を入力した後、それを保存して実行してパイプラインをトリガーします。
- 実行中のパイプラインの [ジョブ] ページに移動します。 ここでは、各ステップの実行を確認できます。 このパイプラインは、最新のビルドまたは指定されたダイジェストをビルドして署名し、署名されたイメージとそれに関連付けられている署名をレジストリにプッシュします。
- 正常に実行されると、CBOR オブジェクト署名と暗号化 (CO Standard Edition) 形式の署名がアタッチされた状態で、Azure Container Registry (ACR) にプッシュされたイメージを確認できます。
署名されたイメージを確認する
同様に、署名されたイメージを確認するには、編集パネルを使用するか、パイプライン ファイルを編集して、表記 verify
タスクをパイプラインに追加します。 パイプラインは、指定した信頼ポリシーと信頼ストアを使用して署名されたイメージを検証します。
信頼ポリシーと信頼ストアを準備する
一般に、検証ツールは署名者とは異なります。 デモンストレーションの目的で、このサンプルでは同じパイプラインと ADO リポジトリを使用します。 次の手順に従って、Notation 信頼ポリシー、信頼ストアを作成し、パイプラインにタスクをverify
追加します。
- 現在の ADO リポジトリで、Notation 信頼ポリシーを格納するサンプル フォルダーを作成します
.pipeline
.pipeline/trustpolicy/
。 信頼ポリシー JSON ファイルtrustpolicy.json
のサンプルを作成します。 信頼ポリシー テンプレートに独自の値を入力し、フォルダーに保存します。
Note
Notation Trust Store では現在、証明機関 (CA)、SigningAuthority、タイム スタンプ機関 (TSA) ルート証明書など、3 種類の ID がサポートされています。 デモンストレーションの目的で、以下の信頼ポリシーと信頼ストアで証明機関 (CA) x509/ca
を使用します。 詳細については、 信頼ストア を参照してください。
信頼ポリシー テンプレートを参照してください (ここをクリックしてください)。
{
"version": "1.0",
"trustPolicies": [
{
"name": "<yourPolicyName>",
"registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
"signatureVerification": {
"level" : "strict"
},
"trustStores": [ "ca:<yourTrustStore>"],
"trustedIdentities": [
"*"
]
}
]
}
- 現在の ADO リポジトリで、証明書を格納する Notation 信頼ストア
/.pipeline/truststore/x509/ca/$<yourTrustStore>/
用の新しいフォルダーを作成します。 このドキュメントの署名手順に従ってイメージに署名した場合は、次のコマンドを使用して、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
- 最後の手順で作成した信頼ストア フォルダー
/.pipeline/truststore/x509/ca/$<yourTrustStore>/
に証明書をアップロードします。
表記検証タスクの追加
- パイプライン編集パネルから Notation タスクをもう一度検索し、[確認] を選択します。
- 成果物参照に署名済みイメージのダイジェストを入力します。
- 信頼ポリシー ファイルパスに値
.pipeline/trustpolicy/trustpolicy.json
を 入力します。 - 信頼ストア フォルダーパスに値
.pipeline/truststore/
を 入力します。 - [追加] をクリックして、パイプライン ファイルの左側に表記検証を追加します。
次 notation verify
のように保存されます。
例を参照してください (ここをクリックしてください)。
# sign the artifact
- task: Notation@0
inputs:
command: 'verify'
artifactRefs: '<registry_host>/<repository>@<digest>'
trustPolicy: .pipeline/trustpolicy.json
trustStore: .pipeline/truststore/
パイプラインをトリガーする (更新)
パイプラインを再度トリガーして、署名されたイメージを確認できます。 正常に実行されると、実行中のパイプラインの [ジョブ] ページからログを確認できます。 パイプラインは、指定した信頼ポリシーと信頼ストアを使用して署名されたイメージを検証します。
まとめ
この記事では、Azure Pipeline で Notation を使用してコンテナー イメージに署名して検証する方法について説明します。 Azure DevOps パネルを使用するか、パイプライン ファイルを編集して、Notation タスクをパイプラインに追加できます。 パイプラインは、指定した信頼ポリシーと信頼ストアを使用して、イメージをビルド、プッシュ、署名、検証します。 このプロセスにより、成果物が信頼されたエンティティによって署名され、作成後に改ざんされていないことが保証されます。