Amazon Web Services ブログ
IAM Access Analyzer を使用して CloudFormation テンプレートで IAM ポリシーを検証する
本記事は Validate IAM policies in CloudFormation templates using IAM Access Analyzer を翻訳したものです。
本投稿は、Sr. Solutions Architect – the AWS Identity Solutions team の Matt Luttrell により寄稿されました。
このブログ記事では、 AWS CloudFormation テンプレートから AWS Identity and Access Management (IAM) ポリシーを抽出し、テンプレートに対して既存の IAM Access Analyzer policy validation API を実行できるようにするオープンソースツールである AWS CloudFormation IAM Policy Validator (cfn-policy-validator) について説明します。 また、継続的インテグレーションと継続的デリバリー (CI/CD) パイプラインでツールを実行して、CloudFormation テンプレート内の IAM ポリシーを検証してから AWS 環境にデプロイする方法についても説明します。
この検証を CI/CD パイプラインに埋め込むと、IAM Access Analyzer の結果 (Findings) を含む IAM ポリシーが AWS 環境にデプロイされるのを防ぐことができます。このツールは、IAM ポリシーの作成を組織内の開発者に委任できるガードレールとして機能します。また、このツールを使用して、既存のポリシー作成プロセスに対する信頼性を高め、IAM ポリシーをデプロイする前に間違いを見つけることができます。
IAM Access Analyzer とは何ですか?
IAM Access Analyzer は、リソースにアタッチされているアクセスコントロールポリシーを数学的に分析し、パブリックまたは他のアカウントからアクセスできるリソースを決定します。また、IAM Access Analyzer は、100以上のチェックに対してアイデンティティベースのポリシーとリソースベースのポリシーの両方を検証することもできます。各チェックはセキュリティポスチャーを改善し、大規模なポリシー管理を簡素化するのに役立つように設計されています。
AWS CloudFormation ツールの IAM Policy Validator
AWS CloudFormation の IAM Policy Validator (cfn-policy-validator) は、CloudFormation テンプレートからリソースベースおよびアイデンティティベースの IAM ポリシーを解析し、IAM Access Analyzer のチェックを通じてポリシーを実行する新しいコマンドラインツールです。このツールは、CloudFormation テンプレートをデプロイする CI/CD パイプラインで実行され、IAM Access Analyzer の結果に基づきデプロイを防ぐように設計されています。これにより、IAM ポリシーに対して行われた変更が、デプロイされる前に検証されます。
cfn-policy-validator ツールは、テンプレートからすべてのアイデンティティベースのポリシーとリソースベースのポリシーのサブセットを検索します。サポートされているリソースベースのポリシーの完全なリストについては、cfn-policy-validator ツールの GitHub リポジトリ (cfn-policy-validator GitHub repository) を参照してください。
CloudFormation テンプレートからの IAM ポリシーの解析
CloudFormation テンプレートから IAM ポリシーを解析する際に直面する可能性のある課題の1つは、これらのポリシーには、多くの場合、CloudFormation の組み込み関数 (Ref や Fn:GetAtt など) と疑似パラメータ (AWS::AccountId や AWS::Region など) が含まれていることです。例えば、最少権限の IAM ポリシーは別の CloudFormation リソースの Amazon リソースネーム (ARN) を参照するのが一般的です。Amazon Simple Queue Service (Amazon SQS)キューを作成する次の CloudFormation リソースの例と、SQS キューで sqs:SendMessage アクションを実行するためのアクセスを許可するポリシーを持つ IAM ロールを見てみましょう。
図1に示すように、行21では Fn::Sub 関数を使用して、このポリシーをテンプレートで以前に作成した MySQSQueue に制限しています。
この例では、IAM Access Analyzer に書き込まれた root ポリシー (15- 21行目) を渡すと、!Sub ${MySQSQueue.Arn} は、CloudFormation に固有の構文なので、エラーが発生します。cfn-policy-validator ツールは、ポリシーを受け取り、CloudFormation の構文を、アクセスアナライザが解析できる有効な IAM ポリシーの構文に変換します。
cfn-policy-validator ツールは、!Sub ${MySQSQueue.Arn} のような組み込み関数がリソースの ARN を評価するタイミングを認識し、リソースに対して有効な ARN を生成します。このツールは、CloudFormation リソースのタイプ (この例では AWS:SQS::Queue)を、デプロイされたたときにリソースの ARN がどのように見えるかを表すパターンにマッピングすることで ARN を作成します。たとえば、前に参照した SQS キューに対するマッピングは次のようになります。
一部の CloudFormation リソースでは、Ref 組み込み関数も ARN を返します。cfn-policy-validator ツールは、これらのケースも処理します。
cfn-policy-validator は、ARN の6つの部分のそれぞれをウォークスルーし、ARN パターン (${} 内の任意のテキスト) 内の変数の値を置き換えます。${Partition} と ${Account} の値は、cfn-policy-validator ツールを実行するロールのアイデンティティから取得され、${Region} の値は入力フラグとして提供されます。cfn-policy-validator ツールは、キュー名のベストエフォートで解決を実行しますが、通常、デフォルトで CloudFormation リソースの名前に設定されます (前の例では MySQSQueue )。IAM Access Analyzer を使用したポリシーの検証はリソースの名前に依存しないため cfn-policy-validator ツールは、ポリシーチェックに影響を与えずに変わりの名前に置き換えることができます。
MySQSQueue リソースに対して生成される最終的な ARN は、次のようになります ( “111111111111” の ID を持つアカウントの場合):
cfn-policy-validator ツールは、この生成された ARN を !Sub${MySQSQueue.Arn} の代わりに使用します。これにより、cfn-policy-validator ツールがテンプレートから検証のために IAM Access Analyzer に入力できるポリシーを解析できます。
cfn-policy-validator ツールは、CloudFormation テンプレート全体を調べ、テンプレート内のすべてのポリシーに ARN を生成するまで ARN の置換を実行します。
IAM Access Analyzer を使用したポリシーの検証
cfn-policy-validator ツールで IAM ポリシーが有効な形式 (CloudFormation 組み込み関数または疑似パラメータがない)に変換された後、それらのポリシーを IAM Access Analyzer に送り込んで検証することができます。cfn-policy-validator ツールは、IAM Access Analyzer の ValidatePolicy アクションを使用して CloudFormation テンプレート内でリソースベースおよびアイデンティティベースのポリシーを実行します。ValidatePolicy は、ポリシーに正しい文法が設定され、IAM ポリシーのベストプラクティスに従っていることを保証するものです (iam:PassRole をすべてのリソースに許可しないなど)。cfn-policy-validator ツールは、サポートされているリソースポリシーに対して CreateAccessPreview アクションを呼び出して、ポリシーが意図しないパブリックアクセスまたはクロスアカウントアクセスをリソースに付与するかどうかを判断します。
cfn-policy-validator ツールは、IAM Access Analyzer からの結果を、ブロックまたはノンブロックのカテゴリに分類します。ブロックとして分類された結果は、ツールが ”non-zero” の Exitコードで終了し、それによってデプロイが失敗し、CI/CD パイプラインが続行されないようにします。結果がない場合、またはノンブロックの検出のみが検出された場合、Exit コードが ”zero(0)” で終了し、パイプラインは次のステージに進むことができます。cfn-policy-validator ツールが、ブロックおよびノンブロッキングとして分類する結果を決定する方法と、分類をカスタマイズする方法の詳細については、cfn-policy-validator GitHub リポジトリ (cfn-policy-validator GitHub repository) を参照してください。
cfn-policy-validator ツールの実行例
このセクションでは、cfn-policy-validator ツールを使用してポリシー違反がある CloudFormation テンプレートを実行した場合の動作の例について説明します。
次のテンプレートには、ポリシーの結果を含む2つの CloudFormation リソースがあります:
- アカウント “111122223333” に SQS キューへのアクセス権を付与する SQS キューポリシー
- スペルミスの sqs:ReceiveMessages アクションを実行することを許可するポリシーを持つ IAM ロール
これらの問題は、以下のポリシーでハイライトされています。
重要: 図2のポリシーは、望ましくない可能性のある IAM ポリシーを含む CloudFormation テンプレートを示すために作成されています。Principal エレメントを自分のアカウントではないアカウントに設定する場合は注意が必要です。
cfn-policy-validator ツールにパラメータとしてこのテンプレートを渡す場合、テンプレートをデプロイする AWS リージョンを次のように指定します。
cfn-policy-validator ツールを実行すると、IAM Access Analyzer からの実際のレスポンスを含む検証結果が返されます。
cfn-policy-validator ツールからの出力には、結果の種類、結果のコード、および結果を説明するメッセージが含まれます。CloudFormation テンプレートのリソースとポリシー名も含まれており、テンプレート内の結果をすばやく追跡(Track down)して解決できます。前の例では、cfn-policy-validator ツールがブロックとして分類している IAM Access Analyzer による2つの結果 (1つのセキュリティ警告と1つのエラー)が検出されたことを確認できます。IAM Access Analyzer からの実際のレスポンスは詳細で返されますが、簡潔にするために上記は除外されています。
アカウント 111122223333 が信頼できるアカウントであり、SQS キューへのアクセス権を持つ必要があると確信している場合は、この例では、アカウント 111122223333 からの外部アクセスの結果を抑制できます。次のように、–allow-external-principals フラグを使用して、この特定の結果を無視するように cfn-policy-validator ツールの呼び出しを変更します。
次の出力を見ると、sqs:ReceiveMessages が存在しないことを示すブロッキングの結果のみが残ります。
この結果を解決するには、正しいスペル sqs:ReceiveMessage (末尾に続く s を除く)を持つテンプレートを更新します。
サポートされている使用可能なフラグとコマンドの完全なリストについては、cfn-policy-validator ツールの GitHub リポジトリ (cfn-policy-validator GitHub repository) を参照してください。
cfn-policy-validator ツールを実行してローカルコンピューター上のポリシーを検証する方法の例を見てきたので、次に、さらに手順を踏み、CI/CD パイプラインに cfn-policy-validator ツールを埋め込む方法を確認します。CI/CD パイプラインに cfn-policy-validator ツールを埋め込むことで、リポジトリにコミットするたびに IAM ポリシーが検証されるようにすることができます。
CI/CD パイプラインに cfn-policy-validator ツールを埋め込む
この記事で作成する CI/CD パイプラインでは、AWS CodePipeline と AWS CodeBuild を使用します。AWS CodePipeline は、ソフトウェアのリリースに必要な手順をモデル化、可視化、自動化できる継続的な配信サービスです。AWS CodeBuild は、ソースコードをコンパイルし、テストを実行し、デプロイする準備ができているソフトウェアパッケージを生成する、フルマネージドの継続的な統合サービスです。また、CloudFormation テンプレートが保存されているソースリポジトリとして AWS CodeCommit を使用します。AWS CodeCommit は、セキュリティで保護された Git ベースのリポジトリをホストする、フルマネージドのソース管理サービスです。
パイプラインをデプロイするには
- ソースリポジトリと AWS CodePipeline パイプラインを構築する CloudFormation テンプレートをデプロイするには、次の [Launch Stack] ボタンを選択します。
- CloudFormation コンソールで、[レビュー] ページが表示されるまで [次へ] を選択します。
- 「AWS CloudFormationによってIAMリソースが作成される場合があることを承認します。」を選択し、[スタックの作成] を選択します。
- AWS CodeCommit コンソールを開き、[リポジトリ] を選択します。
- cfn-policy-validator-source-repository を選択します。
- template.json ファイルと template-configuration.json ファイルをコンピューターにダウンロードします。
- cfn-policy-validator-source-repository の中で, 右側にある [ファイルの追加] のプルダウンメニューから [ファイルのアップロード] を選択します。.
- [Choose File] を選択し、以前にダウンロードしてきた template.json ファイルを選びます。
- 作成者名とEメールアドレスを入力し、[変更のコミット] を選択します。
- cfn-policy-validator-source-repository の中で、template-configuration.json ファイルに対して手順7-9を繰り返します。
パイプラインの検証を表示するには
- AWS CodePipeline コンソールで、IAMPolicyValidatorPipeline を選択します。
- コミットがパイプラインを通過するのを確認します。前の手順に従って2つの個別のコミットを行った場合は、最初のパイプライン実行の失敗した結果を無視できます。図3に示すように、パイプラインが CfnPolicyValidator アクションの Validation ステージで失敗することがわかります。これは、コミットしたテンプレートでブロック結果が検出されたため、無効なポリシーが AWS 環境に到達できなくなったためです。
- 図 3 に示すように、CfnPolicyValidator で [詳細] を選択します。
- [アクションの実行に失敗しました] ポップアップで、[実行の詳細へのリンク] を選択して、AWS CodeBuild で cfn-policy-validator ツールの出力を表示します。
パイプラインでの cfn-policy-validator のデプロイに関するアーキテクチャ概要
図4に展開した CI/CD パイプラインのアーキテクチャ概要を確認できます。
図4 は、左側の CodeCommit ソースアクションから始まる次の手順を示しています。
- パイプラインは、AWS CodeCommit ソースコードリポジトリにコミットすると開始されます。AWS CodeCommit リポジトリには、AWS 環境にデプロイする IAMポリシーを含む CloudFormation テンプレートが含まれています。
- AWS CodePipeline は、ソースコードリポジトリ内の変更を検出し、Validation Stage を開始します。最初に AWS CloudFormation Linter (cfn-lint) を使用して CloudFormation テンプレートを実行する AWS CodeBuild プロジェクトを開始します。cfn-lint ツールは、CloudFormation リソース仕様に照らしてテンプレートを検証します。この最初のステップを実行すると、IAM ポリシーを検証する前に CloudFormation テンプレートが有効であるか確認されます。これはオプションの手順ですが、推奨される手順です。初期段階でのスキーマ検証はテンプレート内の入力ミスに対するフィードバックを迅速に行います。テンプレートに無効なスキーマがある場合、追加の静的分析ツールを実行するメリットはほとんどありません。
- cfn-lint ツールが正常に完了した場合は、別の AWS CodeBuild プロジェクトを呼び出して、AWS CloudFormation の IAM Policy Validator (cfn-policy-validator) を呼び出します。cfn-policy-validator ツールは、前述のように、アイデンティティベースのポリシーとリソースベースのポリシーをテンプレートから抽出し、IAM Access Analyzer を使用してポリシーを実行します。
注:テンプレートにパラメータがある場合は、cfn-policy-validator ツールにパラメータを指定する必要があります。パラメータはコマンドライン引数として指定することも、テンプレート構成ファイル (template configuration file) を使用することもできます。AWS CodePipeline パイプラインで検証を実行する場合は、テンプレート設定ファイルを使用することをお勧めします。CloudFormation テンプレートをデプロイする場合も、デプロイステージで同じファイルを使用できます。テンプレート構成ファイルを使用すると、テンプレートの検証とデプロイに同じパラメータを使用できます。このブログ投稿で提供されるパイプラインの CloudFormation テンプレートは、デフォルトでテンプレート構成ファイルを使用します。
ポリシー検証でブロックの結果が見つからない場合、cfn-policy-validator ツールは Eixt コードが ”zero(0)” で終了し、パイプラインは次のステージに移動します。ブロックの結果が検出されると、cfn-policy-validator ツールは ”non-zero” の Exit コードで終了し、パイプラインが停止して、望ましくない IAM ポリシーのデプロイを防ぎます。
- パイプラインの最終ステージでは、AWS CodePipeline の AWS CloudFormation アクションを使用して、テンプレートを環境にデプロイします。テンプレートは、検証ステージで実行されるすべての静的分析チェックに合格した場合にのみ、このステージに作成されます。
クリーンアップ
今後の料金が発生しないように、AWS CloudFormation コンソールで validate-iam-policy-pipeline を削除します。これにより、AWS アカウントから検証パイプラインが削除されます。
サマリー
このブログ記事では、AWS CloudFormation の IAM Policy Validator (cfn-policy-validator) について紹介しました。cfn-policy-validator ツールは、CloudFormation テンプレートからアイデンティティベースおよびリソースベースの IAM ポリシーの解析を自動化し、IAM Access Analyzer を介してそれらのポリシーを実行します。これにより、テンプレートのポリシーが IAM のベストプラクティスに従い、AWS リソースへの意図しない外部アクセスが許可されないことを検証できます。
AWS CloudFormation の IAM Policy Validator を CI/CD パイプラインに含める方法を説明しました。これにより、リポジトリへのコミットごとに IAM ポリシーの検証を実行し、検証が成功した場合にのみテンプレートをデプロイできます。
詳細については、またはフィードバックと機能の要求を提供するには、cfn-policy-validator ツールの GitHub リポジトリ (cfn-policy-validator GitHub repository) を参照してください。
翻訳は Solutions Architect の岡本真樹が担当しました。原文はこちらです。