AWS CloudFormation テンプレートを使用して Amazon GuardDuty を条件付きで有効にする - AWS 規範ガイダンス

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

AWS CloudFormation テンプレートを使用して Amazon GuardDuty を条件付きで有効にする

Amazon Web Services、Ram Kandaswamy

概要

AWS CloudFormationは、Infrastructure as Code (IaC) ツールであり、テンプレートベースのデプロイを通じて AWS リソースを管理するのに役立ちます。CloudFormation は通常、 AWS リソースの管理に使用されます。Amazon GuardDuty AWS のサービスなどの を有効にするために使用すると、固有の課題が発生する可能性があります。GuardDuty は、悪意のあるアクティビティや不正な動作 AWS アカウント について を継続的にモニタリングする脅威検出サービスです。複数回作成できる一般的なリソースとは異なり、GuardDuty はアカウントおよび ごとに 1 回有効にする必要があるサービスです AWS リージョン。従来の CloudFormation 条件は静的な値の比較のみをサポートしているため、GuardDuty などのサービスの現在の状態を確認することは困難です。既にアクティブなアカウントで CloudFormation を介して GuardDuty を有効にしようとすると、スタックのデプロイは失敗します。これにより、マルチアカウント環境を管理している DevOps チームに運用上の課題が生じる可能性があります。

このパターンは、この課題に対するソリューションを導入します。AWS Lambda 関数によってバックアップされた CloudFormation カスタムリソースを使用して、動的状態チェックを実行します。条件付きロジックは、GuardDuty がまだ有効になっていない場合にのみ有効にします。スタック出力を使用して、将来の参照用に GuardDuty ステータスを記録します。

このパターンに従うことで、クリーンで予測可能な CloudFormation スタックオペレーションを維持しながら、 AWS インフラストラクチャ全体の GuardDuty デプロイを自動化できます。このアプローチは、次のような組織にとって特に重要です。

  • IaC AWS アカウント による複数の の管理

  • セキュリティサービスを大規模に実装する

  • べき等インフラストラクチャのデプロイを要求する

  • セキュリティサービスのデプロイの自動化

前提条件と制限

前提条件

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

  • CloudFormation スタックを作成、更新、削除するアクセス許可を持つ AWS Identity and Access Management (IAM) ロール

  • AWS Command Line Interface (AWS CLI)、インストールおよび設定済み

制限事項

AWS アカウント または で GuardDuty を手動で無効にした場合 AWS リージョン、このパターンではそのターゲットアカウントまたはリージョンの GuardDuty は有効になりません。

アーキテクチャ

ターゲットテクノロジースタック

このパターンでは、Infrastructure as Code (IaC) に CloudFormation を使用しています。Lambda 関数に支えられた CloudFormation カスタムリソースを使用して、動的なサービス有効化機能を実現します。

ターゲットアーキテクチャ

以下の大まかなアーキテクチャ図は、CloudFormation テンプレートをデプロイして GuardDuty を有効にするプロセスを示しています。

CloudFormation スタックを使用して AWS アカウントで GuardDuty を有効にします。
  1. CloudFormation テンプレートをデプロイして CloudFormation スタックを作成します。

  2. スタックは IAM ロールと Lambda 関数を作成します。

  3. Lambda 関数は IAM ロールを引き受けます。

  4. ターゲットで GuardDuty がまだ有効になっていない場合 AWS アカウント、Lambda 関数はそれを有効にします。

自動化とスケール

AWS CloudFormation StackSet 機能を使用して、このソリューションを複数の AWS アカウント と に拡張できます AWS リージョン。詳細については、CloudFormation ドキュメントのAWS CloudFormation StackSets の使用」を参照してください。

ツール

  • AWS Command Line Interface (AWS CLI) は、コマンドラインシェルのコマンド AWS のサービス を通じて を操作するのに役立つオープンソースツールです。

  • AWS CloudFormation は、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および リージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。

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

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

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

エピック

タスク説明必要なスキル

