こんにちは、広野です。
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 の有用性にも改めて気づかされました。
本記事が皆様のお役に立てれば幸いです。