こんにちは、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 の部分
  • ワークスペースID
    • AWS マネジメントコンソールより Chatbot を選択
    • [接続済みクライアント] の Slack アカウントを選択
    • [ワークスペースの詳細] に記載

 

CloudFormation にて SNS・Chatbot・IAM ロールを作成・設定する

続いて SNS トピック・Chatbot・Chatbot に付与する IAM ロールを CloudFormation で作成・設定します。

以下が CloudFormation の yaml ファイルです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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:
- "*"
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: - "*"
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 での作成などもやっていきたいと思います。

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る