AWS Inspector v2の通知内容を日本語化してBacklogに起票する
2022.11.15
AWS Inspector v2(以下、Inspector)の通知内容をできるだけ見やすく(日本語化、整形)して通知する方法をご紹介します。
実装するための詳細手順を載せてますので、宜しければお試しください。
はじめに
AWSのセキュリティを強化するためには、プラットフォーム上の脆弱性とOS内の脆弱性を診断するためにAWS Security HubやInspectorを使用したり、悪意のあるアクティビティ(操作)、不正な動作、不正なアカウント連携、サーバーの乗っ取り等を検知したりするためにAmazon GuardDutyやIAM AccessAnalyzerを使用するなどして、総合的に対策することが重要です。
今回は、その中の一つであるInspectorに焦点をあて、Inspectorの脆弱通知が英語で分かりづらい、とお困りの方に向けて 「脆弱性の通知内容を日本語化してbacklogに起票する」 という内容をご紹介いたします。
Inspectorのダッシュボードはとても見やすいですが、コンソールに定期的にログインして確認するのが意外と大変でした。Event Bridgeと連携することで通知は可能ですが、json形式かつ英語のため、できるだけ見やすく(日本語化、整形)した上で通知する仕組みを作ってみました。
Inspectorとは?
Inspector とは、Amazon EC2(以下、EC2)もしくはAmazon ECRのコンテナイメージに対して自動的にかつ継続的にスキャンを行い、脆弱性の影響を受けるリソースを検出するサービスとなります。
CVEに登録されている脆弱性を検知することができ、加えてEC2はネットワーク到達性等が考慮されたInspector Scoreが表示されるので、実際の環境に適したスコアを確認できます。 実行タイミングは新しい脆弱性が登録、ソフトウェアがインストール、もしくは脆弱性対象のソフトウェアがアップデートされたときに自動で実行されるので、ユーザ側で実行タイミングを考える必要はありません。
日本語化してバックログに起票する実装方法
全体のフロー図は以下となります。
Backlog起票用のメールアドレスを発行
Backlog起票用のメールアドレスを発行は、 こちらの公式手順 を参照ください。
通知用SNSトピックの作成
SNSサービス画面を開き【トピック】から【トピックの作成】へ進み、タイプの選択を【スタンダード】に変更し、任意の名前を入力した上で【トピックの作成】をクリックします。
※ ここでは「inspector-notifications」としています
【サブスクリプションの作成】よりプロトコルを「Eメール」に変更し、エンドポイントにバックログ起票用のメールアドレスを入力の上【サブスクリプションの作成】をクリックします。
「Notification AWS – Subscription Confirmation」というメールが届いたら本文のリンクをクリックし、承認が完了します。 問題なく承認がされていればサブスクリプションのステータスが「確認済み」になっているかと思います。
Lambda関数の作成
Lambdaサービス画面を開き【関数の作成】を選択し、関数名に任意の名前を入力し、ランタイムはPythonの最新バージョンを選びます。
※ ここでは「send-mail-inspector-v2-result」としています。)その他はデフォルトのまま【関数の作成】をクリックします。
関数の作成が完了したら、コード入力箇所に以下のコードを貼り付けし、【Deploy】を行います。
import os
import boto3
import json
import traceback
sns = boto3.client('sns')
inspector = boto3.client('inspector')
SNS_TOPIC_ARN = os.environ['SNS_TOPIC_ARN']
def sns_publish(subject, body):
sns = boto3.client('sns')
sns.publish(
TopicArn = SNS_TOPIC_ARN,
Subject = str(subject),
Message = str(body)
)
def translate_text(text):
client = boto3.client('translate')
response = client.translate_text(
Text=text,
SourceLanguageCode='auto',
TargetLanguageCode='ja',
)
return response['TranslatedText']
def translate_score(scoringVector):
# メトリクス一覧の定義
AV = {'N': 'ネットワーク', 'A': '隣接', 'L': 'ローカル', 'P': '物理'}
AC = {'L': '低', 'H': '高'}
PR = {'N': '不要', 'L': '低', 'H': '高'}
UI = {'N': '不要', 'R': '要'}
S = {'U': '変更なし', 'C': '変更あり'}
C = {'H': '高', 'L': '低', 'N': 'なし'}
I = {'H': '高', 'L': '低', 'N': 'なし'}
A = {'H': '高', 'L': '低', 'N': 'なし'}
# スコアメトリクスを日本語化する
# example) CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
splitScoringVectors = scoringVector.split("/")
score = splitScoringVectors[0].split(':')[1]
av = splitScoringVectors[1].split(':')[1]
ac = splitScoringVectors[2].split(':')[1]
pr = splitScoringVectors[3].split(':')[1]
ui = splitScoringVectors[4].split(':')[1]
s = splitScoringVectors[5].split(':')[1]
c = splitScoringVectors[6].split(':')[1]
i = splitScoringVectors[7].split(':')[1]
a = splitScoringVectors[8].split(':')[1]
translateScoringVector = "攻撃元区分: " + AV[av] \
+ "\n攻撃条件の複雑さ:" + AC[ac] \
+ "\n必要な特権レベル:" + PR[pr] \
+ "\nユーザ関与レベル:" + UI[ui] \
+ "\n機密性への影響:" + C[c] \
+ "\n完全性への影響:" + I[i] \
+ "\n可用性への影響:" + A[a]
return translateScoringVector
def lambda_handler(event, context):
try:
# ec2 ecr 共通情報を取得
time = event['time']
detail = event['detail']
description = detail['description']
cvsses = detail['packageVulnerabilityDetails']['cvss']
sourceUrl = detail['packageVulnerabilityDetails']['sourceUrl']
vulnerabilityId = detail['packageVulnerabilityDetails']['vulnerabilityId']
recommendation = detail['remediation']['recommendation']['text']
resources = event['resources']
severity = detail['severity']
title = detail['title']
existsInspectorScoreDetails = 'inspectorScoreDetails' in detail.keys()
# ec2 は inspectorscore、ecr は cvss(3.1) を取得
scoringVector = ""
score = ""
if (existsInspectorScoreDetails):
scoringVector = detail['inspectorScoreDetails']['adjustedCvss']['scoringVector']
score = detail['inspectorScoreDetails']['adjustedCvss']['score']
else:
for cvss in cvsses:
source = cvss['source']
version = cvss['version']
if version == '3.1':
scoringVector = cvss['scoringVector']
score = cvss['baseScore']
break
# description を和訳する
translateDescription = translate_text(description)
# recommendation を和訳する
translateRecommendation = translate_text(recommendation)
# score を和訳する
translateScoringVector = translate_score(scoringVector)
# 件名を作成
subject = "【" + str(score) + "】" + title
# 本文を作成
messageBody = "【スコアメトリクス(ec2:inspectorscore/ecr:cvss(version:3.1))】" \
+ "\nスコア:" + str(score) \
+ "\n" + translateScoringVector \
+ "\n\n【詳細】\n時間:" + str(time) \
+ "\nリソース ID:" + ",".join(resources) \
+ "\n重大性:" + severity \
+ "\n脆弱性 ID:" + vulnerabilityId \
+ "\n説明:" + translateDescription \
+ "\n推奨:" + translateRecommendation \
+ "\n\nソース url:" + sourceUrl
# メール送信
sns_publish(subject, messageBody)
except:
print(traceback.print_exc())
title="Inspector Notifications (Extraction failure)"
sns_publish(title, str(event))
finally:
print("event:",event)
return 0
【設定】タブの【アクセス権限】から自動で作成された実行ロールをクリックし、ロールのページへ移動します。
ロールからポリシーをクリックし、【ポリシーの編集】より以下ポリシーを追記します。
※ 既存の閉じカッコ(})に「,」を入力する必要があります
※ 今回はテストのためリソースを「*」としていますので、必要に応じてリソースを絞ってください
{
"Action": [
"translate:TranslateText",
"comprehend:DetectDominantLanguage",
"SNS:Publish"
],
"Effect": "Allow",
"Resource": "*"
}
Lambdaサービス画面に戻り、【設定】タブの【環境変数】を開き、【編集】をクリックします。【環境変数の追加】を選択し、以下の内容で入力し、【保存】をクリックします。
EventBridgeの作成
EventBridgeサービス画面を開き【ルールを作成】をクリックします。任意の名前を入力し、【次へ】をクリックします。
※ここでは「inspector-finding」としています。
下までスクロールし、イベントパターン内の【パターンを編集】を選択し、以下を入力し、【次へ】をクリックします。
{
"source": ["aws.inspector2"],
"detail-type": ["Inspector2 Finding"]
}
ターゲットは「Lambda関数」に、機能を先程作成したLambda関数に変更し、【次へ】をクリックします。
その他変更はないので、【次へ】で進んでいただき、【ルールの作成】をクリックします。
SSMエージェントをインストール、有効化する
SSMエージェントをインストールと有効化は、OSによって対応内容が変わりますので公式ユーザガイドのリンクを記載します。
Inspector v2を有効化する
Inspectorサービス画面を開き【使用を開始する】より【Inspector を有効化】をクリックします。
有効化後スキャンが自動で始まるので、脆弱性があるサーバであれば、しばらくするとInspectorの通知が届いているはずです!
Backlogに起票された通知内容を確認する
それでは、実際に起票された結果を確認してみます。日本語化された通知がbacklogに届いている事が確認できました。
EC2の結果
ECRコンテナイメージの結果
終わりに
今回は、「AWS Inspector v2の通知内容を日本語化してバックログに起票する」をご紹介させていただきました。 実際に行ってみた感想としては、見やすく通知されるのでコンソール画面を確認しにいく回数が減り、backlogに起票することで脆弱性の管理もできて良いかなと思います。
ただ、このままだと検知数が多いので、Event BridgeのイベントパターンをスコアがHIGH以上で検知させるなど範囲を絞ると良いかなと思います。
また、脆弱性を診断するためのInspectorを利用するだけではAWSのセキュリティ強化としては不十分であるため、「脅威検出するためのGuardDutyやIAM AccessAnalyzerを活用したい」 や 「GuardDutyやIAM AccessAnalyzerの詳細や推奨される対応策も日本語化したい」、「各AWSセキュリティサービスの機能をまとめて管理したい」 という方には、AWSの脆弱性や攻撃をまとめて管理できるSaaSサービス「 Safing」など、便利なサービスを利用することがおすすめです。
最後までお読みいただきありがとうございました。



