8割解けるCTF「WEST-SEC」

セキュリティ初心者の方でも楽しめるゲーム形式のセキュリティイベント。CTFや勉強会の依頼があればご相談ください。

splunk

1.Splunkについて

1.1 Splunk社について

・SIEM市場ではリーダ的存在
・本社:米国カリフォルニア州サンフランシスコ
 日本にも会社がある。大手町のC6aの出口から8階へ。今度、イベントで利用させていただきます。

フリードリンクみたいです

・2003年設立
・従業員数:約 8,000 名
・2024決算:売上約42億
・顧客:110 カ国以上 / 18,000 社以上

splunk の語源はspelunking(洞窟探索)。Yahooのエンジニアが、あちこちに散らかっているログを簡単に検索したいという思いからできた(らしい)。

1.2 Splunkの機能について

・操作性が高いSEIM
・ネット検索はGoogleが便利なように、社内のログ分析はSplunkが便利
・サーバなどのログだけではなく、社内のありとあらゆるデータ検索としても使える様子(使ったことがないので、詳しいことは不明)
・Splunkサーチ言語(SPL)を使う

・機能は、ログを取り込み、検索ができ、監視してアラートを送り、分析してレポートを出す、など。

2.Splunkの操作

2.1 ログイン

(1)ページにアクセス
AWSのインスタンスで作成した場合、以下のようにFQDN(またはIPアドレス)と8000番ポートで接続する。
http://203.0113.107:8000

(2)IDパスワードの入力 
IDとパスワードを入力してログイン。
AWSの初期設定場合は以下

ユーザ名 admin
パスワード SPLUNK-インスタンスID (例)SPLUNK-i-056c21axxx

すると、ホーム画面が表示される。

2.2 管理設定

(1)環境面などの初期設定

❶タイムゾーン
上部の Administators > 基本設定 を選択。

タイムゾーンをGMT+9にする。

❷パスワード
Administators > アカウント設定
 ここで、パスワードを変更しよう。

(2) ユーザの管理

❶ユーザ作成
a)設定 > 「ユーザーと認証」カテゴリの ユーザー
b)右上の「新規ユーザー」からユーザを作成できる。
c)名前とパスワードなどを入れ、ロールを選択する。

d)保存すると、ユーザが作成され、一覧が表示される。

❷ユーザの編集
・上記の画面にて、パスワードの変更や、ロール(権限)の変更を行う。
・たとえば、管理者であるadminであっても、delete権限(can_delete権限)は持っていない。間違ってデータを消すととんでもないことになるからだ。データを消したい場合、必要に応じて、can_delete権限を追加する

(3)必要に応じて設定

・以下、設定 > システム > サーバー設定 から設定ができる。

たとえば、その中の全体設定にて、Webポート(現在は8000)を変更することも可能

2.2 ライセンス

求める機能や分析するログに応じてライセンスを入れる必要がある。

(1)基本のライセンス

設定 > 「システム」の「ライセンス」 にて、右上の「ライセンスグループの変更」を押すと、以下が表示される。

基本的にはEnterpriseライセンスを使うことになるでしょう。

ライセンスの種類 内容
Enterpriseライセンス 通常のライセンス
フォワーダライセンス Splunkをフォワーダーとして設定する場合。具体的には、別のSplunkに転送する場合。このライセンスを入れるSplunkには、転送用のエージェントとしてUniversal Forwarder (UF) やHeavy Forwarderというエージェントを使用します。
フリーライセンス ライセンス不要のフリーライセンスです。制限として、1日あたりのログ容量が500MB、ユーザやロール権限を作れない、機能制限があるなどです。
Enterpriseトライアルライセンス トライアルなので、60日間しか利用できない。ログ容量はフリーと同じ1日500MB。60日過ぎるとフリーライセンスになり、ログインも無しになり、機能も制限される。
(2)追加のアプリケーション

・ログフォーマットは製品によって変化する。Splunkでも、デフォルトでは90ほどのログパターン(pretrained source types)を持っている。なので、Linuxの標準的なaccess.log、/var/log/secureであったり、Apacheのログである/var/log/httpd/access_logを分析する場合は、自動でログフォーマットを選んでくれる。
・参考情報は以下です。

デフォルトsourcetype (pretrained source types) 90個
自動で認識できるsourcetype (Automatically recognized source types) 26個

詳細はここに記載がありますが、デフォルトのログパターンは以下です。

