AWS Signer で実現するコード署名 - Lambda 関数とコンテナイメージの信頼性保証
Lambda 関数とコンテナイメージにコード署名を適用し、CI/CD パイプラインで署名検証を強制する。署名のリボケーションによる侵害対応も紹介します。
コード署名の必要性
コード署名はデプロイされるコードが信頼された発行元から提供され、改ざんされていないことを暗号学的に保証する仕組みです。サプライチェーン攻撃でビルドパイプラインが侵害された場合でも、署名検証により不正なコードのデプロイを防止できます。2020 年の SolarWinds 事件に代表されるように、ビルド環境への侵入は高度化しており、コード署名はゼロトラストデプロイの基盤技術です。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) と有効期間を定義し、プロファイルの有効期限が切れると新しい署名が生成できなくなりますが既存の署名は有効なままです。署名のリボケーション (取り消し) で、侵害された署名プロファイルで署名されたコードを無効化できます。リボケーション後に署名検証を行うと検証失敗となり、該当コードのデプロイがブロックされます。 Signer の実践的な知識を深めるには、専門書籍 (Amazon)が役立ちます。
署名プロファイルの運用設計
署名プロファイルの設計は組織のデプロイ体制に合わせます。チームごとに個別のプロファイルを作成すると、あるチームのプロファイルが侵害された場合に影響範囲をそのチームのアーティファクトに限定できます。プロファイルの有効期間は短すぎるとローテーション運用の負荷が高くなり、長すぎると侵害時のリスク期間が延びるため、組織のリスク許容度に応じて設定します。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 の料金は署名操作の回数で課金されます。署名の検証は無料です。CI/CD パイプラインで頻繁にビルド・署名を行う場合、コンテナイメージの署名コストが積み上がるため、開発環境では署名を省略し、ステージング・本番環境のみで署名を強制する運用でコストを管理します。署名プロファイルの管理に追加料金は発生しません。Lambda のコード署名は署名あたりの単価が低いため、デプロイ頻度が高くてもコスト影響は小さく抑えられます。
まとめ
AWS Signer は Lambda 関数とコンテナイメージのコード署名を提供し、デプロイされるコードの信頼性を暗号学的に保証するマネージドサービスです。CI/CD パイプラインのビルドステージで署名し、Lambda のコード署名設定や EKS のアドミッションコントローラーで署名検証を強制することで、サプライチェーン攻撃に対する防御層を追加します。署名プロファイルのチーム分離と IAM による署名権限の制限により、侵害時の影響範囲を最小化する設計が実現できます。