やりたいこと
Amazon InspectorでSeverity(重大性)がCriticalもしくはHighのソフトウェアの脆弱性を検出した際に、Asanaにタスクを作成するパイプラインを構築する。
Amazon Inspector とは
Amazon Inspector は、Amazon EC2 インスタンス、コンテナ、Lambda 関数などのワークロードを自動的に検出し、ソフトウェアの脆弱性や意図しないネットワークの露出がないかをスキャンします。
Asana とは
Asanaは、SaaSのプロジェクト管理ツールです。
実装方法
EventBridge API Destinationを用いて、Amazon InspectorのイベントをトリガーにAsana APIにリクエストを送信してタスクを作成する。
Asana APIの仕様に沿って整形するためにEventBridge 入力トランスフォーマーを使用します。
検証準備
-
Asanaでプロジェクトを作成する。
見やすいようにセクションとカスタムフィールドを設定しました。
-
Asana APIで使用するトークンを発行する。
トークンは発行時のみ確認できるので必ずコピーしておきます。
-
Amazon Inspectorをアクティブ化する。
-
EventBridge > 統合 > 接続 でAsana APIのトークンの情報を登録する。
項目名 パラメータ値 接続名 asana-api-connection APIタイプ パブリック 認証を設定 カスタム設定 認証タイプ APIキー APIキー名 / 値 Authorization / < Asana APIのトークン > 暗号化 AWS所有キーを使用する -
EventBridge > 統合 > 接続 でAsana APIの情報を登録する。
項目名 パラメータ値 名前 asana-api-connection API送信先エンドポイント https://app.asana.com/api/1.0/* HTTPメソッド POST 接続タイプ 既存の接続を使用 / asana-api-connection -
EventBridge > バス > ルール でルールを作成する。
項目名 パラメータ値 名前 create-asana-task-from-inspector-inspection イベントバス default ルールタイプ イベントパターンを持つルール イベントソース AWSイベントEventBridgeパートナーイベント 作成のメソッド カスタムパターン(JSONエディタ) イベントパターン 下記参照 ターゲットタイプ EventBridge APIの宛先 API送信先 既存のAPI送信先の使用/asana-api-connection パスパラメータ tasks 実行ロール この特定のリソースについて新しいロールを作成 ロール名 Amazon_EventBridge_Invoke_Api_Destination_xxxxxxxx ターゲット入力を設定 入力トランスフォーマー 入力トランスフォーマーを設定 > ターゲット入力トランスフォーマー > 入力パス 下記参照 入力トランスフォーマーを設定 > ターゲット入力トランスフォーマー > テンプレート 下記参照 - イベントパターン
{ "source": ["aws.inspector2"], "detail-type": ["Inspector2 Finding"], "detail": { "severity": ["HIGH", "CRITICAL"], "status": ["ACTIVE"] } }- 入力トランスフォーマーを設定 > ターゲット入力トランスフォーマー > 入力パス
{ "awsAccountId": "$.detail.awsAccountId", "description": "$.detail.description", "findingArn": "$.detail.findingArn", "firstObservedAt": "$.detail.firstObservedAt", "inspectorScore": "$.detail.inspectorScore", "vulnerabilityId": "$.detail.packageVulnerabilityDetails.vulnerabilityId", "instanceId": "$.detail.resources[0].id", "title": "$.detail.title" }- 入力トランスフォーマーを設定 > ターゲット入力トランスフォーマー > テンプレート
{ "data": { "name": "<title>", "notes": "<description>\n\nhttps://ap-northeast-1.console.aws.amazon.com/inspector/v2/home?region=ap-northeast-1#/findings/instances/<instanceId>", "projects": "1210218073982778", "custom_fields": { "1210218073982796": "1210218073982797", "1210218074125934": "<awsAccountId>", "1210218074125936": "<findingArn>", "1210218074125944": "<firstObservedAt>", "1210218074125946": "<inspectorScore>", "1210218074125948": "<vulnerabilityId>", "1210218074125942": "<instanceId>" } } }EventBridge 入力トランスフォーマーの部分はサンプルイベントを参考に必要なデータのみを抽出しました。またデバッグで出力したJSONデータをPostmanを用いてAsana APIにリクエストを送信してタスクを作成できるか確認しました。
remediation(対策)もAsanaに連携したかったのですが、改行コードのエスケープがうまくいかず...今回は諦めました。
プロジェクトIDはURLのproject/xxxxxxxxxxxxxxxxの16桁の数字にです。
カスタムフィールドのGIDはAsana APIのGet a taskを用いて取得しました(GUIで確認できなさそうだったので...)。
検証シナリオ
EC2インスタンスでソフトウェアの脆弱性が確認されているバージョンのWiresharkをインストールし、Asanaでタスクが作成されるかを確認する。
dnf install wireshark --releasever=2023.0.20230315 -y
エージェントベースのスキャンではSSMを使用するため、EC2インスタンスにはAmazonSSMManagedInstanceCoreが含まれているIAMロールをアタッチします。
スキャン頻度を考慮し、WiresharkをインストールしてからIAMロールをアタッチしました。
検証結果
Amazon InspectorでSeverity(重大性)がCritical/Highのソフトウェアの脆弱性を検出して、Asanaにタスクを作成されました。
所感
想定していたよりもシンプルな構成、かつ簡単に実装できたことに驚きました。
ただEventBridge 入力トランスフォーマーで必要なデータを抽出する部分が少しハマったので、ここら辺の知見は今後深めていきたいです。