Category Source types
Application servers log4j, log4php, weblogic_stdout, websphere_activity, websphere_core, websphere_trlog, catalina, ruby_on_rails
Databases db2_diag, mysqld, mysqld_error, mysqld_bin, mysql_slow
E-mail exim_main, exim_reject, postfix_syslog, sendmail_syslog, procmail
Operating systems linux_messages_syslog, linux_secure, linux_audit, linux_bootlog, anaconda, anaconda_syslog, osx_asl, osx_crashreporter, osx_crash_log, osx_install, osx_secure, osx_daily, osx_weekly, osx_monthly, osx_window_server, windows_snare_syslog, dmesg, ftp, ssl_error, syslog, sar, rpmpkgs
Metrics collectd_http, metrics_csv, statsd
Network novell_groupwise, tcp
Printers cups_access, cups_error, spooler
Routers and firewalls cisco_cdr, cisco:asa, cisco_syslog, clavister
VoIP asterisk_cdr, asterisk_event, asterisk_messages, asterisk_queue
Web servers access_combined, access_combined_wcookie, access_common, apache_error, iis*
Splunk software splunk_com_php_error, splunkd, splunkd_crash_log, splunkd_misc, splunkd_stderr, splunk-blocksignature, splunk_directory_monitor, splunk_directory_monitor_misc, splunk_search_history, splunkd_remote_searches, splunkd_access, splunkd_ui_access, splunk_web_access, splunk_web_service, splunkd_conf*, django_access, splunk_help, mongod
Non-log files csv*, psv*, tsv*, _json*, json_no_timestamp, fs_notification, exchange*, generic_single_line
Miscellaneous snort, splunk_disk_objects*, splunk_resource_usage*, kvstore*

・ここにないフォーマットは追加するほうが便利だ。ログが整形されるので、見やすくなる。たとえば、FortiGateのログを分析するには、Fortinet FortiGate Add-On for Splunkをインポートする。追加せずに、自分でフォーマットを作ることもできるが、入れておいた方が楽だろう。
また、Splunk Add-on for Unix and Linuxというのがあるが、これは、自分のサーバの情報が分析できる。
・ユーザ登録が必要である。ただ、登録とその後の利用料は無料。
・操作方法は以下。
a)左上のApp > Appの管理 > 他のAppを参照
b)検索窓に文字を入力。以下はLinuxと入れた場合

c)アプリケーションを入れると再起動が聞かれるので、再起動
・参考までに、以下は、splunkbaseは拡張機能を提供するページ
https://splunkbase.splunk.com/
何を取り込めばいいのかの情報が入っている。

2.2 ログの取得方法

どうやってSplunkにログをためるか、方法は3つある。
(1)ログファイルをSplukにインポート
(2)Syslogサーバのように、筐体からSplunkにSyslogログを転送 【非推奨。クラウドのSpluk不可】
(3)サーバや筐体にエージェントを入れて、エージェント経由でSplunkに送る

最も多いのは(3)であろう。Syslogに比べて正確な情報が収集できる。
環境はクラウドとオンプレがある。クラウドのSplunkでは、Syslogを直接受けることができない。かつ、データの整合性などの観点から非推奨。以下の資料のp33に詳細解説あり。
https://www.splunk.com/ja_jp/pdfs/technical-briefs/splunk-validated-architectures.pdf

エージェントは以下からダウンロード。アカウントが必要だが、エージェントの費用そのものは無償
https://www.splunk.com/ja_jp/download/universal-forwarder.html

(1)ログをSplunkにインポート

a) 設定 > データの追加 の大きいボタンを押す

b) アップロード コンピュータファイルからを押す

c)ソースの選択で、アップロードしたいファイルを選択する

d)次へを押してソースタイプの設定
ソースタイプを適切に選ぶ必要がある。そうしないと、スペースなどの区切り位置が適切でなかったりして、うまく検索ができない。
自動で選べるフォーマットが40くらいあり、今回Linuxのaccess.logの場合は、ソースタイプがaccess_combined_wcookieが自動で選ばれた。ログによっては違うタイプが選ばれる可能性がある。
※独自のログフォーマットにも対応できる。カンマ区切りのファイルなどは、自分で作るのがいいかもしれない。
e)次へと進んでいくと、ログがアップロードされる
f)サーチ開始を押すと、以下のフィルタが適用されて、ログの分析ができる
source="access.log" host="xxxxx" sourcetype="access_combined_wcookie"

