Terraform を使用して組織の Amazon GuardDuty を自動的に有効にする - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Terraform を使用して組織の Amazon GuardDuty を自動的に有効にする

作成者: Aarthi Kannan (AWS)

コードリポジトリ: amazon-guardduty-for-aws-organizations-with-terraform

環境:本稼働

テクノロジー: セキュリティ、アイデンティティ、コンプライアンス DevOps

ワークロード:その他すべてのワークロード

AWS サービス: Amazon GuardDuty; AWS Organizations

[概要]

Amazon は、Amazon Web Services (AWS) アカウント GuardDuty を継続的にモニタリングし、脅威インテリジェンスを使用して、AWS環境内の予期しないアクティビティや悪意のある可能性のあるアクティビティを特定します。 GuardDuty 複数のアカウントや組織、複数のAWSリージョン、または AWS マネジメントコンソールを使用して を手動で有効にすると、面倒な作業になる可能性があります。Terraform などのinfrastructure as code (IaC ツールを使用すると、このプロセスを自動化できます。このツールでは、マルチアカウント、マルチリージョンのサービスとリソースをクラウドにプロビジョニングして管理できます。

AWS では、AWSOrganizations を使用して で複数のアカウントを設定および管理することを推奨しています GuardDuty。このパターンは、その推奨事項に準拠しています。このアプローチの利点の 1 つは、新しいアカウントが作成または組織に追加されたときに、手動で介入することなく、サポートされているすべてのリージョンでこれらのアカウントで自動有効化 GuardDuty されることです。

このパターンは、 HashiCorp Terraform を使用して、組織内の 3 つ以上の Amazon Web Services (AWS) アカウント GuardDuty で Amazon を有効にする方法を示しています。このパターンで提供されるサンプルコードは以下の処理を行います。

  • AWS Organizations のターゲット組織の現在のメンバーであるすべてのAWSアカウント GuardDuty に対して を有効にします

  • 自動有効化機能をオンにします。これにより GuardDuty、今後ターゲット組織に追加されたすべてのアカウント GuardDuty に対して が自動的に有効になります。

  • 有効にするリージョンを選択できます。 GuardDuty

  • 組織のセキュリティアカウントを GuardDuty 委任管理者として使用します

  • ログ記録アカウントに Amazon Simple Storage Service (Amazon S3) バケットを作成し、このバケット内のすべてのアカウントから集約された検出結果を公開 GuardDuty するように を設定します。

  • デフォルトで 365 日後に S3 バケットから Amazon S3 Glacier Flexible Retrievalストレージに検出結果を移行するライフサイクルポリシーを割り当てます

このサンプルコードは、継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインに統合することができます。

ターゲットオーディエンス

このパターンは、Terraform、Python、 GuardDutyおよび AWSOrganizations の使用経験があるユーザーに推奨されます。

前提条件と制限

前提条件

  • アクティブ AWS アカウント。

  • 組織は AWS Organizations で設定され、少なくとも次の 3 つのアカウントが含まれています。

    • 管理アカウント — スタンドアロンまたは CI/CD パイプラインの一部として Terraform コードをデプロイするアカウントです。Terraform の状態もこのアカウントに保存されます。

    • セキュリティアカウント – このアカウントは GuardDuty 委任された管理者として使用されます。詳細については、 GuardDuty 「委任管理者にとって重要な考慮事項 (GuardDuty ドキュメント)」を参照してください。

    • ログ記録アカウント – このアカウントには、すべてのメンバーアカウントから集約された結果 GuardDuty を発行する S3 バケットが含まれています。

    必要な設定で組織をセットアップする方法の詳細については、「アカウント構造を作成する (AWS Well-Architected Labs)」を参照してください。

  • Terraform の状態を管理アカウントに保存するためのリモートバックエンドとして機能する Amazon S3 バケットと Amazon DynamoDB テーブル。Terraform 状態にリモートバックエンドを使用する方法の詳細については、「S3 バックエンド」 (Terraform ドキュメント)を参照してください。S3 バックエンドでリモート状態管理を設定するコードサンプルについては、remote-state-s「3-backend (Terraform Registry)」を参照してください。次の要件に注意してください。

    • キーおよび S3 バケットは同じリージョンにある必要があります。

    • DynamoDB テーブルを作成する場合、パーティションキーは LockID (大文字と小文字を区別)、パーティションキータイプは「文字列」でなければなりません。他の設定はすべてデフォルト値のままにしておきます。詳細については、「プライマリキーについて」と「テーブルを作成する」 (DynamoDB ドキュメント) を参照してください。

  • が検出結果を公開する S3 バケットのアクセスログを保存するために使用する S3 GuardDuty バケット。詳細については、「Amazon S3 サーバーアクセスログを有効にします (Amazon S3 ドキュメント)」を参照してください。AWS Control Tower ランディングゾーンにデプロイする場合は、ログアーカイブアカウントの S3 バケットをこの目的で再利用できます。

  • Terraform バージョン 0.14.6 以降がインストールされ、設定されている。詳細については、「Get Started – AWS (Terraform ドキュメント)」を参照してください。

  • Python、バージョン 3.9.6 以降がインストールされ、設定されています。詳細については、「ソースリリース (Python ウェブサイト)」を参照してください。

  • AWS SDK for Python (Boto3) がインストールされています。詳細については、Boto3 ドキュメントを参照してください。

  • jq がインストールされ、設定されている。詳細については、「jq のダウンロード (jq ドキュメント)」を参照してください。

制約事項

  • このパターンは macOS と Amazon Linux 2 オペレーティングシステムをサポートします。このパターンは Windows オペレーティングシステムでの使用についてはテストされていません。

    : Amazon Linux 2 のサポートは間もなく終了します。詳細については、「Amazon Linux 2FAQs」を参照してください。

  • GuardDuty は、どのアカウントでも、どのターゲットリージョンでも、まだ有効にすることはできません。

  • このパターンの IaC ソリューションでは、前提条件は適用されません。

  • このパターンは、以下のベストプラクティスに準拠したAWSランディングゾーン向けに設計されています。

    • ランディングゾーンは AWS Control Tower を使用して作成されました。

    • セキュリティとログ記録には個別のAWSアカウントが使用されます。

製品バージョン

  • Terraform バージョン 0.14.6 以降。サンプルコードはバージョン 1.2.8 でテストされています。

  • Python バージョン 3.9.6 以降。

アーキテクチャ

このセクションでは、このソリューションの概要と、サンプルコードによって確立されたアーキテクチャについて説明します。次の図は、単一の AWSリージョン内の組織内のさまざまなアカウントにデプロイされたリソースを示しています。

管理、セキュリティ、ロギング、メンバーアカウントのリソースを示すアーキテクチャ図。
  1. Terraform は、セキュリティアカウントとログ記録アカウントに GuardDutyTerraformOrgRole AWS Identity and Access Management (IAM) ロールを作成します。

  2. Terraform は、ログ記録アカウントのデフォルトAWSリージョンに S3 バケットを作成します。このバケットは、すべてのリージョンおよび組織内のすべてのアカウントからすべての GuardDuty 結果を集約するための発行先として使用されます。また、Terraform はセキュリティアカウントに AWS Key Management Service (AWS KMS) キーを作成します。このキーは、S3 バケット内の検出結果を暗号化し、S3 バケットから S3 Glacier Flexible Retrieval ストレージへの検出結果の自動アーカイブを設定します。

  3. 管理アカウントから、Terraform はセキュリティアカウントを の委任管理者として指定します GuardDuty。つまり、セキュリティアカウントは、管理アカウントを含むすべてのメンバーアカウントの GuardDuty サービスを管理するようになりました。個々のメンバーアカウント GuardDuty は、単独で停止または無効化することはできません。

  4. Terraform は、 GuardDuty 委任された管理者のセキュリティアカウントに GuardDuty ディテクターを作成します。

  5. まだ有効になっていない場合、Terraform は で S3 保護を有効にします GuardDuty。詳細については、「Amazon での Amazon S3 保護 GuardDuty (GuardDuty ドキュメント)」を参照してください。

  6. Terraform は、組織内の現在アクティブなメンバーアカウントをすべて GuardDuty メンバーとして登録します。

  7. Terraform は、すべてのメンバーアカウントから集約された検出結果をログ記録アカウントの S3 バケットに発行するように GuardDuty 委任管理者を設定します。

  8. Terraform は、選択したAWSリージョンごとにステップ 3~7 を繰り返します。

自動化とスケール

提供されるサンプルコードはモジュール化されているため、CI/CD パイプラインに統合してデプロイを自動化できます。

ツール

AWS サービス

  • Amazon DynamoDB は、高速で予測可能でスケーラブルなパフォーマンスを提供するフルマネージドの NoSQL データベースサービスです。

  • Amazon GuardDuty は、ログを分析して処理し、AWS環境内の予期しないアクティビティや不正なアクティビティの可能性を特定する継続的なセキュリティモニタリングサービスです。

  • AWS Identity and Access Management (IAM) は、誰を認証し、誰に使用を認可するかを制御することで、AWSリソースへのアクセスを安全に管理するのに役立ちます。

  • AWS Key Management Service (AWS KMS) は、データを保護するための暗号化キーの作成と制御に役立ちます。

  • AWS Organizations は、作成して一元管理する組織に複数のAWSアカウントを統合するのに役立つアカウント管理サービスです。

  • Amazon Simple Storage Service (Amazon S3) は、どのようなデータ量であっても、データを保存、保護、取得することを支援するクラウドベースのオブジェクトストレージサービスです。

  • AWS SDK for Python (Boto3) は、Python アプリケーション、ライブラリ、またはスクリプトを AWSサービスに統合するのに役立つソフトウェア開発キットです。

その他のツールとサービス

  • HashiCorp Terraform は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングおよび管理するためのコマンドラインインターフェイスアプリケーションです。

  • Python」は汎用プログラミング言語です。

  • jq は、JSONファイルの操作に役立つコマンドラインプロセッサです。

コードリポジトリ

このパターンのコードは GitHub、 の amazon-guardduty-for-aws-organizations-with-terraform リポジトリにあります。

エピック

タスク説明必要なスキル

リポジトリをクローン作成します。

Bash シェルで、次のコマンドを実行します。「追加情報」セクションの「リポジトリのクローン」で、 GitHub リポジトリURLの を含むコマンド全体をコピーできます。これにより、 から amazon-guardduty-for-aws-organizations-with-terraform リポジトリがクローンされます GitHub。

git clone <github-repository-url>
DevOps エンジニア

Terraform 設定ファイルを編集します。

  1. 複製したリポジトリのrootフォルダーに、以下のコマンドを実行して「configuration.json.sample」ファイルを複製します。

    cp configuration.json.sample configuration.json
  2. 新しい「configuration.json」ファイルを編集し、以下の各変数の値を定義します。

    • management_acc_id— 管理アカウントのアカウント ID。

    • delegated_admin_acc_id— セキュリティアカウントのアカウント ID。

    • logging_acc_id— ログアカウントのアカウント ID。

    • target_regions – を有効にするAWSリージョンのカンマ区切りリスト GuardDuty。

    • organization_id – を有効にするAWS組織の組織 ID GuardDuty。

    • default_region— Terraform の状態が管理アカウントに保存されているリージョン。これは、Terraform バックエンドに S3 バケットと DynamoDB テーブルをデプロイしたのと同じリージョンです。

    • role_to_assume_for_role_creation – セキュリティアカウントとログ記録アカウントの新しいIAMロールに割り当てる名前。この新しいロールは次の記事で作成します。Terraform はこのロールを引き受けて、セキュリティアカウントとログ記録アカウントにGuardDutyTerraformOrgRoleIAMロールを作成します。

    • finding_publishing_frequency – が S3 バケットに結果 GuardDuty を発行する頻度。

    • guardduty_findings_bucket_region— 公開された検出結果に対して S3 バケットを作成する優先リージョン。

    • logging_acc_s3_bucket_name— 公開された調査検出結果で使用する S3 バケットの推奨名。

    • security_acc_kms_key_alias – AWS KMS GuardDuty 検出結果の暗号化に使用されるキーのエイリアス。

    • s3_access_log_bucket_name – GuardDuty 検出結果に使用される S3 バケットのアクセスログを収集する既存の S3 バケットの名前。このバケットは、 GuardDuty 検出結果バケットと同じAWSリージョンにある必要があります。

    • tfm_state_backend_s3_bucket— Terraform リモートバックエンドの状態を保存する既存の S3 バケットの名前。

    • tfm_state_backend_dynamodb_table— テラフォームの状態をロックするための既存の DynamoDB テーブルの名前。

  3. 設定ファイルを保存して閉じます。

DevOps engineer、GeneralAWS、Terraform、Python

新しいIAMロールの CloudFormation テンプレートを生成します。

このパターンには、2 つの CloudFormation テンプレートを作成するための IaC ソリューションが含まれています。これらのテンプレートは、Terraform がセットアッププロセス中に使用する 2 つのIAMロールを作成します。これらのテンプレートは、「最小権限」というセキュリティのベストプラクティスに準拠しています。

  1. Bash シェルのリポジトリrootフォルダで、cfn-templates/に移動します。このフォルダには、スタブ付きの CloudFormation テンプレートファイルが含まれています。

  2. 以下のコマンドを実行します。これにより、スタブは「configuration.json」ファイルに指定した値に置き換えられます。

    bash scripts/replace_config_stubs.sh
  3. 次の CloudFormation テンプレートが cfn-templates/フォルダに作成されていることを確認します。

    • management-account-role.yaml – このファイルには、管理アカウントのロール定義と、このパターンを完了するために必要な最小限のアクセス許可を持つIAMロールの関連するアクセス許可が含まれています。

    • role-to-assume-for-role-creation.yaml – このファイルには、セキュリティアカウントとログ記録アカウントのロール定義と、そのIAMロールに関連するアクセス許可が含まれています。Terraform は、これらのアカウントでロールを作成するためにこのGuardDutyTerraformOrgRoleロールを引き受けます。

DevOps エンジニア、一般 AWS

IAM ロールを作成します。

「スタックの作成 (CloudFormation ドキュメント)」の手順に従って、次の手順を実行します。

  1. role-to-assume-for-role-creation.yaml スタックをセキュリティアカウントとログ記録アカウントの両方にデプロイします。

  2. .management-account-roleyaml スタックを管理アカウントにデプロイします。スタックを正常に作成し、CREATE_COMPLETEスタックのステータスが出力で表示されたら、この新しいロールの Amazon リソースネーム (ARN) を書き留めます。

DevOps エンジニア、一般 AWS

管理アカウントでIAMロールを引き受けます。

セキュリティのベストプラクティスとして、先に進む前に新しいmanagement-account-roleIAMロールを引き受けることをお勧めします。AWS コマンドラインインターフェイス (AWS CLI) で、「追加情報」セクションの「管理アカウントIAMロールを引き受ける」に コマンドを入力します。

DevOps エンジニア、一般 AWS

セットアップスクリプトを実行します。

リポジトリrootフォルダで、次のコマンドを実行してセットアップスクリプトを起動します。

bash scripts/full-setup.sh

full-setup.shスクリプトは以下のアクションを実行します。

  • すべての設定値を環境変数としてエクスポートします。

  • 各 Terraform モジュールの「バックエンド.tf」コードファイルと「terraform.tfvars」コードファイルを生成します。

  • を通じて組織 GuardDuty 内の への信頼されたアクセスを有効にしますAWSCLI。

  • 組織の状態を Terraform の状態にインポートします。

  • ログアカウントで検出結果を公開するための S3 バケットを作成します。

  • セキュリティアカウントで検出結果を暗号化するための AWSKMSキーを作成します

  • アーキテクチャセクションで説明されているように、選択したすべてのリージョンで GuardDuty 組織全体で を有効にします。

DevOps エンジニア、Python
タスク説明必要なスキル

クリーンアップのスクリプトを実行します。

このパターンを使用して組織 GuardDuty に対して を有効にし GuardDuty、 を無効にする場合は、リポジトリrootフォルダで次のコマンドを実行して cleanup-gd.sh スクリプトを起動します。

bash scripts/cleanup-gd.sh

このスクリプトは、ターゲット組織 GuardDuty で を無効にし、デプロイされたリソースをすべて削除し、組織を以前の状態に復元してから、Terraform を使用して を有効にします GuardDuty。

注:このスクリプトは、ローカルおよびリモートのバックエンドから Terraform の状態ファイルやロックファイルを削除しません。必要な場合は、これらのアクションを手動で実行する必要があります。また、このスクリプトでは、インポートされた組織やその組織によって管理されているアカウントは削除されません。の信頼されたアクセス GuardDuty は、クリーンアップスクリプトの一部として無効になっていません。

DevOps engineer、GeneralAWS、Terraform、Python

IAM ロールを削除します。

role-to-assume-for-role-creation.yaml テンプレートと .management-account-roleyaml CloudFormation テンプレートで作成されたスタックを削除します。詳細については、「スタックの削除 (CloudFormation ドキュメント)」を参照してください。

DevOps エンジニア、一般 AWS

関連リソース

AWS ドキュメント

AWS マーケティング

その他のリソース

追加情報

リポジトリをクローンします

リポジトリのクローンを作成するには、次のコマンドを実行します GitHub 。

git clone https://github.com/aws-samples/amazon-guardduty-for-aws-organizations-with-terraform

管理アカウントIAMロールを引き受ける

管理アカウントのIAMロールを引き受けるには、次のコマンドを実行します。をIAMロールARNの <IAM role ARN>に置き換えます。

export ROLE_CREDENTIALS=$(aws sts assume-role --role-arn <IAM role ARN> --role-session-name AWSCLI-Session --output json) export AWS_ACCESS_KEY_ID=$(echo $ROLE_CREDENTIALS | jq .Credentials.AccessKeyId | sed 's/"//g') export AWS_SECRET_ACCESS_KEY=$(echo $ROLE_CREDENTIALS | jq .Credentials.SecretAccessKey | sed 's/"//g') export AWS_SESSION_TOKEN=$(echo $ROLE_CREDENTIALS | jq .Credentials.SessionToken | sed 's/"//g')