こんにちは、広野です。
Amazon GuardDuty の設定は機能ごとに有効/無効にできるのですが、それを AWS CloudFormation で設定しようと試みたときにハマりました。
もし同じエラーが出た方には役立つかもしれません。そもそも AWS CloudFormation で Amazon GuardDuty の設定をする人ってあまりいないかもですが・・・。
ハマったこと
始まりは、AWS CloudFormation IaC ジェネレーターを使用したこと
IaC ジェネレーターは、既存のデプロイ済みリソースをスキャンして、CloudFormation テンプレートにしたいリソースを選択すると、そのテンプレートを出力してくれるというスゴイやつです。
今回、Amazon GuardDuty を AWS マネジメントコンソールからボタンぽちっとな、で有効にしたものを IaC ジェネレーターでテンプレート化して、他のアカウントにデプロイしようとしました。
IaC ジェネレーターが出力したテンプレートはこちら。↓ ここに、ハマり要素が潜んでいました。注意!動きません。
---
Metadata:
TemplateId: "arn:aws:cloudformation:ap-northeast-2:xxxxxxxxxxxxx:generatedTemplate/a4c6ba10-b002-47b3-bee2-587defc7921a"
Resources:
GuardDutyDetector0082c84d2d1e796541ecd974b782ea181600qtDWT:
UpdateReplacePolicy: "Delete"
Type: "AWS::GuardDuty::Detector"
DeletionPolicy: "Delete"
Properties:
FindingPublishingFrequency: "SIX_HOURS"
Enable: true
DataSources:
MalwareProtection:
ScanEc2InstanceWithFindings:
EbsVolumes: true
S3Logs:
Enable: true
Kubernetes:
AuditLogs:
Enable: true
Features:
- Status: "ENABLED"
Name: "CLOUD_TRAIL"
- Status: "ENABLED"
Name: "DNS_LOGS"
- Status: "ENABLED"
Name: "FLOW_LOGS"
- Status: "ENABLED"
Name: "S3_DATA_EVENTS"
- Status: "ENABLED"
Name: "EKS_AUDIT_LOGS"
- Status: "ENABLED"
Name: "EBS_MALWARE_PROTECTION"
- Status: "ENABLED"
Name: "RDS_LOGIN_EVENTS"
- Status: "DISABLED"
AdditionalConfiguration:
- Status: "DISABLED"
Name: "EKS_ADDON_MANAGEMENT"
Name: "EKS_RUNTIME_MONITORING"
- Status: "ENABLED"
Name: "LAMBDA_NETWORK_LOGS"
- Status: "DISABLED"
AdditionalConfiguration:
- Status: "DISABLED"
Name: "EKS_ADDON_MANAGEMENT"
- Status: "DISABLED"
Name: "ECS_FARGATE_AGENT_MANAGEMENT"
- Status: "DISABLED"
Name: "EC2_AGENT_MANAGEMENT"
Name: "RUNTIME_MONITORING"
Tags: []
IaC ジェネレーターの出力を参考にして作成したテンプレート ※注意!動きません
Amazon GuardDuty は機能ごとに有効/無効を設定できるものがあるので、私が必要な機能だけ有効にするように設定したつもりでした。
AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template that enables GuardDuty per region.
Parameters:
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
TagValue:
Type: String
Description: Tag value for Cost key.
Default: GuardDuty
MaxLength: 30
MinLength: 1
Resources:
# ------------------------------------------------------------#
# GuardDuty
# ------------------------------------------------------------#
GuardDutyDetector:
Type: AWS::GuardDuty::Detector
Properties:
FindingPublishingFrequency: SIX_HOURS
Enable: true
DataSources:
MalwareProtection:
ScanEc2InstanceWithFindings:
EbsVolumes: true
S3Logs:
Enable: true
Kubernetes:
AuditLogs:
Enable: false
Features:
- Status: ENABLED
Name: CLOUD_TRAIL
- Status: ENABLED
Name: DNS_LOGS
- Status: ENABLED
Name: FLOW_LOGS
- Status: ENABLED
Name: S3_DATA_EVENTS
- Status: DISABLED
Name: EKS_AUDIT_LOGS
- Status: ENABLED
Name: EBS_MALWARE_PROTECTION
- Status: DISABLED
Name: RDS_LOGIN_EVENTS
- Status: DISABLED
AdditionalConfiguration:
- Status: DISABLED
Name: EKS_ADDON_MANAGEMENT
Name: EKS_RUNTIME_MONITORING
- Status: ENABLED
Name: LAMBDA_NETWORK_LOGS
- Status: DISABLED
AdditionalConfiguration:
- Status: DISABLED
Name: EKS_ADDON_MANAGEMENT
- Status: DISABLED
Name: ECS_FARGATE_AGENT_MANAGEMENT
- Status: DISABLED
Name: EC2_AGENT_MANAGEMENT
Name: RUNTIME_MONITORING
Tags:
- Key: Cost
Value: !Ref TagValue
ハマり その1 DataSources と Features の設定を両方入れるとエラーになる
IaC ジェネレーターが出力したテンプレートを全面的に信じてテンプレートを作成したわけですが、実際にテンプレートを流すと以下のエラーメッセージでスタック作成が失敗しました。
まず最初に気付いたのは以下のドキュメントでした。
どうも、GuardDuty の機能ごとに有効/無効を設定するには DataSources ではなく Features の設定を使用することを推奨していました。そして、両方記述するとエラーになるようです。
ハマリ その2 EKS_RUNTIME_MONITORING と RUNTIME_MONITORING の設定も
その1 の修正をしただけでは状況が変わりませんでした。エラーメッセージも その1 と同じです。テンプレートのどこに問題があるかわからず、AWS CloudTrail の API ログを確認したところ、以下のメッセージを発見しました。
EKS_RUNTIME_MONITORING と RUNTIME_MONITORING の設定を両方記述するとエラーになるようです。
これについては、以下のドキュメントの冒頭に書いてありました。後から気付きました。
ハマり その3 指定した機能の名前が正しくない
その2 の修正をしても状況は変わりませんでした。エラーメッセージも その1 と同じです。テンプレートのどこに問題があるかわからず、AWS CloudTrail の API ログを確認したところ、以下のメッセージを発見しました。
テンプレートの中に記述している、これら 3つの機能の名前が正しくないと言っています。
後から気が付いたのですが、設定変更可能な機能としてこれらは含まれていませんでした。その2 で紹介した公式ドキュメントにしっかり書いてありました。
完成した AWS CloudFormation テンプレート ※動きます
AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template that enables GuardDuty per region.
Parameters:
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
TagValue:
Type: String
Description: Tag value for Cost key.
Default: GuardDuty
MaxLength: 30
MinLength: 1
Resources:
# ------------------------------------------------------------#
# GuardDuty
# ------------------------------------------------------------#
GuardDutyDetector:
Type: AWS::GuardDuty::Detector
Properties:
FindingPublishingFrequency: SIX_HOURS
Enable: true
Features:
- Status: ENABLED
Name: S3_DATA_EVENTS
- Status: DISABLED
Name: EKS_AUDIT_LOGS
- Status: ENABLED
Name: EBS_MALWARE_PROTECTION
- Status: DISABLED
Name: RDS_LOGIN_EVENTS
- Status: ENABLED
Name: LAMBDA_NETWORK_LOGS
- Status: DISABLED
AdditionalConfiguration:
- Status: DISABLED
Name: EKS_ADDON_MANAGEMENT
- Status: DISABLED
Name: ECS_FARGATE_AGENT_MANAGEMENT
- Status: DISABLED
Name: EC2_AGENT_MANAGEMENT
Name: RUNTIME_MONITORING
Tags:
- Key: Cost
Value: !Ref TagValue
AWS CloudTrail のログが有用だった
AWS CloudFormation テンプレートのスタック作成時エラーはメッセージから原因がわかることが多いのですが、GuardDuty に関しては
このメッセージ一辺倒だったので困りました。以下のドキュメントにあるように、AWS CloudTrail のイベント履歴から AWS CloudFormation のエラーメッセージを探すことで、原因を突き止められました。
まとめ
いかがでしたでしょうか?
AWS CloudFormation テンプレートを IaC ジェネレーターで作成し始めたことからハマってしまいましたが、これに懲りずに他のリソースのテンプレート作成も引き続き試してみたいと思います。きちんと検証することの重要さや、AWS CloudTrail の有用性にも改めて気づかされました。
本記事が皆様のお役に立てれば幸いです。