[アップデート] Amazon ECR にプッシュされたコンテナイメージを自動で署名できる「マネージド署名」を使ってみた
いわさです。
コンテナイメージでは信頼できる相手のイメージのみを許可するなど追加のチェックのために署名が使われることがあります。
これまで Amazon ECR でこれを行うためには、AWS Signer と Notation のプラグインで署名を行うことが出来ました。
また、Amazon EKS などでは Ratify や Kyverno などを使ってコンテナイメージの署名検証を行うことが出来ます。
ただし、前述の方法では署名を行うために手動で署名を行う必要がありました。
これが先日のアップデートで、Amazon ECR プライベートレジストリの設定で「マネージド署名」を有効化できるようになりました。
このマネージド署名を使うと既存あるいは新規の AWS Signer プロファイルを統合し、対象条件に一致するリポジトリにプッシュされたイメージを自動で署名させることが出来ます。
今回こちらの機能を使って署名と検証を行ってみましたので紹介します。
マネージド署名機能の設定
早速ですが、マネージド署名機能を設定してみましょう。
Amazon ECR コンソールのプライベートレジストリにある「Features & Settings」にこの機能が追加されています。

マネージド署名ルールはレジストリごとに最大 10 個の署名ルールを設定することが出来ます。
ここで一覧管理します。

作成ボタンから新規作成を行ってみましょう。
必要な情報は署名に使う AWS Signer プロファイルと、フィルターです。
AWS Signer プロファイルは既存のものを使うことも出来ますし、新しくこの画面から作成することも出来ます。

私は AWS Signer プロファイルをまだ持っていなかったので上記画面から新規作成してみました。
とりあえずリポジトリフィルターは適当な感じで。
作成後マネージド署名ルール一覧に作成したルールが表示されます。

署名プロファイルを選択すると、AWS Signer コンソールへ移動します。
ここで先程作成した AWS Signer 署名プロファイルを確認することが出来ますね。

ちなみにですが、AWS Signer はサービス自体の料金ページは存在せず、利用料金は各サービスの料金ページに記載されています。
今回であれば Amazon ECR の料金にマネージド署名の利用料金が記載されていました。
Number of singatures generated by ECR: $0.02 per signature
東京リージョンで 1 署名あたり $0.02 発生します。
検証する
では実際にイメージをプッシュしてマネージド署名の挙動を検証してみましょう。
ローカルで署名検証環境を準備する(macOS)
署名検証はローカル環境に Notation CLI をセットアップして手動で検証します。
以下の公式ドキュメントで AWS Signer + Notation CLI をプラグインつきでインストールできます。
インストール後は AWS Signer の ARN を指定してトラストストアポリシーを作成します。

{
"version":"1.0",
"trustPolicies":[
{
"name":"aws-signer-tp",
"registryScopes":[
"*"
],
"signatureVerification":{
"level":"strict"
},
"trustStores":[
"signingAuthority:aws-signer-ts",
"signingAuthority:aws-us-gov-signer-ts"
],
"trustedIdentities":[
"arn:aws:signer:ap-northeast-1:123456789012:/signing-profiles/EcrSignerProfile"
]
}
]
}
Notation CLI を使ってポリシーをインポートします。
適当なリモートリポジトリの検証をしてみます。
% notation policy import hoge.json
Trust policy configuration imported successfully.
% notation verify 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/dotnet-generic-28d92cb8:latest
Error: failed to get manifest descriptor: HEAD "https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/v2/dotnet-generic-28d92cb8/manifests/latest": response status code 403: Forbidden
拒否されました。ECR プライベートレジストリ認証してなかったかも。
% aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
% notation verify 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/dotnet-generic-28d92cb8:latest
Warning: Always verify the artifact using digest(@sha256:...) rather than a tag(:latest) because resolved digest may not point to the same signed artifact, as tags are mutable.
Error: signature verification failed: no signature is associated with "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/dotnet-generic-28d92cb8@sha256:f42aaf61a6eb7f1d2d036acbf877b4a24a964211d5f899a8a1b269d82bc0e037", make sure the artifact was signed successfully
いけましたね。
署名検証は実行できて、検証結果としては失敗しています。
リポジトリを用意してマネージド署名ルールを構成
次のように2つのリポジトリを用意します。

そしてマネージド署名ルールでひとつのリポジトリだけ対象となるようにリポジトリフィルターを設定しましょう。

イメージプッシュ後に署名検証などしてみる
割愛しますがローカルで適当な Dockerfile を用意してそれぞれのリポジトリへプッシュしておきます。
そしてそれぞれのイメージを確認してみましょう。
まずマネージド署名対象外のリポジトリです。
次のようにイメージがプッシュされていますね。

Notation CLI を使って署名検証してみます。
% notation verify 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hoge1125:latest
Warning: Always verify the artifact using digest(@sha256:...) rather than a tag(:latest) because resolved digest may not point to the same signed artifact, as tags are mutable.
Error: signature verification failed: no signature is associated with "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hoge1125@sha256:398d197ab17eccb80be2b9dc67ff7ec0000e9aefef2cf019ab2164c702465cbc", make sure the artifact was signed successfully
検証失敗しましたね。期待どおりです。
続いて、マネージド署名対象のリポジトリです。
次のようにイメージがプッシュされていますが、アーティファクトメディアタイプがapplication/vnd.cncf.notary.signatureのものが追加されていました。

各イメージを確認してみると、次のようにマネージド署名ステータスというものが確認できるようになっています。なるほど。

ではこちらも Notation CLI を使って署名検証してみましょう。
% notation verify 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hoge1125b:latest
Warning: Always verify the artifact using digest(@sha256:...) rather than a tag(:latest) because resolved digest may not point to the same signed artifact, as tags are mutable.
Successfully verified signature for 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hoge1125b@sha256:804f26836f22d4b8098e3af6aa81ae5654778ed25a3a7e99cdb1b083035fe8d5
今度は署名検証に成功しましたね。自動で署名されていることが確認できました。
さいごに
本日は Amazon ECR にプッシュされたコンテナイメージを自動で署名できる「マネージド署名」を使ってみました。
これまで手動署名がちょっと手間だったなという方はぜひ使ってみてください。
また AWS Signer でのコンテナイメージの署名の敷居が高かったという方も、この機能でお手軽に使えるようになるのでこれを機に検討してみてください。






