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

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

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

作成者: Ram Kandaswamy (AWS)

環境: 実稼働

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

AWS サービス: AWS CloudFormation、Amazon GuardDuty、AWS Lambda 、AWS Identity and Access Management

[概要]

AWS CloudFormation テンプレートを使用して、Amazon Web Services (AWS) アカウント GuardDuty で Amazon を有効にできます。デフォルトでは、 を使用してオン CloudFormation にしようとしたときに GuardDuty がすでに有効になっている場合、スタックのデプロイは失敗します。ただし、 CloudFormation テンプレートの条件を使用して、 がすでに有効になっているかどうかを確認できます。 GuardDuty は静的な値を比較する条件の使用 CloudFormation をサポートしています。同じテンプレート内の別のリソースプロパティの出力の使用はサポートされていません。詳細については、 ユーザーガイドの「条件 CloudFormation 」を参照してください。

このパターンでは、AWS Lambda 関数によってバックアップされた CloudFormation カスタムリソースを使用して、まだ有効になっていない GuardDuty 場合は条件付きで を有効にします。 GuardDuty が有効になっている場合、スタックはステータスをキャプチャし、スタックの出力セクションに記録します。 GuardDuty が有効になっていない場合、スタックによって有効になります。

前提条件と制限

前提条件

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

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

制約事項

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

アーキテクチャ

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

このパターンでは、Infrastructure as Code (IaC) CloudFormation に を使用します。 IaC Lambda 関数によってバックアップされた CloudFormation カスタムリソースを使用して、動的なサービス有効化機能を実現します。

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

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

  1. テンプレートをデプロイ CloudFormation して CloudFormation スタックを作成します。

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

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

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

CloudFormation テンプレートをデプロイ GuardDuty して を有効にするプロセス

自動化とスケール

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

ツール

  • AWS コマンドラインインターフェイス (AWS CLI)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。

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

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

  • AWS Identity and Access Management (IAM)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。

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

エピック

タスク説明必要なスキル

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

  1. 追加情報 「追加情報」セクションのCloudFormation テンプレートにコードをコピーします。

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

  3. ファイルをワークステーション上の 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 マネジメントコンソールにサインインし、https://console.aws.amazon.com/guardduty/ で GuardDuty コンソールを開きます。

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

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

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

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

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

関連リソース

リファレンス

チュートリアルと動画

追加情報

CloudFormation テンプレート

AWSTemplateFormatVersion: 2010-09-09 Resources: rLambdaLogGroup: Type: 'AWS::Logs::LogGroup' DeletionPolicy: Delete Properties: RetentionInDays: 7 LogGroupName: /aws/lambda/resource-checker rLambdaCheckerLambdaRole: Type: 'AWS::IAM::Role' Properties: RoleName: !Sub 'resource-checker-lambda-role-${AWS::Region}' AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: 'sts:AssumeRole' Path: / Policies: - PolicyName: !Sub 'resource-checker-lambda-policy-${AWS::Region}' PolicyDocument: Version: 2012-10-17 Statement: - Sid: CreateLogGroup Effect: Allow Action: - 'logs:CreateLogGroup' - 'logs:CreateLogStream' - 'logs:PutLogEvents' - 'iam:CreateServiceLinkedRole' - 'cloudformation:CreateStack' - 'cloudformation:DeleteStack' - 'cloudformation:Desc*' - 'guardduty:CreateDetector' - 'guardduty:ListDetectors' - 'guardduty:DeleteDetector' Resource: '*' resourceCheckerLambda: Type: 'AWS::Lambda::Function' Properties: Description: Checks for resource type enabled and possibly name to exist FunctionName: resource-checker Handler: index.lambda_handler Role: !GetAtt - rLambdaCheckerLambdaRole - Arn Runtime: python3.8 MemorySize: 128 Timeout: 180 Code: ZipFile: | 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": "A sample 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, {}) CheckResourceExist: Type: 'Custom::LambdaCustomResource' Properties: ServiceToken: !GetAtt - resourceCheckerLambda - Arn Outputs: status: Value: !GetAtt - CheckResourceExist - status

Lambda リソースの代替コードオプション

提供されている CloudFormation テンプレートでは、参照とガイダンスを容易にするために、インラインコードを使用して Lambda リソースを参照します。または、Lambda コードを Amazon Simple Storage Service (Amazon S3) バケットに配置し、 CloudFormation テンプレートで参照することもできます。インラインコードはパッケージの依存関係やライブラリをサポートしていません。これらをサポートするには、Lambda コードを S3 バケットに配置し、 CloudFormation テンプレートで参照します。

以下のコード行に置き換えます。

Code: ZipFile: |

次のコード行を使用します。

Code: S3Bucket: <bucket name> S3Key: <python file name> S3ObjectVersion: <version>

S3 バケットでバージョニングを使用していない場合は、S3ObjectVersion プロパティを省略できます。詳細については、Amazon S3 ユーザーガイドの「S3 バケットでのバージョニングの使用」を参照してください。