コードを Amazon S3 に保存します。

  1. このパターンの追加情報セクションで Python コードをコピーします。

  2. テキストエディタでコードを貼り付けます。

  3. index.py という名前でファイルを保存します。

  4. Amazon Simple Storage Service (Amazon S3) バケットに、 ファイルをアップロードします。手順については、Amazon S3 ドキュメントの「オブジェクトのアップロード」を参照してください。

AWS DevOps

CloudFormation テンプレートを作成します。

  1. クラウドフォーメーション コンソールを開きます。

  2. 左側のナビゲーションペインで、Infrastructure Composer を選択します。

  3. 空のキャンバスが表示されない場合は、新しいプロジェクトを作成します。

  4. AWS Lambda 関数をキャンバスにドラッグアンドドロップします。

  5. テンプレートビューで、Lambda 関数とロググループが存在することを確認します。

  6. Lambda 関数Runtimeの を最新バージョンの Python に変更します。

  7. Handler プロパティの値が であることを確認します。 index.lambda_handler.

  8. Python コードをアップロードした Amazon S3 の場所になるように CodeUriプロパティを設定します。値の例は s3://amzn-s3-demo-bucket/key-name です。

  9. リソースのPoliciesプロパティを追加します。セキュリティのベストプラクティスに従って、CloudFormation および GuardDuty アクションを許可する最小特権のアクセス許可を提供します。たとえば、ログには AWSLambdaExecute管理ポリシーを使用し、GuardDuty iam:CreateServiceLinkedRoleにはカスタム を使用できます。

  10. テンプレートビューに移動して、カスタムリソース定義をスニペットに追加します。

    CheckResourceExist: Type: 'Custom::LambdaCustomResource' Properties: ServiceToken: !GetAtt Function.Arn
  11. テンプレートを として保存しますsample.yaml

AWS DevOps

CloudFormation スタックを更新する。

  1. で AWS CLI、次のコマンドを入力します。これにより、sample.yaml ファイルを使用して新しい CloudFormation スタックが作成されます。詳細については、「スタックを作成する」(CloudFormation ドキュメント) を参照してください。

    aws cloudformation create-stack \ --stack-name guardduty-cf-stack \ --template-body file://sample.yaml
  2. スタックが正常に作成された AWS CLIことを示す次の値が に表示されることを確認します。スタックの作成に必要な時間はさまざまです。

    "StackStatus": "CREATE_COMPLETE",
AWS DevOps

AWS アカウントで GuardDuty が有効になっていることを確認します。

  1. にサインイン AWS マネジメントコンソール し、GuardDuty コンソールを開きます。

  2. GuardDuty サービスが有効になっていることを確認します。

クラウド管理者、AWS 管理者

追加のアカウントまたはリージョンを設定する。

ユースケースに応じて、CloudFormation StackSet 機能を使用して、このソリューションを複数の AWS アカウント と に拡張します AWS リージョン。詳細については、CloudFormation ドキュメントのAWS CloudFormation StackSets の使用」を参照してください。

クラウド管理者、AWS 管理者

関連リソース

リファレンス

チュートリアルと動画

追加情報

Python コード

import boto3 import os import json from botocore.exceptions import ClientError import cfnresponse guardduty=boto3.client('guardduty') cfn=boto3.client('cloudformation') def lambda_handler(event, context): print('Event: ', event) if 'RequestType' in event: if event['RequestType'] in ["Create","Update"]: enabled=False try: response=guardduty.list_detectors() if "DetectorIds" in response and len(response["DetectorIds"])>0: enabled="AlreadyEnabled" elif "DetectorIds" in response and len(response["DetectorIds"])==0: cfn_response=cfn.create_stack( StackName='guardduty-cfn-stack', TemplateBody='{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Guard duty creation template", "Resources": { "IRWorkshopGuardDutyDetector": { "Type": "AWS::GuardDuty::Detector", "Properties": { "Enable": true } } } }' ) enabled="True" except Exception as e: print("Exception: ",e) responseData = {} responseData['status'] = enabled cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID" ) elif event['RequestType'] == "Delete": cfn_response=cfn.delete_stack( StackName='guardduty-cfn-stack') cfnresponse.send(event, context, cfnresponse.SUCCESS, {})