【アップデート】GuardDutyの結果をLambda ( Go ) でSlackに通知する
はじめに
今回は以前に書いた "GuardDutyの結果をLambda ( Go ) でSlackに通知する" 内容をアップデートしました。 主な目的はslack通知に利用するライブラリを新たに検証したかった事と、CloudwatchEventからEventBridgeに変わり内容を確認したかったためです。
主なアップデート内容は以下の通りです。
- Slack通知をwebhookからSlackAppを作成して通知するように変更
- Goのパッケージ構成を変更
- slack通知に利用するライブラリを
slack-go
を利用するように変更 - CloudwatchEventからEventBridgeへ変更
SlackAppを利用する
Create New App
workspace を指定する
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
パッケージ構成
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
- 作成されたイベントパターン
{ "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のライブラリを利用していました。
今回はこちらの方がスター数もかなり多く多機能で活発にコミットされているため利用しました。
ソースコードは下記にあります。 https://github.com/yhidetoshi/GuardDutyAlertSlack/blob/main/notification/slack.go
- Slackへの通知結果
さいごに
以前に作成したAWS GuardDutyの通知についてアップデートを行いました。 slack-goについては利用しやすくメッセージをpostする以外にも色々と機能が実装されているのでこれからはこのライブラリを 積極的に活用していこうと思います。
ソースコードは下記のGitHubにあります。 github.com