2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Inspector v2の脆弱性診断内容を「Slackベース」で管理する

Posted at

はじめに

ご覧いただきありがとうございます。

以前Amazon Inspector Classicについて記事を書きました。

最近 現行バージョンであるInspector v2で検知を行ったところ、検知精度に差があることがわかり、「Classic⇒v2」への移行を行っているところです。

今回はSlack画面で、Inspector v2の脆弱性検知結果を管理できるようにしたいと思います。

概要

  1. 事前準備
  2. Slack ~ Lambda間の連携
  3. Lambda ~ Slack間の連携
  4. Lambda関数の作成
  5. 動作確認

image.png

Slackのプライベートチャンネルでコマンドを実行すると、Lambda関数が実行されます。
Lambda関数はInspector v2の診断結果から「重要度が"High"」かつ「Active」の脆弱性を探して、Slackに通知します。

1. 事前準備

Inspector v2の有効化

公式のユーザーガイドで、設定方法を確認します。

以下の設定が必要です。

  • Amazon Inspectorをアカウントで有効化する。
  • SSMエージェントをインストール

Amazon Inspectorのページを開くと、上記の画面が表示されます。
「使用を開始する」をクリック。

「Inspectorを有効化」をクリックします。

Amazon Inspectorが動作する環境ができました。

次にSSMの設定を行います。

  • EC2用に「AmazonSSMManagedInstanceCore」が付与されたIAMロールを作成
  • 脆弱性診断対象のEC2を1台作成
  • EC2にIAMロールを付与して、マネージドインスタンス(Systems Manager)にする

Inspectorのページで設定反映確認

Inspectorのページで、EC2が認識されているかを確認します。


image.png

「検出結果」⇒「インスタンス別」から、EC2インスタンス別に検出結果の確認ができます。
対象のEC2インスタンスを選択します。

image.png

選択したEC2インスタンスについて、重要度が"CRITICAL","HIGH","MEDIUM"別に、検知された脆弱性が表示されます。
今回は"HIGH"の脆弱性6件をユーザーに通知するように設定していきます。

2. Slack ~ Lambda間の連携

AWS Chatbotの設定

Slack ~ Lambda間で連携を行うように設定していきます。

AWS Chatbotのページに移動します。
クライアントの設定で「Slack」を選択します。

今回利用するワークスペースを入力します。

権限リクエストを許可します。

設定が完了すると、AWS Chatbotの設定済クライアントにワークスペースが表示されます。

Slack側でチャンネル作成

プライベートチャンネルを作成します。

AWS Chatbot側でチャネル設定

「新しいチャネルを設定」をクリックします。

  • 設定名: 任意の名前
  • チャネルタイプ: プライベート
  • チャネルID: チャンネルID
  • ロール設定: チャネルIAMロール
  • チャネルIAMロール: テンプレートを使用してIAMロールを作成する
  • ロール名: 任意の名前
  • ポリシーテンプレート: 「読み取り専用コマンドのアクセス許可」「Lambda呼び出しコマンドのアクセス許可」

上記の設定を行い、チャネルを作成します。

AWS ChatbotをSlackワークスペースに追加

Slackのプライベートチャンネルで

/invite @aws

を入力して、招待を行います。

image.png

SlackのプライベートチャンネルにAWSが招待されました。

これでSlack ~ AWS間の連携ができました。
Slackで入力するコマンドで、Lambda関数を実行できるようになります。

3. Lambda ~ Slack間の連携

Incoming Webhookの設定

続いてLambda ~ Slack間が連携するように設定していきます。

Incoming Webhookを使用します。
外部ソースからの情報を簡単にワークスペースと共有できます。

Slack画面の「App」の画面で、「Appディレクトリ」を選択。

「ビルド」を選択します。

次に「Create an app」を選択。

「From scratch」を選択します。

使用するワークスぺースを選択します。

「Basic Information」から「Incoming Webhooks」を選択。

Webhookをアクティブ化した上で、「Add New Webhook to WorkSpace」を選択。

通知を送るチャンネルを指定して、「許可する」を選択。

次のセクションでWebhook URLを使用するので、コピーしておきます。

4. Lambda関数の作成

Lambda関数の作成

  • オプション: 一から作成
  • 関数名: ※任意の名前
  • ランタイム: Python3.8
  • アーキテクチャ: x86_64
  • アクセス制限: ※Lambda用のロールを付与

関数作成後、設定タブからタイムアウトの秒数を10秒に変更。

コードを作成します。

import urllib3
import json
import boto3
http = urllib3.PoolManager()

inspector2 = boto3.client("inspector2")
sns_client = boto3.client('sns')

instance_id = 'xxxxxxxxxxxxxxxxxxxxxxxx'
url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
slack_channel = 'xxxxxxxxxxxx'




def lambda_handler(event, context):
    paginator = inspector2.get_paginator('list_findings')

    iterator = paginator.paginate(filterCriteria={
                'findingStatus': [
                    {
                        'comparison': 'EQUALS',
                        'value': 'ACTIVE'
                    },
                ],
                'resourceId': [
                    {
                        'comparison': 'EQUALS',
                        'value': instance_id
                    },
                ],
                'severity': [
                    {
                        'comparison': 'EQUALS',
                        'value': 'HIGH'
                    }
                ]
            })
            
    finding = inspector2.list_findings(filterCriteria={
                'findingStatus': [
                    {
                        'comparison': 'EQUALS',
                        'value': 'ACTIVE'
                    },
                ],
                'resourceId': [
                    {
                        'comparison': 'EQUALS',
                        'value': instance_id
                    },
                ],
                'severity': [
                    {
                        'comparison': 'EQUALS',
                        'value': 'HIGH'
                    }
                ]
            }
        )
        
    num = len(finding['findings'])
    
    for n in range(num):
        for i in iterator:
            title = i['findings'][n]['title']
            first_date = i['findings'][n]['firstObservedAt']
            type = i['findings'][n]['type']
            score = i['findings'][n]['inspectorScore']
            severity = i['findings'][n]['severity']
            
            message = f"脆弱性を検知しました。内容をご確認ください。\nID: {instance_id}\nTitle: {title}\nAccrual date: {first_date}\nType: {type}\nScore: {score}\nSeverity: {severity}"
            
            msg = {
                "channel": slack_channel,
                "username": "",
                "text": message,
                "icon_emoji": ""
            }
    
            encoded_msg = json.dumps(msg).encode('utf-8')
            resp = http.request('POST',url, body=encoded_msg)
    
    return 0

「xxxxxxxxxxxxxxxxxxxxxxxxx」は、自身の環境のものに置き換えてください。
instance_id = 対象のEC2インスタンスID
url = Webhook URL
slack_channel = Slackのプライベートチャンネル名

boto3の記述方法はリファレンス、Lambda ~ Slack間の通知方法はこちらを参考にしています。

5. 動作確認

ではSlackのプライベートチャンネルで、下記のコマンドを入力します。

@aws lambda invoke xxxxxxxxxxxxxx --region ap-northeast-1

「xxxxxxxxxxxxxx」には、Lambda関数の名前を入力します。

Slackコマンドを入力すると、コマンドを実行するか聞かれるので、承認します。

image.png

Slack側で6件の通知が行われました。
AWSコンソールで確認されている"High"の脆弱性の内容がSlackに通知されました。

さいごに

以上 Amazon Inspector v2の脆弱性検知結果を、Slackで管理できるようにしました。

御覧いただき ありがとうございました!!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?