目次
[アドカレ2024]Cloud One File Storage Security(C1FSS)でマルウェア検出を自動通知する
待ちに待ったDENETアドカレの季節がやってきました!
「DENET ADVENT CALENDAR 2024」で、12/11(水)と12/19(木)の2回分担当させてもらう運用サービス課の栩野です。
以前にはなりますが、C1FSSを用いたS3バケットのマルウェア検出設定について、以下のブログでご紹介しました。
Cloud One File Storage Security(C1FSS)でS3バケットにアップロードされたマルウェアを検出する
マルウェアを検出するだけじゃ満足でき...ないですよね...!?
前回のブログまでの設定では、マルウェアを検出してもオブジェクトに対してマルウェア検出のタグが自動付与されるだけで、通知までは行われませんでした。
アドベントカレンダーの担当2日に分けて、「マルウェア検出時に自動でメール通知する方法」と「自動で隔離する方法」を解説させてもらいます。
まずは今回、マルウェア検出時に自動でメール通知する方法について解説します。
しっかりクリスマスの脅威に備えていきましょう?
実際に設定してみる
C1FSSの導入時にCloudFormationで、下記のような構成が作成されています。
参考: AWSのアーキテクチャとフロー
上記図内で赤枠箇所の「SNS ScanResultTopic」のターゲットにLambda関数を設定することで、オブジェクトのスキャン後に様々なアクションを組み込むことが可能となります。
今回はマルウェアが検出時にAmazon SNSを使ってメール通知する処理をLambda関数で実装していきます。
※C1FSSが未設定の場合は、前回のブログを参考にまずは導入を行ってください。
設定手順
1. メール通知用Amazon SNS設定
マルウェア検出時のメール通知用に、Amazon SNSのトピックを作成します。
AWSマネジメントコンソールでAmazon SNSのサービス画面を開き、「トピックの作成」をクリックします。
タイプは「スタンダード」を選択し、任意の名前を付け、その他はデフォルトのまま「トピックの作成」をクリックします。
次に作成したトピックを開き、「サブスクリプションの作成」をクリックします。
プロトコルに「Eメール」を選択し、エンドポイントに「通知先アドレス」を記載し、「サブスクリプションの作成」をクリックします。
設定後、通知先アドレスにサブスクリプションの確認メールが通知されます。
このまま下図の「Confirm subscription」をクリックした場合、今後誰でもメールからサブスクリプションの解除ができる状態になってしまうため、一旦クリックせず「Confirm subscription」のURLを右クリックでコピーします。
SNSのトピックの画面から「サブスクリプションの確認」をクリックし、先ほどコピーしたURLを貼り付けて「サブスクリプションの確認」をクリックします。
これでSNSトピックの管理者しかサブスクリプションの解除ができない状態で設定が完了しました。
2. 通知処理Lambda関数の作成
次に実際の通知処理を行うLambda関数を作成します。
AWSマネジメントコンソールでLambdaのサービス画面を開き、「関数の作成」をクリックします。
「一から作成」を選択し、任意の関数名を入力します。
ランタイムは「Python 3.12(執筆時点最新)」で設定を行います。
その他はデフォルトの状態で関数を作成します。
次に実際のメール通知処理を記載した関数を作成します。
通知処理を記載したコードを以下に用意しているので、「TopicArn='<SNSトピックのARNを記載>'」この部分だけ先ほど作成したSNSトピックのARNに置き換えてもらい、Lambdaコードソース内の「lambda_function.py」にコードを貼り付け「Deploy」で保存してください。
import json
import boto3
# SNSクライアントを作成
sns_client = boto3.client('sns')
def lambda_handler(event, context):
# イベントからSNSメッセージを抽出してJSON形式にデコード
message = json.loads(event['Records'][0]['Sns']['Message'])
# マルウェアが検出されなかった場合、何もせず終了
if not message.get('scanning_result', {}).get('Findings'):
return {'statusCode': 200}
# メッセージ内容を見やすい形式にフォーマット
formatted_message = format_scan_result(message)
# フォーマットされたメッセージをSNSトピックに送信し、メール通知をトリガー
response = sns_client.publish(
TopicArn='<SNSトピックのARNを記載>', # SNSトピックのARNを指定
Subject="C1FSSマルウェアスキャン結果通知",
Message=formatted_message
)
return {'statusCode': 200, 'body': 'Notification sent successfully'}
def format_scan_result(message):
# メッセージ内容をフォーマットして見やすく整形
result = f"""
■C1FSSマルウェアスキャン結果
---------------
バケット名: {message['bucket']}
ファイル名: {message['file_name']}
スキャン結果: {message['scanner_status_message']}
■対象ファイル情報
---------------
ファイルサイズ: {message['scanning_result']['TotalBytesOfFile']} バイト
検出されたマルウェア: {message['scanning_result']['Findings'][0]['malware']}
種類: {message['scanning_result']['Findings'][0]['type']}
"""
return result
次にLambda関数を実行するトリガーを設定します。
トリガーにはC1FSS導入時に自動作成されたSNSトピックである「SNS ScanResultTopic」を指定します。
関数の概要から「+トリガーを追加」を選択し、トリガー設定で「SNS」を選択し、SNSトピックには「All-in-one-TM-FileStorageSecurity-StorageStack-XXXXXXXXXX-ScanResultTopic-XXXXXXXXXXXXX」このような名前のトピックを選択し、「追加」をクリックします。
以上でマルウェア検出時の自動メール通知設定が完了になります!
動作確認
では実際にEICARファイルをアップロードし、自動メール通知が届くことを確認してみましょう。
EICARファイルは以下のサイトよりダウンロードが可能です。
各製品共通テストウイルス
※ダウンロード時は作業PCにインストールされているウイルス対策ソフトを一時的にオフにする必要があります。
実際にEICARファイルを対象のS3バケットにアップロードしてみると...
しっかりマルウェア検出の自動メール通知が届きました!
▼サンプルの文面
■C1FSSマルウェアスキャン結果
---------------
バケット名: denet-blog-test-bucket
ファイル名: eicar4.com
スキャン結果: successful scan
■対象ファイル情報
---------------
ファイルサイズ: 68 バイト
検出されたマルウェア: Eicar_test_file
種類: Virus
さいごに
まず今回はC1FSSでマルウェアを検出した際に、自動でメール通知する設定方法をご紹介させてもらいました。
これで、マルウェア検出時は運用チームへ迅速なアラート通知が行えるようになるので、早期対応が可能となります!
運用チームが無い場合は...?24時間365日対応できない場合は...?結局手動で対応いるの...?
安心してください。次回12/19(木)のアドベントカレンダーでマルウェア検出時の自動隔離設定について解説します!
以上、最後までありがとうございました。
セキュアで良いクリスマスを!
運用サービス課 課長
運用・監視の設計から導入まで、運用サービスを担当してます。
運用監視やセキュリティ関連の話題に興味があるので、そのあたりのブログを多めで投稿していきたいと思ってます。
LINK
クラウドベリージャム:プロフィールページ