こんにちは。
AWS環境の脅威を検出してくれるサービス「GuardDuty」を一括で全リージョンに設定する手順を説明します。
- AWSを利用する全ての人
- GuardDutyの有効化を全リージョンに一括設定したい人
- 攻撃によりAWSからの請求が跳ね上がってしまった人
- 事前にリスクを検知する仕組みを用意しておきたい人
はじめに
GuardDutyとは何?という方は以下の記事でまとめているのでこちらから見ていってください。
GuardDutyはAWS環境を利用する方すべてにおいて設定必須なサービスです。設定方法もボタン一つで簡単に行うことができます。
ただし、ここで1点注意事項があります。
マネージメントコンソール画面からは単一リージョンしか設定できず、各リージョンで有効化ボタンを押して回らなければなりません!!
攻撃者は普段利用しないリージョンをターゲットにハイスペックなインスタンスを構築しコインマイニングを行います。
普段よく使う「東京リージョン」のみ設定して安心していると、翌月の請求がウン十万・ウン百万となってしまう可能性があるのです。
しっかりと自分の資産を守るためにも全てのリージョンに対し、GuardDutyを有効にしておきましょう!
設定方法
GuardDutyが脅威を検知するとCloud Watch EventsとSNSを介して通知が上がるような構成になるよう設定します。
構成
構成図は以下の通り。
今回作成する構成については以下の通り。
- GuardDutyの有効化
- SNSの通知先メールアドレスの登録(別途承認は必要)
- CloudWatch Ruleを作成
→これでGuardDutyが脅威を検知するSNSでメール通知される
CloudFormationテンプレート
使用するCloudFormationテンプレートはこちらです。
AWSTemplateFormatVersion: 2010-09-09
Description:
"enable guardduty and set alert"
Parameters:
MailAddress:
Description: Enter email address to send notification.
Type: String
Resources:
GDD:
Type: "AWS::GuardDuty::Detector"
Properties:
Enable: true
SNST:
Type: "AWS::SNS::Topic"
Properties:
TopicName: GuardDutyTopic
SNSS:
Type: "AWS::SNS::Subscription"
Properties:
Endpoint: !Ref MailAddress
Protocol: email
TopicArn: !Ref SNST
SNSTP:
Type: "AWS::SNS::TopicPolicy"
Properties:
PolicyDocument:
Id: default_policy_ID
Version: "2012-10-17"
Statement:
- Sid: default_statement_ID
Effect: Allow
Principal:
AWS: "*"
Action:
- "SNS:GetTopicAttributes"
- "SNS:SetTopicAttributes"
- "SNS:AddPermission"
- "SNS:RemovePermission"
- "SNS:DeleteTopic"
- "SNS:Subscribe"
- "SNS:ListSubscriptionsByTopic"
- "SNS:Publish"
- "SNS:Receive"
Resource: !Ref SNST
Condition:
StringEquals:
"AWS:SourceOwner": !Ref "AWS::AccountId"
- Sid: AWSEvents_AlertGuardDutyFindings_Id123
Effect: Allow
Principal:
Service:
- "events.amazonaws.com"
Action: "sns:Publish"
Resource: !Ref SNST
Topics:
- !Ref SNST
ER:
Type: "AWS::Events::Rule"
Properties:
Name: AlertGuardDutyFindings
Description: "Alert to SNS topic when find threats by GuardDuty"
EventPattern: {
"source": [
"aws.guardduty"
],
"detail-type": [
"GuardDuty Finding"
]
}
Targets:
- Arn: !Ref SNST
Id: Id123
StackSetsでGuardDuty一括設定
StackSetsは、本来は単一リージョンに対してしか利用できないスタックをリージョン・アカウントをまたがって一括設定を行う機能となります。
今回はこのStackSetsを利用して、全リージョンに対してGuardDutyを設定していきます。
CloudFormation の StackSets を選択し、「StackSetsの作成」をクリックします。
「テンプレートの指定」で上記テンプレートを指定し、「次へ」をクリックします。
「StackSet の詳細を指定」で「StackSet名」と「パラメータ」を入力します。
StackSet名 | スタックセットの名前 GuardDutyの一括設定と分かるような名前で設定 |
パラメータ | 通知先のメールアドレス SNSの送信先アドレスとなる |
「アカウント」では「スタックをアカウントにデプロイ」を選択し、「アカウント番号」に対象のアカウントIDを指定します。
「リージョンの指定」では「すべてのリージョンを追加」をクリックします。
「すべてのリージョンを追加」をクリックすると以下のようになります。
ここで既に設定済みのリージョンがある場合は「削除」から外しておいてください。
「リージョンの指定」ができたら「次へ」をクリックします。
確認画面にて設定値を確認後、「送信」をクリックします。
作成後は詳細画面が表示され、しばらくすると全てのリージョンに対してGuardDutyの設定が行われます。
SNSで通知先メールアドレスを登録するので、通知先メールアドレス宛に承認確認のメールが設定したリージョン分送信されます。
こちらも忘れずに承認しておいてください。
以上で設定は完了です。
これで万が一知らぬ間にコインマイニング用のインスタンスを建てられても即時対応できると思います。
まとめ
GuardDutyは全リージョンで有効化しておくことをおすすめします。
何か発生してからでは遅いので資産を守るためにしっかりと対応をしていきましょう!