こんにちは、SRE エンジニアの綿引です。
今回は Amazon GuardDuty を取り上げたいと思います!
弊社でも GuardDuty は導入しているのですが如何せん確認が億劫になりがちです、、
そこで今回以下を記事にしようと思います!
- GuardDuty の概要
- 検知結果を Slack に通知する方法
同じような悩みを抱えている方の参考になれば幸いです。
因みに対象の方は以下のような方でしょうか。
- GuardDuty を有効にしているが毎回マネージメントコンソールから確認している or 放置してしまっている
- GuardDuty をまだ使用していない
Amazon GuardDuty とは
Amazon GuardDuty は AWS 環境や AWS アカウントに対する不正な動作や攻撃を検知してくれる脅威検出サービスです。
特徴を簡単にまとめると以下です。
- 以下のログなどを取得・分析して攻撃と思われる操作を検知してくれる
- AWS CloudTrail イベントログ
- Amazon VPC フローログ
- DNS ログ
- ログの分析には機械学習を用いている
- 使用方法はマネジメントコンソールから GuardDuty を開き 有効化 するだけ
機械学習を用いて通常時とは異なる挙動や、攻撃や脅威を検知してくれるなんて素敵なサービスですね。
試しにどんな情報を検知するのか、検証用の AWS アカウントを作成して確認してみました。
色々検出してくれたのですが、その一例が以下です。
- Amazon S3 ブロックパブリックアクセスの無効化
- EC2 への ブルートフォースアタック
- IAMUser がいつもと違う API を発行した
S3 や EC2 、IAM など様々なサービスで怪しい動きを検知してくれ、頼りになりそうです。
料金
続いて料金ですが、以下は東京リージョンの料金になります。
AWS CloudTrail 管理イベント分析 | 4.72 USD/100万イベント |
AWS CloudTrail S3 データイベント分析 | – 最初の 5 億イベント/月 : 1.04 USD/100万イベント – 次の 45 億イベント/月 : 0.52 USD/100万イベント – 50 億を超えるイベント/月 : 0.26 USD/100万イベント |
VPC フローログと DNS ログ分析 | – 最初の 500 GB/月 : 1.18 USD/GB – 次の 2000 GB/月 : 0.59 USD/GB – 次の 7,500 GB/月 : 0.29 USD/GB – 10,000 GB/月を超えた場合 : 0.17 USD/GB |
料金はイベント数や使用量によるので少しわかりづらいですが、だいぶ安い金額になっております。
GuardDuty の検知結果を Slack に通知する
Slack 通知には以下のサービスを使用します。
- GuardDuty
- CloudWatch Events
- SNS
- Chatbot(対象の Slack アカウントと連携済みの想定)
- IAM Role
- Slack
SNS・Chatbot・IAM Role に関しては CloudFormation で作成します。
イメージはこのような形です。
尚、SNS トピックのサブスクリプションには Chatbot だけでなく、メールも送信するように設定を入れております。
では早速設定をしていきましょう。
Slack のチャンネルID と ワークスペースID を取得する
まずは Slack のチャンネルを作成します。既存のチャンネルに通知したい場合は新規の作成は不要です。
チャンネル名は任意ですが、私は [# note-aws-guardduty] にしました。
次に Slack の [SlackチャンネルID] と [ワークスペースID] を取得します。これはCloudFormation にて Chatbot を作成する必要になります。
確認方法としては以下です。
- SlackチャンネルID
- Slack のアプリを起動
- 通知したいチャンネルの [Copy link] をクリック
-
- 貼り付け結果の /archives/ の後の文字列がチャンネルID
-
- https://XXXXXXX.slack.com/archives/YYYYYYYYYY ← この Y の部分
-
- 貼り付け結果の /archives/ の後の文字列がチャンネルID
- ワークスペースID
- AWS マネジメントコンソールより Chatbot を選択
- [接続済みクライアント] の Slack アカウントを選択
- [ワークスペースの詳細] に記載
CloudFormation にて SNS・Chatbot・IAM ロールを作成・設定する
続いて SNS トピック・Chatbot・Chatbot に付与する IAM ロールを CloudFormation で作成・設定します。
以下が CloudFormation の yaml ファイルです。
AWSTemplateFormatVersion: "2010-09-09" Description: GuardDuty to Slack # Slack のワークスペースIDとSlackチャンネルIDを入力 # Slack のワークスペースは事前に作成しておく Parameters: TargetWorkspaceId: Type: String Default: XXXXXXXXX # 先ほど取得したワークスペースIDを記載 TargetChannelId: Description: "note-aws-guardduty" Type: String AllowedValues: - "XXXXXXXXXXX" # 先ほど取得した SlackチャンネルID を記載 Resources: # GuardDuty用のSNSトピックの作成 GuardDutyForChatbotTopic: Type: AWS::SNS::Topic Properties: TopicName: GuardDuty-for-Chatbot-topic Subscription: - Endpoint: XXX@XXXXXXXXXXXX # 通知を受けたいメールアドレスを記載 Protocol: email # GuardDuty用のChatbotの作成 ChatbotForGuardDuty: Type: AWS::Chatbot::SlackChannelConfiguration Properties: ConfigurationName: GuardDutyAlertChannel IamRoleArn: !GetAtt ChatbotIamRole.Arn LoggingLevel: INFO SlackChannelId: !Ref TargetChannelId SlackWorkspaceId: !Ref TargetWorkspaceId SnsTopicArns: - !Ref GuardDutyForChatbotTopic ChatbotIamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: chatbot.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: chatbot-iam-policy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - cloudwatch:Describe* - cloudwatch:Get* - cloudwatch:List* Resource: - "*"
CloudWatch Events を設定する
最後に CloudWatch Events を設定して、GuardDuty と SNS を連携します。
マネジメントコンソールより CloudWatch を選択し、[イベント] → [ルール] → [ルールの作成] をクリックします。
ルールの作成では以下の項目を入力していきます。
- イベントソース : イベントパターン
- サービス : GuardDuty
- イベントタイプ : GuardDuty Finding
- ターゲット : SNS トピック
- トピック : GuardDuty-for-Chatbot-topic(先ほどの CloudFormation で作成)
これで全ての設定が完了しました。
GuardDuty で異常を検知すると以下のように Slack とメールが通知されます。
最後に
今回は GuardDuty の検知結果を Slack に通知する方法を記載しました。
GuardDuty を含め Config や CloudTrail などセキュリティ系のサービスは即時チェックしたいので、できればチャットに飛ばしたいという思いからやってみましたが、上手くいってよかったです。
次は他のセキュリティ系のサービスでのチャット連携と、terraform での作成などもやっていきたいと思います。