その他
・不要なログを取り込んでしまって消したいときは、deleteコマンドを使う。

(2)Splunkのサーバのログをインポート

Splunkサーバにログがある場合に、そのログをインポートできる。
a)設定 > 「データ」の「データ入力」
b)「ファイルとディレクトリ」で「+新規追加」
c)ここで、ファイル名を指定する。または、「参照」ボタンを押して、ファイルを直接指定する。
【error】
ファイル名までを指定したらうまくいかなかった。以下のエラーになる。

→Splunkが動いているユーザのパーミッションの関係であろう。
以下、Splunkが入っているLinuxで/var/log/secureのパーミッションを見ると、rootにしか権限が付与されていない

# ls -la /var/log/secure
-rw------- 1 root root 67792 Mar  4 05:00 /var/log/secure

そこで、他のユーザ(Splunkが動かしているのはsplunkというユーザ)にも読み取り権限を付与する。

chmod o+r /var/log/secure

すると、以下のように、「参照」ボタンで、/var/log/secureが選べるようになる。

(3)筐体からのログをSyslogで転送

SplunkをSyslogサーバとして、Syslogプロトコルを使ってログを送ります。
a)設定 > 「データ」の「データ入力」
b)今回はSyslogサーバのUDP514ポートで送信したいので、「UDP」を選び、「+新規追加」

【error】
うまくいかなかった。以下のエラーが出る。
もしかしたら514ポートは使っているかもしれないと思い、ポートを変えれば作成できた。
konchangakita.hatenablog.com

(4)エージェントと連携❶Windows

Windowsサーバにエージェントを入れる。そして、ログをSplunkに転送して一元集約する。
エージェントは、ユーザ登録すれば無料で手に入る。
手順は以下を参考
https://konchangakita.hatenablog.com/entry/2020/11/02/210000
❶Splunkで使うポートをAWSであける
若干よくわかっていないが、Splunkでは9997と8089ポートでイベントログを受け付けるみたい。
なので、AWSのセキュリティグループにて、9997と8089を開けた
❷エージェントの入手
・フォワーダーというのかもしれない。
・splunkのアカウント(無料登録)でログイン後、下記からダウンロードが可能。windows、linux、Mac版などがある。
https://www.splunk.com/en_us/download/universal-forwarder.html?utm_campaign=google_apac_tier1_jpn_en_search_brand&utm_source=google&utm_medium=cpc&utm_content=Uni_Forwarder_Demo&utm_term=splunk%20universal%20forwarder&device=c&_bt=659176422122&_bm=p&_bn=g&gad_source=1&gclid=Cj0KCQjww5u2BhDeARIsALBuLnOs8PunT3NMMYXaPSKurk_FE4VACQzGgaDcVP6ZVyjdPET88nG0uKcaAsYVEALw_wcB&locale=en_us
❸エージェントのインストール
a)インストーラを起動し、「customize options」を選択

b)次へで進んでいくが、
Certificate Passwordは無しでいい。デフォルトのまま進む。(Virtual Accountのまま)
c)転送するログの選択
とりあえず、全てにチェックを入れた。

d)ユーザを作成する必要があるので、任意の名前で作成。パスワードを入れなかった。どうなったんだろう・・・。実際には使わなかった。

e)splunkのdevloyment serverのIPアドレスとポートを入れる。デフォルト8089のままにした。

f)同様に、recieving indicatorも入れる。こちらもサーバは同じなのでIPアドレスは先と同じ。ポートはデフォルト9997

❹Splunk側の設定
・右上の「設定」データ入力を開き、Windowsイベントログで、「新規追加」

・以下の状態だと、まだエージェントからログが上がってきていない。

・しばらくすると(5分くらいかな)、以下のようにサーバが認識される

新しいサーバークラス名 を入れる

・受信するイベントログを選択。今回はすべてを選択した。

・分けなくてもいいが、ログをわかりやすくするために、インデックスを作った。

・確認→実行→サーチ開始
❺ログの確認
サーチ開始でログを見るが、莫大なログがあがってくる。ユーザ追加や、ログインなど、ルールを決めておかないと大変である。

(5)エージェントと連携❷Linux
tar zvxf splunkforwarder-9.3.0-51ccf43db5bd-Linux-x86_64.tgz
cd splunkforwarder/
cd bin
./splunk start --accept-license --answer-yes
cd /root/splunk/splunkforwarder/etc/apps/
mkdir -p splk_all_forwarder_base/local

