翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 して を有効にするプロセスを示しています。
テンプレートをデプロイ CloudFormation して CloudFormation スタックを作成します。
スタックは IAM ロールと Lambda 関数を作成します。
Lambda 関数は IAM ロールを引き受けます。
ターゲット AWS アカウントで がまだ有効 GuardDuty になっていない場合、Lambda 関数によって有効になります。
![CloudFormation テンプレートをデプロイ GuardDuty して を有効にするプロセス](images/pattern-img/3abd7cb7-0937-41fe-8eaa-79aedb182732/images/b2d81a61-31f7-4cb9-9de3-f7db1b92ccd9.png)
自動化とスケール
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 テンプレートを作成します。 |
| AWS DevOps |
CloudFormation スタックを作成します。 |
| AWS DevOps |
AWS アカウントで GuardDuty が有効になっていることを確認します。 |
| クラウド管理者、AWS 管理者 |
追加のアカウントまたは AWS リージョンを設定する。 | ユースケースに応じて、AWS CloudFormation StackSet 機能を使用して、このソリューションを複数の AWS アカウントと AWS リージョンに拡張します。詳細については、 ユーザーガイドの「AWS CloudFormation StackSetsの使用 CloudFormation 」を参照してください。 | クラウド管理者、AWS 管理者 |
関連リソース
リファレンス
チュートリアルと動画
AWS を使用したインフラストラクチャ管理の簡素化 CloudFormation
(チュートリアル) Amazon GuardDuty と AWS Security Hub を使用して複数のアカウントを保護する
(AWS re:Invent 2020) AWS を作成するためのベストプラクティス CloudFormation
(AWS re:Invent 2019) AWS での脅威検出: Amazon 入門 GuardDuty
(AWS re:Inforce 2019)
追加情報
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 バケットでのバージョニングの使用」を参照してください。