翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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リージョン内の組織内のさまざまなアカウントにデプロイされたリソースを示しています。
![管理、セキュリティ、ロギング、メンバーアカウントのリソースを示すアーキテクチャ図。](images/pattern-img/c9b68627-b68e-47a6-9933-d0f36ea10ae2/images/86193749-eef9-4d63-8a7f-daa0cd03fbfe.png)
Terraform は、セキュリティアカウントとログ記録アカウントに GuardDutyTerraformOrgRole AWS Identity and Access Management (IAM) ロールを作成します。
Terraform は、ログ記録アカウントのデフォルトAWSリージョンに S3 バケットを作成します。このバケットは、すべてのリージョンおよび組織内のすべてのアカウントからすべての GuardDuty 結果を集約するための発行先として使用されます。また、Terraform はセキュリティアカウントに AWS Key Management Service (AWS KMS) キーを作成します。このキーは、S3 バケット内の検出結果を暗号化し、S3 バケットから S3 Glacier Flexible Retrieval ストレージへの検出結果の自動アーカイブを設定します。
管理アカウントから、Terraform はセキュリティアカウントを の委任管理者として指定します GuardDuty。つまり、セキュリティアカウントは、管理アカウントを含むすべてのメンバーアカウントの GuardDuty サービスを管理するようになりました。個々のメンバーアカウント GuardDuty は、単独で停止または無効化することはできません。
Terraform は、 GuardDuty 委任された管理者のセキュリティアカウントに GuardDuty ディテクターを作成します。
まだ有効になっていない場合、Terraform は で S3 保護を有効にします GuardDuty。詳細については、「Amazon での Amazon S3 保護 GuardDuty (GuardDuty ドキュメント)」を参照してください。
Terraform は、組織内の現在アクティブなメンバーアカウントをすべて GuardDuty メンバーとして登録します。
Terraform は、すべてのメンバーアカウントから集約された検出結果をログ記録アカウントの S3 バケットに発行するように GuardDuty 委任管理者を設定します。
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
| DevOps エンジニア |
Terraform 設定ファイルを編集します。 |
| DevOps engineer、GeneralAWS、Terraform、Python |
新しいIAMロールの CloudFormation テンプレートを生成します。 | このパターンには、2 つの CloudFormation テンプレートを作成するための IaC ソリューションが含まれています。これらのテンプレートは、Terraform がセットアッププロセス中に使用する 2 つのIAMロールを作成します。これらのテンプレートは、「最小権限」というセキュリティのベストプラクティスに準拠しています。
| DevOps エンジニア、一般 AWS |
IAM ロールを作成します。 | 「スタックの作成 (CloudFormation ドキュメント)」の手順に従って、次の手順を実行します。
| DevOps エンジニア、一般 AWS |
管理アカウントでIAMロールを引き受けます。 | セキュリティのベストプラクティスとして、先に進む前に新しいmanagement-account-roleIAMロールを引き受けることをお勧めします。AWS コマンドラインインターフェイス (AWS CLI) で、「追加情報」セクションの「管理アカウントIAMロールを引き受ける」に コマンドを入力します。 | DevOps エンジニア、一般 AWS |
セットアップスクリプトを実行します。 | リポジトリ
full-setup.shスクリプトは以下のアクションを実行します。
| DevOps エンジニア、Python |
タスク | 説明 | 必要なスキル |
---|---|---|
クリーンアップのスクリプトを実行します。 | このパターンを使用して組織 GuardDuty に対して を有効にし GuardDuty、 を無効にする場合は、リポジトリ
このスクリプトは、ターゲット組織 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 ドキュメント
複数のアカウントの管理 (GuardDuty ドキュメント)
最小特権の付与 ( ドキュメント)IAM
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')