ここで、以下に記載がある4つのファイルを作成する。
https://qiita.com/saeoshi/items/e7e618ea7d8f64cf86f6
app.conf
limits.conf
outputs.conf →Splunkサーバの設定
inputs.conf

2.3 検索およびフィルタ

(1)検索機能の概要

Splunk ホーム画面にて、左側App欄の[Search & Reporting]をクリック。
検索窓に文字列を指定することで、各種のフィルタや検索ができる。

❶ログデータを見る
検索窓に「index=main」を入力して検索。索引としてindexを何か指定する必要がある。わからなければ、index=*でも表示可能。参考だが、indexは設定 > データ > インデックスから行う。

デフォルトだと、選択されたフィールドとして以下の3つがある

選択されたフィールド 内容
host ログを取得したホスト名またはIPアドレス
source ログのファイル名
sourcetype ログのタイプというか種類

❷GUIを活用する
コマンドで操作するより、GUIでの操作が便利である。
左側の条件をクリックして条件を絞っていく。
たとえば、特定のログファイル(access.log)のみを分析するには、そのログをダブルクリックする。

すると、access.logのみに絞られる。また、上位の検索窓には以下が表示される。

index=main source="access.log"

❸単にキーワードを入れても検索してくれる
たとえば、検索窓に文字を入れると、その文字で検索してくれる。以下は、yahooの文字で検索

index=main source="access.log" yahoo

❺時間の指定
右上の緑の虫眼鏡マークの左にあるボタンで選択。「全期間」を選択すると、すべてのログを表示する。
時間の設定のデフォルトを「全期間」に変更したかったが、そうするとサーバのスペックに莫大な負荷がかかるようで、GUIからは設定できなかった。設定ファイルを修正する必要あるだろう。

(2)条件の書き方の基本

❶単純な条件指定
・実行が失敗したログを指定
左側のフィールドで「action」を選択する。または、検索窓にaction=failure と指定する。
・送信元IPを指定する

src_ip="203.0.113.22"

ダブルクォーテーションは有っても無しでも結果は同じ

src_ip=203.0.113.22

・アスタリスク(*)も使える
form_data=*pass*

❷条件を並べる
GUIを使うとその様子が見えるが、半角スペースを入れて、条件を並べることができる。たとえば、以下

index=main source="secure.log" action=failure

❸ANDとOR
・ANDの書き方
例)AND 送信元「203.0.113.125」かつリクエストメソッド「GET」で検索
フィルタ:203.0.113.125 AND method=GET
※必ず大文字を使う
※ANDは省略してスペースでも代用可能

・ORの書き方
例)送信元「203.0.113.125」またはリクエストメソッド「GET」で検索
フィルタ:203.0.113.125 OR method=GET
※必ず大文字を使う

❹パイプ
・| の使い方
基本的な使い方はLinuxコマンドと同じ。前のコマンドの出力が次のコマンドの入力になるように繋げる。
例)index=main ログの中から「XXX.log」という名前のログで、かつ、件数がTOP10のuseragentを検索

index=main source=XXX.log | top limit=10 useragent

・パイプ(|)やANDとの違いはというと、ANDは条件を並べるなどに使う。「|」の場合、次にコマンドが来る。新しいコマンドがある場合には必ずパイプ(|)が必要。
❺カンマ
同じコマンドで複数対象選ぶ場合は , (カンマ)が使える。
例) index=main ログで「action,src」で集計し、回数でソートをかける

index=main | stats count by action, src | sort –count
(3)送信元IPアドレスでいろいろ試してみる

❶送信元IPアドレスのTop10を調べる
左側のclientip(送信元IP)をクリックすると、送信元IPのTop10が表示される。

❷「Top値」のボタンを押すと、視覚エフェクトに切り替わり、上位20のアクセス数が一覧で表示される。

このとき、検索窓は以下のようになる。つまり、GUIを使わずに、コマンドで検索をしてもいい。

index=main source="access.log"| top limit=20 clientip

❸statusが200のものを選択
statusで200をクリックする。

このとき、検索窓は以下のようになる。つまり、GUIを使わずに、コマンドで検索をしてもいい。

index=main source="access.log" status=200

❹「選択済」を「はい」にすると、上位の「選択されたフィールド」に追加される。

(4)データサマリ

以下のデータサマリボタンを押すと、データのサマリが見える。

以下、ボタンを押した結果。

