Splunk EnterpriseでAWSのVPC Flow Logsを可視化してみた

Kinesis,Splunk,VPC Flow Logs,セキュリティ,フローログ

こんにちは。プラットフォーム技術部の森内です。

みなさん、セキュリティ対策していますか?先日社内のコンプライアンス研修を受講したのですが、改めて「情報セキュリティ」の重要さを実感しました。意識変革や行動変容につなげるには、定期的な啓発が大事ですね。

不正ログインやサイバー攻撃を受けたときに、すぐに気がつけば被害を最小限にできますが、気がつかなければ地獄です。一度情報漏えいしてしまうと、信用を回復するのはとても大変なことです。昨今、個人情報漏えいのニュースも多く、セキュリティ強化は必須になっています。

さて今回は、Splunk Enterpriseを使って、AWSのVPC Flow Logsから攻撃元やどのポートに対してアタック(スキャン)されているかを可視化してみたいと思います。VPC Flow LogsをSplunkに自動で取り込む方法と合わせてご紹介します。

VPC Flow Logsとは

VPC、サブネット、またはネットワークインターフェース単位でIPトラフィックの情報をキャプチャーできるようにするAWSの機能です。ネットワーク モニタリング、フォレンジック、リアルタイム セキュリティ分析など、さまざまな用途で活用できます。ただし、tcpdumpやWiresharkのようにパケットの中身までは記録されません。

こちらがフローログレコードのサンプルです。(デフォルトのバージョン 2)

2 123456789010 eni-111 192.0.2.1 203.0.113.1 8080 52945 6 185 141918 1621655728 1621655787 ACCEPT OK
2 123456789010 eni-222 203.0.113.2 192.0.2.2 443 55528 6 1 40 1621655728 1621655787 REJECT OK

フローログの詳細はこちらを参照ください。

今回構築する構成

  • Splunk Enterprise 1台
    • OS:Amazon Linux release 2
    • Splunk Enterprise:8.2.0
    • Splunk Add-on for AWS:5.0.3
  • Amazon VPC(フローログ)
  • Amazon CloudWatch Logs
  • Amazon Kinesis Data Streams

Splunk Enterpriseは1台構成ですが、性能(日次で扱うログデータ量や利用者数)や可用性などに応じて分散構成にすることも可能です。また、AWS IAM(適切な権限のユーザーとロール)の詳細はここでは割愛します。

Splunk EnterpriseにVPC Flow Logs(今回はVPC)のログを自動で取り込むために、以下のように連携します。

Splunk Enterpriseへのログの取り込み(概要)

Amazon Kinesis Data Streamsの作業

まず始めに、Amazon Kinesis Data Streamsを構築します。AWS マネジメントコンソールの[Amazon Kinesis]のページから、[Kinesis Data Streams]を選択して、[データストリームを作成]をクリックします。「データストリーム名」に任意の名前を入力します。このデータストリーム名は、後続の作業で利用しますのでメモしておきましょう。「開いているシャード」は、Kinesis Data Streamsに取り込むデータ量に応じてサイジングが必要ですが、ここでは最小の1にします。

Amazon Kinesis Data Streamsの作業_01

[データストリームの作成]をクリックし、しばらく待つとKinesis Data Streamsが作成されます。

Amazon CloudWatch Logsの作業

次に、Amazon CloudWatch LogsにてVPC Flow Logsの出力先になるロググループを作成し、Amazon Kinesis Data Streamsにデータ配信します。AWS マネジメントコンソールの[Amazon CloudWatch]のページから、ロググループを選択します。[ロググループを作成]をクリックし、ロググループ名に任意の名前を入力します。それ以外はここではデフォルトとし、[作成]をクリックします。このロググループ名は、後続の作業で利用しますのでメモしておきましょう。

ロググループの作成

作成したロググループをクリックし、[サブスクリプションフィルター]を選択します。[作成]から[Kinesisサブスクリプションフィルターを作成]をクリックします。「Kinesis data stream」に、先ほど作成したデータストリーム名を選択します。

Kinesis サブスクリプションフィルターの作成01

