My Note

自己理解のためのブログ

【アップデート】GuardDutyの結果をLambda ( Go ) でSlackに通知する

はじめに

今回は以前に書いた "GuardDutyの結果をLambda ( Go ) でSlackに通知する" 内容をアップデートしました。 主な目的はslack通知に利用するライブラリを新たに検証したかった事と、CloudwatchEventからEventBridgeに変わり内容を確認したかったためです。

yhidetoshi.hatenablog.com

主なアップデート内容は以下の通りです。

  • Slack通知をwebhookからSlackAppを作成して通知するように変更
  • Goのパッケージ構成を変更
  • slack通知に利用するライブラリを slack-go を利用するように変更
  • CloudwatchEventからEventBridgeへ変更

SlackAppを利用する

  • Create New App f:id:yhidetoshi:20211217133010p:plain

  • workspace を指定する f:id:yhidetoshi:20211217133035p:plain

  • App Manifest を以下に設定しました。 bot のスコープは特定チャンネルに書き込みできればいいので chat:write を設定。

_metadata:
  major_version: 1
  minor_version: 1
display_information:
  name: notice
features:
  app_home:
    home_tab_enabled: false
    messages_tab_enabled: false
    messages_tab_read_only_enabled: false
  bot_user:
    display_name: notice
    always_online: true
oauth_config:
  scopes:
    bot:
      - chat:write
  • Install to Workspace を実行する f:id:yhidetoshi:20211217133235p:plain

  • Bot User OAuth Token を確認。このトークンを利用する。 f:id:yhidetoshi:20211217133400p:plain

パッケージ構成

mainとhandlerとslackの処理でパッケージを分離しました。前回はmain.goだけで処理を書いていたので 目的別に分離した形になります。(もっとキレイに分けれると思いますが今回はパッケージを分けて実行してみるのが目的のためにひとまずこれで。)

guardduty-lambda
├── README.md
├── go.mod
├── go.sum
├── handler ( handlerの処理を実装 )
 │   └── handler.go
├── main.go ( handlerの呼び出し )
├── notification
 │  └── slack.go ( slack通知の処理を実装 )
└── serverless.yml
  • go modコマンド
go mod init guardduty-lambda
  • main.go (一部抜粋)
package main

import (
    "guardduty-lambda/handler"
    "github.com/aws/aws-lambda-go/lambda"
)
  • handler/handler.go (一部抜粋)
package handler

import (
    "guardduty-lambda/notification"
         ・・・
)
  • notification/slack.go (一部抜粋)
package notification

import (
    "github.com/slack-go/slack"
         ・・・
)

EventBridgeについて

前回の記事ではCloudWatchEventで設定していました。 $serverless deploy で 自動作成されますが EventBridgeを確認します。

  • serveless.yamlの一部抜粋
functions:
  slack:
    handler: main
    role: GuardDutyLambda
    timeout: 30
    description: GuardDutyLambda slack notice
    memorySize: 128
    environment:
      SLACK_TOKEN: ${opt:slacktoken}
      CHANNEL_ID: ${opt:channelid}
      THRESHOLD: ${opt:threshold}
    events:
      - eventBridge:
          pattern:
            source:
              - aws.guardduty
            detail-type:
              - GuardDuty Finding

f:id:yhidetoshi:20211217140559p:plain

  • 作成されたイベントパターン
{
  "detail-type": ["GuardDuty Finding"],
  "source": ["aws.guardduty"]
}
  • イベントパターンを試すために確認するテストデータ(自分でコンソールにコピペして確認)
{
    "version": "0",
    "id": "111111111-11111-caae-111111111",
    "detail-type": "GuardDuty Finding",
    "source": "aws.guardduty",
    "account": "12345678910",
    "time": "2021-12-16T01:10:00Z",
    "region": "ap-northeast-1",
    "resources": [],
    "detail": {
        "schemaVersion": "2.0",
        "accountId": "XXX",
        "region": "ap-northeast-1",
        "type": "UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration",
        "resource": {
            "resourceType": "AccessKey",
            "accessKeyDetails": {
                "accessKeyId": "GeneratedFindingAccessKeyId",
                "principalId": "GeneratedFindingPrincipalId",
                "userType": "IAMUser",
                "userName": "GeneratedFindingUserName"
            }
        },
        "severity": 8,
        "title": "Credentials for instance role GeneratedFindingUserName used from external IP address.",
        "description": "Credentials created exclusively for an EC2 instance using instance role GeneratedFindingUserName have been used from external IP address 198.51.100.0."
    }
}

Slack通知について

前回の記事では、このslackのライブラリを利用していました。

github.com

今回はこちらの方がスター数もかなり多く多機能で活発にコミットされているため利用しました。

github.com

ソースコードは下記にあります。 https://github.com/yhidetoshi/GuardDutyAlertSlack/blob/main/notification/slack.go

  • Slackへの通知結果

f:id:yhidetoshi:20211217142039p:plain

さいごに

以前に作成したAWS GuardDutyの通知についてアップデートを行いました。 slack-goについては利用しやすくメッセージをpostする以外にも色々と機能が実装されているのでこれからはこのライブラリを 積極的に活用していこうと思います。

ソースコードは下記のGitHubにあります。 github.com