Amazon GuardDuty をセットアップし、AWS Chatbot による Slack 通知を設定する
はじめに
Amazon GuardDuty(GuardDuty) のセットアップ方法についてまとめる。 また、GuardDuty が脅威を検知した場合、速やかにその検知内容を確認して対処の要否を判断できることが重要である。 そのための手段として、検知結果を Slack に通知する方法についてもまとめる。
GuardDuty とは
AWS が提供する機械学習を用いたクラウドネイティブな脅威検知のマネージドサービス。 下記のログをデータソースとして脅威の検出を行い、検出結果を重要度(HIGH、MEDIUM、 LOW)で提示してくれる。
- CloudTrail イベントログ
- CloudTrail 管理イベント
- CloudTrail S3 データイベント
- Kubernetes 監査ログ
- VPC Flow Logs
- Route 53 の DNS ログ
ポートスキャンなどの悪意のあるスキャン、EC2 インスタンスへの DoS 攻撃、不正な API の呼び出しや予期しないリソースへのアクセスなども脅威として検出できる。 GuardDuty で検出できる脅威は「結果タイプ」を参照のこと。
また、EventBridge とも統合されており、GuardDuty が脅威を検知したことをトリガーにして E メールやチャットツールに通知の送付もできる。
ここからの作業の前提
- AWS マネジメントコンソールから手動で作業を進める。
- AdministratorAccess 権限を持つ IAM ユーザにて作業を行う。この作業では GuardDuty、Amazon EventBridge(EventBridge)、Amazon SNS(SNS)、AWS Chatbot(Chatbot)、IAM の操作を行うため、必要な権限を持つ IAM ユーザで作業を行う必要がある。
- 東京リージョンで作業を行う。
GuardDuty をセットアップする
AWS マネジメントコンソールでの作業の場合、GuardDuty は有効化のボタンを押下するだけでセットアップが可能である。
AWS マネジメントコンソールにログインし、GuardDuty のコンソール画面に移動する。 「今すぐ始める」を押下する。
表示されているメッセージを確認して、「GuardDuty の有効化」を押下する。
なお、ここで GuardDuty を有効化すると、GuardDuty に対して下記のアクセス権限と信頼ポリシーが付与される。 この内容は「サービスロールのアクセス権限の表示」を押下すると確認できる。
付与されるアクセス権限は下記の通り。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeImages", "ec2:DescribeVpcEndpoints", "ec2:DescribeSubnets", "ec2:DescribeVpcPeeringConnections", "ec2:DescribeTransitGatewayAttachments", "organizations:ListAccounts", "organizations:DescribeAccount", "s3:GetBucketPublicAccessBlock", "s3:GetEncryptionConfiguration", "s3:GetBucketTagging", "s3:GetAccountPublicAccessBlock", "s3:ListAllMyBuckets", "s3:GetBucketAcl", "s3:GetBucketPolicy", "s3:GetBucketPolicyStatus" ], "Resource": "*" } ] }
信頼ポリシーは下記の通り。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "guardduty.amazonaws.com" }, "Action": [ "sts:AssumeRole" ] } ] }
有効化に成功すると、下記のような「結果」の画面に遷移する。
なお、GuardDuty はリージョンサービスであり、有効化の作業を行なったリージョンでのみで有効化される。 セキュリティ向上のためには全リージョンでの有効化が望ましい。 リージョン数も多いので、CloudFormation の StackSets などを利用して有効化すると良い(参考:「一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った」)。
AWS Chatbot による Slack 通知を設定する
ここでは AWS Chatbot(Chatbot)を使い、Slack の通知を設定する。 大きく下記の作業を実施する。
- SNS のトピック作成
- EventBridge のルール作成
- Chatbot の設定
SNS のトピック作成
SNS のコンソール画面を開く。 画面の右上の「トピックの作成」で、「トピック名」(今回は「guardduty-notification」)を設定し、「次のステップ」を押下する。
「トピックの作成」の「詳細」で下記を確認する。 その他はデフォルトのままとして、「トピックの作成」を押下する。
- タイプ:スタンダード
- 名前:前の画面で設定した「トピック名」
トピックの作成に成功した場合、下記のような画面が表示される。
EventBridge のルール作成
EventBridge のコンソール画面を開く。 画面の右上の「新しいルールを作成」で、「ルールを作成」を押下する。
「ルールの詳細を定義」の画面で、下記のように設定して、「次へ」を押下する。
分類 | 設定項目 | 説明 | 設定値 |
---|---|---|---|
ルールの詳細 | 名前 | ルールの名前を設定する。 | 任意(今回は「guardduty-rule」) |
説明 | ルールの説明を記載する。 | 設定しない | |
イベントバス | イベントの発行元のリソースの種類を設定する。AWS サービス(GuardDuty)なので「default」を選択する。 | default | |
選択したイベントバスでルールを有効にする | イベントバスの有効/無効を設定する。 | 有効化 | |
ルールタイプ | ルールがイベントもしくは時間駆動のどちらなのかを設定する。 | イベントパターンを持つルール |
「イベントパターンを構築」の画面で、下記のように設定して、「次へ」を押下する。
分類 | 設定項目 | 説明 | 設定値 |
---|---|---|---|
イベントソース | イベントソース | イベントの送信元となるイベントソースを選択する。 | AWS のサービス |
イベントパターン | イベントソース | イベントソースとなる AWS サービス名を選択する。 | GuardDuty |
イベントタイプ | イベントのタイプを選択する。 | GuardDuty Finding |
上記の設定をすると、「イベントパターン」に下記が示される。 カスタマイズも可能だが、今回はこれで問題ないため、「次へ」を選択する。
{ "source": ["aws.guardduty"], "detail-type": ["GuardDuty Finding"] }
「ターゲットを選択」の画面で、下記のように設定して、「次へ」を押下する。
分類 | 設定項目 | 説明 | 設定値 |
---|---|---|---|
ターゲット1 | ターゲットタイプ | イベントの送信先となるターゲットのタイプを選択する。 | AWS のサービス |
ターゲットを選択 | イベントがイベントパターンに一致した場合に呼び出すターゲットを選択する。 | SNS トピック | |
トピック | メッセージを発行する SNS トピックを選択する。 | 今回は「guardduty-notification」 |
「タグを設定」の画面では、必要に応じてタグを設定する。 今回は設定せずに「次へ」を選択する。
「レビューと作成」の画面で、設定に問題がないことを確認し、「ルールを作成」を選択する。
ルールの作成に成功した場合、下記のような画面が表示される。
Chatbot の設定
チャットクライアントの設定
Chatbot のコンソール画面を開く。 画面の右上の「チャットクライアントを設定」で、「チャットクライアント」に「Slack」を設定し、「クライアントを設定」を選択する。
Slack の認証ページにリダイレクトされるので、通知先となる Slack のワークスペースにサインインする。 処理を進めると、下記のような Chatbot と Slack の連携を設定する画面が表示される。 内容を確認して、「許可する」を選択する。
Chatbot と Slack の連携に成功すると、下記のような画面が表示される。 「新しいチャネルを設定」を選択する(矢印のどちらでも可)。
チャネルの設定
「Slack チャネルを選択」の画面で、下記のように設定して、「次へ」を押下する。
分類 | 設定項目 | 説明 | 設定値 |
---|---|---|---|
設定の詳細 | 設定名 | 設定の名前を設定する。 | 任意(今回は「guardduty-notification」) |
ログ記録 | CloudWatch Logs へのログの記録の有無を設定する。 | 設定しない | |
Slack チャネル | チャネルタイプ | 通知先となる Slack チャネルの公開レベルを選択する。 | パブリック |
パブリックチャネル名 | 通知先となる Slack チャネル名を選択する。 | notification | |
アクセス許可 | ロール設定 | チャネルのメンバーに付与するアクセス許可を設定する。 | チャネル IAM ロール |
チャネル IAM ロール | チャネルに設定する IAM ロールを選択する。 | テンプレートを使用して IAM ロールを作成する | |
ロール名 | IAM ロールの名称を設定する。 | 任意(今回は「AWSChatbot-role」) | |
ポリシーテンプレート | IAM ロールに設定する権限をポリシーテンプレートから設定する。 | 通知のアクセス許可 | |
ガードレールポリシー ポリシ名 | IAM ロールでチャネルのメンバーに付与するアクセス許可の制約を設定する(ガードレールポリシーで許可していない操作は実行できない)。 | チャネル IAM ロールより広い権限を付与(今回は「AdministratorAccess」) | |
通知 | SNS トピック リージョン | 購読する SNS トピックがあるリージョンを選択する。 | 「アジアパシフィック - 東京」 |
トピック | 購読する SNS トピックを選択する。 | 今回は「guardduty-notification」 |
チャネルの設定に成功すると、下記のような画面が表示される。
デスクトップアプリなどで Slack を開き、App 配下に「aws」が存在することを確認する。 存在しない場合は、「アプリを追加する」から「AWS Chatbot」を追加する。
Chatbot のコンソール画面で、今回設定したチャネル(「guardduty-notification」)のチェックボックスにチェックをつけて、「テストメッセージを送信」を選択すると、Chatbot - Slack 間の疎通をテストできる。
通知のテスト
GuardDuty では脅威の検知結果のサンプルを生成できる。 サンプルの生成をトリガーに Slack に検知結果が通知されることを確認する。
(注意)このテストで100通程度の Slack 通知が飛ぶ点に注意すること。
GuardDuty のコンソール画面を表示して、左側のメニューの「設定」を選択する。 「設定」画面の下の方にスクロールし、「結果のサンプル」の「結果サンプルの生成」を選択する(ボタン押下後の変化が少ないが問題ない)。
その後、左側のメニューの「結果」を選択する。 GuardDuty の脅威の結果画面を確認すると、脅威の検知結果のサンプルが表示されている。
(注意)この結果はあくまでサンプルであり、実際に攻撃を受けている訳ではない。
デスクトップアプリなどで Slack を開くと、下記のような通知が届く。 筆者がテストした際は通知が届くまでに少し時間がかかったので、届かない場合でも数分待つと届く。
Severity(重要度)は下記の通り。
- HIGH: 赤
- MEDIUM: 黄
- LOW: 青
検知結果の意味は、「結果タイプ」に記載されている。
上図の「Finding type: Backdoor:EC2/DenialOfService.Udp」は、EC2 インスタンスが UDP による DoS 攻撃を受けている可能性を示すもの。
補足
GuardDuty の利用料金
- GuardDuty の利用料金は、分析したログのイベント数やデータサイズに対する従量課金となる。
- 初回の有効時から30日間は利用料が無料となるが、GuardDuty のコンソール画面の「使用状況」から予測コストを確認できる(※ 下図は有効化の初日に確認したため、予測が0ドルになっている)。
GuardDuty の停止と無効化
- GuardDuty による脅威検知を一時的に停止したい場合は「GuardDuty の停止」を選択する。再開も可能。
- GuardDuty による脅威検知をやめたい場合は「GuardDuty の無効化」を選択する。
- (注意)GuardDuty の無償期間は30日間なので、課金を停止したい場合は期限切れまでに対処する必要がある点に注意する。