もちろん、これを使わず、index=* で検索した後、SourceやSourcetypeでフィルタしてもいい。ただ、データ量が多いと時間がかかるかもしれないので、データサマリが見やすい。

2.4 基本的なサーチコマンド

コマンドの一覧とその解説
https://docs.splunk.com/Documentation/Splunk/9.2.0/SearchReference/ListOfSearchCommands

(1)statsにより統計を取る ・・・カウント(count)、平均(avg)、総計(sum)


・count,avg,sumといった関数を使用して集計
・stats [関数] by [統計を取りたい対象]
・使い方の例

関数 目的 使用例
count 数を集計する stats count by user
avg 項目をそれぞれ平均する  
sum 項目ごとに合計する  

・例)送信元IPごとに数を集計

index=main | stats count by clientip

何順で並ぶかというと、 →元のデータが置いてある上から順に並ぶ。GUIの項目の横に▼▲ボタンがあるので、このボタンによってソートも可能

・ステータスコードごとに数を集計

index=main | stats count by status
(2)項目を選んで表示 table

SQLのSELECT文のようなものです。必要な情報だけ表示します。このとき、countやaveregeなども使えます。

index=main | table clientip ,action | sort by clientip desc


・たとえば、以下のように、条件を指定しただけだと、表示項目が多い
sourcetype="stream:http" dest_ip="192.168.250.70" form_data=*pass*

そこで、表示するフィールドをform_dataだけにする
sourcetype="stream:http" dest_ip="192.168.250.70" form_data=*pass* | table form_data

(3)項目を保持したり削除 fields

・内容としては、公式サイトには「Keeps or removes fields from search results based on the field list criteria.」とある。
・Fieldsの使い方は以下
https://docs.splunk.com/Documentation/SCS/current/SearchReference/FieldsCommandExamples
・たとえば、マイナス(-)を付け、「-action」などとして、表示項目を削除できる。
・tableとfieldsとの違いが少しわかりずらいが、ネットでもそんな議論がある。
https://community.splunk.com/t5/Splunk-Search/Fields-vs-table-vs-nothing/m-p/498525
・以下、やってみた様子

index=main | fields clientip ,action | sort by clientip desc


(4)ソート(sort)

・昇順/降順に検索結果を表示させるコマンド。
・降順にするには、sortコマンド後に – (ハイフン)をつける。たとえば、sort -count や sort by -clientip。または、descを付ける。
・”count”でソートすれば回数を数えることも可能。
例) ・・ | sort -count
・clientipでソート(昇順)

index=main | stats count by clientip | sort by clientip

・clientipでソート(降順)

index=main | stats count by clientip | sort by clientip desc

・countした件数の少ない順でソート

index=main | stats count by clientip | sort count

・countした件数の多い順でソート

index=main | stats count by clientip | sort -count
(5)headとtail

・Linuxコマンドを使われている方にはなじみ深いことでしょう。headは先頭の10件、tailは後ろから10件を表示します。表示件数を指定することもできます。
・例 先頭20件を表示

index=main | stats count by clientip| head 20
(6)timechartにより時系列に統計を取るコマンド

timechart [オプション] [関数] by [統計を取りたい対象]
”span=“オプションで時間間隔を指定可能。

index=main | timechart span=1m count by clientip

注意点として、余分なスペースが入っているとだめ。
視覚イフェクトでいろいろ情報が視覚的に見える。

(7)delete

取り込んでしまったログや、ファイルそのものを消したい場合、以下のようにdeleteを使う。

index=main source="/var/log/cloud-init.log" | delete

ですが、デフォルトのままだと以下のエラーがでるでしょう。

Error in 'delete' command: You have insufficient privileges to delete events.

理由は権限です。Adminの権限であっても、削除権限は持っていません。間違ってデータを消すと大変なことになるからでしょう。ユーザの権限に、can_deleteを追加する必要があります。
そして、権限を付けた後であっても、期間も適切に指定しないと、ログが残ってしまう。

(8)eval

eval - 演算、変換などを一時的なフィールドへ出力
action=purchase | table useragent | eval len_useragent=len(useragent) 

2.5 問題

いくつかやってみよう。
簡単な問題を準備しました。
Q1.何種類のログファイルがある?
Q2.最も多い送信元IPアドレスの数は?
Q3."/var/log/secure"ファイルで、もっともログイン試行が多いユーザは?
Q4.もっともアクセス数が多い時間帯はどこ?
Q5.指定された送信元IPに対して、どの送信先destination(dest_ip)への通信が多い?