AWS Signer で実現するコード署名 - Lambda 関数とコンテナイメージの信頼性保証
Lambda 関数とコンテナイメージにコード署名を適用し、CI/CD パイプラインで署名検証を強制する。署名のリボケーションによる侵害対応も紹介します。
コード署名の必要性
コード署名は、デプロイされるコードが信頼された発行元から提供され、改ざんされていないことを暗号学的に確かめる仕組みです。サプライチェーン攻撃でビルドパイプラインが侵害された場合に備え、署名の検証で、信頼された署名の無いコードのデプロイを止められます。2020 年の SolarWinds の事件のようにビルド環境が侵入の対象になる事例があり、コード署名はその対策の 1 つです。AWS Signer は、Lambda 関数のデプロイパッケージとコンテナイメージの署名と検証に使える、フルマネージドのコード署名サービスです。
Lambda のコード署名
Lambda のコード署名設定 (Code Signing Configuration) で、信頼する署名プロファイルの ARN (最大 20 個) と、署名検証失敗時のアクション (Warn または Enforce) を定義します。Enforce モードでは署名されていない関数や、信頼されていない署名プロファイルで署名された関数のデプロイがブロックされます。Warn モードでは検証失敗をログに記録しつつデプロイを許可するため、段階的な導入に使えます。CI/CD パイプラインでは、CodeBuild でビルドした ZIP パッケージを Signer の StartSigningJob API で署名し、署名済みパッケージの S3 URL を Lambda の UpdateFunctionCode に渡すフローを構築します。署名ジョブは非同期で実行され、完了するとコールバック通知を EventBridge に送信できます。
コンテナイメージ署名と CI/CD 統合
AWS Signer は ECR のコンテナイメージに対する Notation 形式の署名をサポートします。CI/CD パイプラインのビルドステージでイメージをビルドし、Signer で署名した後に ECR にプッシュします。EKS のアドミッションコントローラーで署名の検証を強制し、署名されていないイメージのデプロイを拒否します。署名プロファイルで署名に使用する暗号アルゴリズム (ECDSA P-256 または RSA) と有効期間を定義し、プロファイルの有効期限が切れると新しい署名が生成できなくなりますが既存の署名は有効なままです。署名のリボケーション (取り消し) で、侵害された署名プロファイルで署名されたコードを無効化できます。リボケーション後に署名検証を行うと検証失敗となり、該当コードのデプロイがブロックされます。
署名プロファイルの運用設計
署名プロファイルの設計は組織のデプロイ体制に合わせます。チームごとに個別のプロファイルを作成すると、あるチームのプロファイルが侵害された場合に影響範囲をそのチームのアーティファクトに限定できます。プロファイルの有効期間は短すぎるとローテーション運用の負荷が高くなり、長すぎると侵害時のリスク期間が延びるため、組織のリスク許容度に応じて設定します。IAM ポリシーで signer:StartSigningJob の実行を特定のロール (CI/CD パイプラインのビルドロール) に限定し、開発者個人が署名できない構成にすると、署名できるのはそのビルドロールに限られます。CloudTrail で署名の操作を記録し、誰がいつ何を署名したかの監査証跡を残します。
他の署名方式との比較
コード署名の実現方法には AWS Signer 以外にも選択肢があります。Cosign (Sigstore プロジェクト) はオープンソースのコンテナ署名ツールで、keyless signing (短命証明書) をサポートしますが、署名インフラの運用と鍵管理を自前で行う必要があります。AWS Signer は鍵の生成 / 保管 / ローテーションをマネージドで提供し、KMS 統合により鍵がハードウェアセキュリティモジュール (HSM) で保護されます。GPG 署名は git commit の署名に使われ、Lambda や ECR のデプロイ時の検証には別の仕組みを使います。AWS Signer は Lambda Code Signing Configuration や EKS のアドミッションコントローラーと組み合わせて、追加のインフラを置かずにデプロイ時の検証を強制できます。一方、マルチクラウド環境で統一した署名ポリシーをとる場合は、Notation や Cosign を使う構成をとれます。
Signer の料金
AWS Signer を AWS Lambda、Amazon ECR、Amazon EKS などと使う場合、追加の料金はかかりません。署名の検証は無料です。署名プロファイルの管理に追加料金は発生しません。
まとめ
AWS Signer は Lambda 関数とコンテナイメージのコード署名を提供し、デプロイされるコードの完全性を確かめるフルマネージドのサービスです。CI/CD パイプラインのビルドステージで署名し、Lambda のコード署名設定や EKS のアドミッションコントローラーで署名検証を強制することで、サプライチェーン攻撃に対する防御層を追加します。署名プロファイルをチームごとに分け、IAM で署名の権限を限る設計にすると、侵害された時の影響の範囲を狭められます。
参考資料 (AWS 公式)
本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。
本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。