はじめに
GMOコネクトの永田です。
AWS Inspector v2によるECR Scan結果のSlack通知を「いい感じ」にしたいと相談があり、対応しましたので、その内容をまとめます。
まとめ
- EventBridgeのInputTransformerを利用すると「いい感じ」にメッセージを加工できる
- InputTransformer自体は、AWS Management Consoleから操作すると、分かりやすく設定できる
- AWS Management Consoleで設定したInputTransformerは、CFnにexportできるので便利!
発生していた事象
以下の記事でも紹介されている通り、Inspectorからの通知結果はSlackまで来るには来るのですが、情報量が非常に少ないです。
ECRの場合は、以下の情報だけです。
-
Inspector2 Findingという固定文字列 - Related resourcesに、検知対象のECR repo imageのhash(
arn:aws:ecr:{Region}:{AWSAccount}:repository/{repo}/sha256:{digest}のような形式)
これだと毎回AWSにログインして内容を確認しないといけなく、とても手間です。
(ちなみにSNSTopicのEMailの場合は、もっと色々と情報がのってくる)
ということで改善方法を検討します。
SecurityHub経由でもいいのですが、ついでにSlackに投稿するメッセージをカスタマイズしたかったので、別の方法を探ります。(Lambdaでがんばるという最終案は除く😇)
色々と調べた結果、EventBridgeのInputTransformerが使えそうだということで、調べてみます。
EventBridgeの入力トランスフォーマー(InputTransformer)とは
EventBridgeからSNSTopicなどに通知する前に、通知するイベントを「いい感じ」に加工する設定を入れることができるものになります。
なので、「いい感じ」に必要な情報を含めつつ、前回の記事にも出てきたCustom通知の形式にしてあげると、最終的にSlackに「いい感じ」に通知されそうです。
「いい感じ」に必要な情報の収集設定
ということで、加工元になるイベントのJSONフォーマットを確認しましょう。
といっても、入力トランスフォーマーの設定画面で、一通りのサンプルを見ることができます。とても親切ですね!
このJSONを参考に、必要な情報をJSON Pathの形式で列挙していきます。
といってもGPTあたりに聞くと、JSON Pathは作ってくれるので、それを並べる感じです。
いつも通りな雑なpromptだとこんな感じです。
以下のAWS Inspector2 Finding JSONから必要な情報を抜きだすInputTransformerのJSON設定を作成
##### 必要な情報
- CVE ID
- CVE description
- CVSS Score
##### InputTransformerのJSON設定
{
"vulnerabilityId": <JSONPath>,
"cveDescription": <JSONPath>,
"cvssScore": <JSONPath>
}
##### 取得元AWS Inspector2 Finding JSONサンプル
{{Sample JSON貼り付け}}
上記の3つだとInputPathはこんな感じですね。
{
"vulnerabilityId": "$.detail.packageVulnerabilityDetails.vulnerabilityId",
"cveDescription": "$.detail.description",
"cvssScore": "$.detail.inspectorScore"
}
cveDescription などのkeyはこの後のテンプレートに使います。値は先ほどのJSON Pathです。
InputTemplateの設定
AWS ChatbotのCustom通知のフォーマットになるように設定をいれていきます。
<> でInputPathで設定したkeyをいれるだけで、比較的簡単に記載できます。
(見やすさのために改行とインデントいれていますが、実際の設定には不要です)
{
"version": "1.0",
"source": "custom",
"content": {
"description": "*CVE ID:* <vulnerabilityId>\n*Description:* <cveDescription>\n*Score:* <cvssScore>"
}
}
一通り設定したら、「出力を生成」で先ほどのサンプルイベントJSONでの変換結果が確認できます。
今回はこんな感じになって、期待通りに変換できてそうですね!
{
"version": "1.0",
"source": "custom",
"content": {
"description": "*CVE ID:* CVE-2018-25020\n*Description:* Multiple integer overflows in libwebp allows attackers to have unspecified impact via unknown vectors.\n*Score:* 7.8"
}
}
作成したCloudFormation
色々設定が必要なInputTransformerですが、なんとCloudFormation形式で設定がexportできます!(他のサービスにも欲しいですね😇)
ということで、出来上がったCloudFormationは以下になります。
InspectorCustomNotify:
Type: AWS::Events::Rule
Properties:
Name: InspectorCustomNotify
EventPattern: '{"source":["aws.inspector2"],"detail-type":["Inspector Finding"]}'
State: ENABLED
Description: ''
EventBusName: default
Targets:
- Id: Id133bc168-7cee-4d3b-b7b8-c03b70ae0657
Arn: !Ref SNSTopicArn
InputTransformer:
InputPathsMap:
cveDescription: $.detail.description
cvssScore: $.detail.inspectorScore
vulnerabilityId: $.detail.packageVulnerabilityDetails.vulnerabilityId
InputTemplate: >-
{"version":"1.0","source":"custom","content":{"description":"*CVE
ID:* <vulnerabilityId>\n*Description:* <cveDescription>\n*Score:*
<cvssScore>"}}
これで、次回以降、スムーズに構築できますね!
(再掲)まとめ
- EventBridgeのInputTransformerを利用すると「いい感じ」にメッセージを加工できる
- InputTransformer自体は、AWS Management Consoleから操作すると、分かりやすく設定できる
- AWS Management Consoleで設定したInputTransformerは、CFnにexportできるので便利!
弊社では、AWSを使ったサービスの開発や技術支援をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。