「Grant permission」に、Amazon CloudWatch LogsからAmazon Kinesis Data Streamsに出力できるロールを選択します。

Kinesis サブスクリプションフィルターの作成02

「ログの形式」は、Amazon VPC フローログを選択します。「サブスクリプションフィルター名」に任意の名前を入力します。

Kinesis サブスクリプションフィルターの作成03

[ストリーミングを開始]をクリックします。

Amazon VPC(フローログ)の作業

続いて、AWS マネジメントコンソールの[VPC]のページから、VPCをクリックします。フローログを取得するVPCを選択し、フローログタブをクリックします。[フローログを作成]をクリックします。「名前」に任意の名前を入力します。「フィルタ」はここでは[すべて]にチェックします。「最大集約間隔」はここでは[1分間]にチェックします。「送信先ロググループ」に先ほど作成したロググループ名を選択します。「IAMロール」にAmazon CloudWatch ロググループへのアクセス権があるロールを選択します。

フローログの作成01

[フローログを作成]をクリックします。

Splunk Enterpriseの作業

最後にSplunk Enterpriseを構築します。今回は、AWS Marketplaceで提供されているSplunk Enterpriseを利用します。インスタンスを起動するだけで、Splunk Enterpriseがすぐに利用できますので、詳細は割愛します。

Splunk Enterpriseのデプロイ

