Splunk で検索結果をフィルタリングする Where の様々な使い方
本ブログの参考元:Search Reference - where | Splunk Docs
whereコマンドの基本と役割
Splunkのwhereコマンドは、検索結果に対して条件を適用し、特定の条件を満たすデータのみをフィルタリングするために使用します。ログは大量に出力されるので、where を使わずイベント検索するのは砂漠で針を探すようなものですので、本記事の内容が必要なデータの検索に役立てば幸いです。
whereコマンドの概要
whereコマンドは、検索クエリの中でフィールド値を評価し、その結果に基づいてデータを絞り込むために使用します。
右が where を使って SPL を書いた例です。赤枠にご注目ください、status_code フィールドが 4xx, 5xx のものだけを検索結果とするように where でフィルタリングしてくれています。
whereコマンドの基本構文
パイプ(|)で前述の処理に繋げて where eval表現として作成します。以下に構文を表示します。
where <eval-expression>
これで基本的には、フィールドの特定の値に基づいたフィルタリングが可能になります。以下に例を表示します。
| where status_code=503
これにより、status_code が 503 の条件に一致するイベントだけを抽出します。
このように必要なデータに絞り込むことで、詳細な分析やレポート作成が可能になります。
search コマンドとの違い
where コマンドは search コマンドと使い方が似ています。
両方とも、ログをフィルタリングしますが、大きな違いとしては、search は検索の事前フィルタリングに使用し、where はパイプ(|)で繋げて後処理に使用することが多いです。
where の場合、eval 式で計算した結果を保持しているフィールドを使ってフィルタリングしたり、正規表現を使って詳細にフィルタリングすることもできます。
whereコマンドの具体的な使い方
where コマンドの使い方は様々ありますが、まずは基本的な使い方を4つ説明します。Apache の Access ログを題材に具体例と共にお伝えします。
数値フィールドの条件付きフィルタリング
1つ目の使い方。数値フィールドを対象にしたフィルタリング方法を説明します。
例えば「クライアント PC の要求にかかったレスポンスが 360 秒以上のものを探したい。」みたいなときは次のように、数値フィールドに対して条件を指定します。
| where response_time > 360
この様に不等号を使用して数値フィールドをフィルタリングできます。
文字列フィールドの条件付きフィルタリング
2つ目の使い方。文字列フィールドを対象にしたフィルタリング方法を説明します。
例えば「特定の uri へのアクセスイベントに絞ってログを探したい。」みたいなときは次のように文字列を二重引用符で囲み、条件を指定します。
| where uri_path="/cart/success.do"
正規表現を使ったフィルタリング
3つ目の使い方。match 関数を使った正規表現によるフィルタリング方法を説明します。
例えば「status_code が 4xx,5xx エラーに該当するイベントに絞ってログを探したい。」というときは、match という関数を呼び出して条件を指定します。
| where match(status_code, "^[45]")
match(フィールド, 正規表現) という並びで書いていますが、公式ドキュメントには match(<string>, <regex>) と書かれており、<string> が <regex> とマッチするか評価しています。
そのため、次の様に文字列で status_code が 404 であるログに絞ることもできます。
| where match("404", "^[45]")
実は、where には match() のような__評価関数__が豊富に用意されており、条件の指定方法も様々です。評価関数については Evaluation functions | Splunk Docs をご確認ください。
正規表現については About Splunk regular expressions | Splunk Docs をご確認ください。
複数条件の組み合わせ
4つ目の使い方。ANDやORを使った複数条件の組み合わせ方を説明します。
例えば「GET リクエストかつ、response_time が 500ms 以上のログを探したい。」というときは次のように AND を使って条件を連結します。
| where request_method="GET" AND response_time > 500
このように複数の条件に一致するイベントにフィルタリングできます。
whereコマンドの活用例
検索パフォーマンス改善
Splunk は複数製品のログを取り込み、相関分析をするのに最適な SIEM 製品ですが、もちろん分析対象のログが増える分、ログ検索のパフォーマンスが悪くなることもあるかもしれません。もし、普段のログ検索の中で結果が返ってくるまでに時間がかかるようでしたら、where で検索対象のログを絞り込んでみてください。
他にも、キーワード検索や、search コマンドの活用も検索パフォーマンスの改善に寄与する可能性があります。
ログ分析でのフィルタリング
またまた Apache のログでお伝えしますが、例えば WEB サーバを標的とした攻撃手法で「スキャニング」というものがあります。
攻撃者が、特定のファイル名やディレクトリ名を推測しながらリクエストを送り、存在するリソースを特定しようとします。その際に多数の 404 エラーがログに記録される可能性があります。そんな時、以下の様に where で status_code を絞れば簡単に必要なデータを検索できます。
これがもし、十数分に数百件以上も観測した場合は怪しい bot が潜んでいる可能性があります。このように SIEM でログ分析することで、攻撃の兆候を読み取れます。
まとめ
シンプルに where の基本的な使い方をお伝えしてきましたが、いかがでしたでしょうか?
ダッシュボードなどを作成していくと複数のフィルタリング条件を設けて必要なデータのテーブルなどを準備しておきたかったりするので、頻繁に使用することになると思います。
今後も必要と感じた where コマンドの使い方を投稿していきますのでご注目いただけると幸いです。