翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS CloudFormation テンプレートを使用して Amazon GuardDuty を条件付きで有効にする
作成者: Ram Kandaswamy (AWS)
概要
AWS CloudFormation テンプレートを使用して、Amazon Web Services (AWS) アカウントで Amazon GuardDuty を有効にできます。デフォルトでは、CloudFormation を使用して GuardDuty を有効にしようとしたときに GuardDuty が既に有効になっていると、スタックのデプロイは失敗します。ただし、CloudFormation テンプレートの条件を使用して、GuardDuty が既に有効になっているかどうかを確認できます。CloudFormation は、静的値を比較する条件の使用をサポートしていますが、同じテンプレート内の別のリソースプロパティの出力の使用はサポートしていません。詳細については、CloudFormation ドキュメントの「条件」を参照してください。
このパターンでは、 AWS Lambda 関数によってバックアップされた CloudFormation カスタムリソースを使用して、GuardDuty がまだ有効になっていない場合に条件付きで有効にします。GuardDuty が有効になっている場合、スタックはステータスをキャプチャし、スタックの出力セクションに記録します。GuardDuty が有効になっていない場合は、スタックによって有効になります。
前提条件と制限
前提条件
制約事項
GuardDuty が AWS アカウント または に対して手動で無効になっている場合 AWS リージョン、このパターンではそのターゲットアカウントまたはリージョンの GuardDuty は有効になりません。
アーキテクチャ
ターゲットテクノロジースタック
このパターンでは、Infrastructure as Code (IaC) に CloudFormation を使用します。Lambda 関数に支えられた CloudFormation カスタムリソースを使用して、動的なサービス有効化機能を実現します。
ターゲットアーキテクチャ
以下の大まかなアーキテクチャ図は、CloudFormation テンプレートをデプロイして GuardDuty を有効にするプロセスを示しています。
CloudFormation テンプレートをデプロイして CloudFormation スタックを作成します。
スタックは IAM ロールと Lambda 関数を作成します。
Lambda 関数は IAM ロールを引き受けます。
ターゲットで 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 は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
CloudFormation テンプレートを作成します。 |
| AWS DevOps |
CloudFormation スタックを更新する。 |
| AWS DevOps |
で GuardDuty が有効になっていることを確認します AWS アカウント。 |
| クラウド管理者、AWS 管理者 |
追加のアカウントまたはリージョンを設定します。 | ユースケースに応じて、CloudFormation StackSet 機能を使用して、このソリューションを複数の AWS アカウント と に拡張します AWS リージョン。詳細については、CloudFormation ドキュメントのAWS CloudFormation StackSets の使用」を参照してください。 | クラウド管理者、AWS 管理者 |
関連リソース
リファレンス
チュートリアルと動画
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.13
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 コードを Amazon S3 バケットに配置し、CloudFormation テンプレートで参照することで、これらをサポートできます。
以下のコード行に置き換えます。
Code:
ZipFile: |
次のコード行を使用します。
Code:
S3Bucket: <bucket name>
S3Key: <python file name>
S3ObjectVersion: <version>
Amazon S3 バケットでバージョニングを使用していない場合は、 S3ObjectVersion
プロパティを省略できます。詳細については、Amazon S3 ドキュメントの「Amazon S3 バケットでのバージョニングの使用」を参照してください。 Amazon S3