Amazon Kinesis Data Streamsに配信されたVPC Flow LogsをSplunk Enterpriseに取り込むために、「Splunk Add-on for Amazon Web Services」をインストールします。Splunk EnterpriseのWeb管理画面(http://<SplunkのIPアドレス>:8000/)にアクセスします。

username: admin

password: SPLUNK-$instance id$

Splunk docs

[+他のAppのサーチ]から、[Splunk Add-on for Amazon Web Services]を検索し、インストールします。

Splunk Enterpriseの構築01

※事前にSplunk.comのアカウント登録(無料)が必要になります。

VPC Flow Logs用のインデックスを作成します。SplunkのWeb管理画面の[設定]から[インデックス]をクリックします。[新規インデックス]をクリックし、インデックス名を任意の名前(ここでは aws_vpc_flow_logs としました)を入力し、保存をクリックします。

[App]から、「Splunk Add-on for AWS」- [設定]タブをクリックします。Accountの[追加]をクリックし、「Amazon Kinesis Data Streams」にアクセスできるIAMユーザーの情報を入力し[追加]をクリックします。

Splunk Enterpriseの構築02

[入力]タブをクリックします。[Create New Input]からVPC Flow LogsのKinesis(Recommended)をクリックします。「名前」に任意の名前を入力します。「AWS Account」、「AWS Region」は環境に合わせて適切な値を選択します。「Stream Name」は、AWS Account、AWS Regionを入力すると、データストリーム名が選択できます。「インデックス」は、先ほど作成したインデックス名(aws_vpc_flow_logs)を選択します。[保存]をクリックします。

Splunk Enterpriseの構築03

これでSplunk EnterpriseでのVPC Flow Logsの取り込みは完了です。

VPC Flow Logsの可視化

それでは、Splunk Enterpriseに取り込んだフローログを可視化していきます。まずは、Splunk EnterpriseにVPC Flow Logsが取り込めていることを確認します。SplunkのWeb管理画面の[Search & Reporting]をクリックします。「サーチ」に以下の値を入力し、検索ボタンをクリックします。

  • サーチ: index="aws_vpc_flow_logs"
  • タイムレンジピッカー:全時間
VPC Flow Logsの可視化01

検索結果が表示されるので、問題なく取り込めていますね。

続いてセキュリティ分析をしていきます。以下の3つを可視化してみようと思います。

  • Top Rejected Destination Ports
  • Top Rejected Source Addresses
  • Accepted vs. Rejected Traffic by Location

最初は、Top Rejected Destination Ports を見てみましょう。拒否された通信の相手先ポートを多い順に並べます。

サーチ文サンプル
index="aws_vpc_flow_logs" | stats sum(packets) as packets by vpcflow_action dest_port
                        | eval ACCEPT=if(vpcflow_action="ACCEPT", packets, 0) | eval REJECT=if(vpcflow_action="REJECT", packets, 0) | stats sum(ACCEPT) as ACCEPT sum(REJECT) as REJECT by dest_port
                        | sort 10 -REJECT
                        | eval Ratio=if(ACCEPT=0 and REJECT = 0, "- - -", round(REJECT/(ACCEPT+REJECT), 2))
                        | sort -Ratio
                        | fields - count
                        | rename dest_port as "Destination Port", REJECT as Rejections, ACCEPT as Acceptions
                        | table "Destination Port", Rejections, Acceptions, Ratio
VPC Flow Logsの可視化02

445ポートへの不正なアクセスが一番多いことがわかります。続いて、Top Rejected Source Addresses を見てみましょう。拒否された通信の通信元のIPアドレスを多い順に並べます。

サーチ文サンプル
index="aws_vpc_flow_logs" | stats sum(packets) as packets by vpcflow_action src_ip | eval ACCEPT=if(vpcflow_action="ACCEPT", packets, 0) | eval REJECT=if(vpcflow_action="REJECT", packets, 0) | stats sum(ACCEPT) as ACCEPT sum(REJECT) as REJECT by src_ip | sort 10 -REJECT | eval Ratio=if(ACCEPT=0 and REJECT = 0, "- - -", round(REJECT/(ACCEPT+REJECT), 2))
                        | sort -Ratio
                        | fields - count
                        | rename src_ip as "Source IP" REJECT as Rejections, ACCEPT as Acceptions
                        | table "Source IP", Rejections, Acceptions, Ratio
VPC Flow Logsの可視化03

送信元IPアドレスが203.0.113.1からの不正なアクセスが一番多いことがわかります。

最後に、Accepted vs. Rejected Traffic by Location を見てみましょう。送信元IPアドレス毎にアクセス量やACCEPT(青色)/REJECT(緑色)された通信なのかを地図上に表示してみます。

サーチ文サンプル
index="aws_vpc_flow_logs" | stats sum(packets) as packets by vpcflow_action src_ip 
                        | iplocation src_ip 
                        | geostats sum(packets) by vpcflow_action
VPC Flow Logsの可視化04

Splunk標準の地図以外にも、例えば、Google Mapなども利用できます。Cluster Mapのフォーマットからタイルをクリックし、URLに以下のGoogleのタイルサーバーのアドレスを指定します。

http://mt3.google.com/vt/lyrs=m@114&z={z}&x={x}&y={y}

VPC Flow Logsの可視化05

今回の地図では、円が大きくて(アクセス量)、緑色(REJECT)の割合が多ければ、不正なアクセスをしている可能性が高くなります。

ついでに、送信元IPアドレスのアクセス数を国ごとに地図上に色分けもできます。コロプレスマップを使います。

サーチ文サンプル
index="aws_vpc_flow_logs" | iplocation src_ip 
                        | stats count by Country
                        | geom geo_countries featureIdField=Country
VPC Flow Logsの可視化06

日本とアメリカからのアクセスが多いですね。パブリックIPアドレスであれば、このようにすぐに地図を使ったグラフを表示できます。プライベートIPアドレスの場合は作りこみが必要になります。

最後に

Splunk EnterpriseでVPC Flow Logsを可視化してみました。最初にご紹介したフローログレコードのサンプルが、表やグラフなどになると視覚的にもわかりやすくなりますね。検索エンジンのように、Splunk Enterpriseに収集したログは柔軟に検索できます。サーチした結果を表示するダッシュボードを自作しておけば、いつでもこのようなグラフや表にアクセスできます。

また、基準を超える接続を異常としてメール通知することなどができるので、リアルタイムにセキュリティインシデントに気づくことができます。ぜひ試していただければと思います。Splunk Enterpriseのサーチ文やダッシュボードを一から作るのが難しい場合は、SIEM製品であるSplunk Enterprise Securityが便利です。分析ストーリーなども用意されていますので、特定の脅威の検知、調査、レスポンスなども手軽に実装できます。

セキュリティ対策やAWS環境についてお悩みがあれば、お客様のご要望に応じて最適なシステム構成を提案させていただきますので、お気軽にご相談ください。

  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix