じゅのぶろ

社内SEが自宅でSOC/CSIRTするために色々頑張っていきたいブログ 画像が見れない場合はjavascriptを有効にするかデスクトップからご覧下さい。

SplunkでREGEXとFORMATを使ったフィールド抽出

きっかけ

SquidSSL-Bumpを設定し証明書情報をロギングできるようになったのですが、
以下のようにssl_cert_issuerとssl_cert_subjectのフィールド値に複数の属性が入っており、 値を検索しづらいため、 transformsのREGEXとFORMATを使い正規表現で各属性をフィールド抽出してみました。

#ssl_cert_subject
/C=JP/ST=Tokyo/L=Chiyoda-ku/O=Yahoo Japan Corporation/OU=EDGE_20190131/CN=*.yahoo.co.jp
/C=US/ST=California/L=Mountain View/O=Google LLC/CN=*.google.com

REGEXでフィールド抽出する際は2通りの方法があり、
1. 名前付きキャプチャグループを使うか、
2. キャプチャグループとFORMATを使うかです。
今回はREGEXとFORMATを使い、正規表現でマルチバリューのフィールド抽出方法をご紹介します。

名前付きキャプチャグループを使ったフィールド抽出は以前の記事を参考にしてみてください。

各属性について

略名 名称 意味 例1 例2
CN Common Name サイトドメイン *.google.com *.yahoo.co.jp
C Country 国コード US JP
ST State or Province Name 州、都道府県 California Tokyo
L Locality Name 区市町村 Mountain View Chiyoda-ku
O Organization Name 組織名 Google LLC Yahoo Japan Corporation
OU Organization Unit 織部 EDGE_20190131

各属性の名称は以下のサイトを参考にさせていただきました。

certs.nii.ac.jp

属性のフィールド抽出

各属性は「/」と大文字の略名で始まり、「=」をデリミタとしてKey, Valueのペアとなっています。
本来は「ssl_cert_subject_c」、「ssl_cert_subject_cn」などとキーごとに分けたかったのですが、マルチバリューのほうが、簡単に設定でき、使い勝手も良さそうなので「ssl_cert_subject_mv/ssl_cert_issuer_mv」としてマルチバリューで抽出することにしました。

適用した設定

先に設定を記載すると、以下のようになりました。

props.conf

REPORT-SslCertSubject = TRANSFORMS-SslCertSubject
REPORT-SslCertIssuer = TRANSFORMS-SslCertIssuer

props.confの内容は検索時のフィールド抽出なので 「REPORT-」から初めて各フィールド名を使いました。 「TRANSFORMS-略」で以下のtransformsに設定した内容を参照しています。

transforms.conf

[TRANSFORMS-SslCertSubject]
SOURCE_KEY = ssl_cert_subject
REGEX = ([A-Z]+)=([^/]+)
FORMAT = ssl_cert_subject_mv::$2
MV_ADD = true

[TRANSFORMS-SslCertIssuer]
SOURCE_KEY = ssl_cert_issuer
REGEX = ([A-Z]+)=([^/]+)
FORMAT = ssl_cert_issuer_mv::$2
MV_ADD = true

SOURCE_KEYにフィールド抽出元のフィールド名を記載します。
REGEXで=の前後をグループ化します。 FORMATで最初のキャプチャは$1、次のキャプチャは$2として使うことができます。
今回は$1の値は捨ててしまいます。 $2の値を「ssl_cert_subject_mv/ssl_cert_issuer_mv」に追加します。
MV_ADDをtrueに指定することで上記REGEXのマッチ結果をマルチバリューとして保持できるようになります。
falseの場合は複数回マッチしたとしても最初の値のみ保持されるシングルバリューフィールドになってしまいます。

設定後のフィールドはこんな感じです。
ssl_cert_*からマルチバリューで抽出設定後の画面

マルチバリューの利点

マルチバリューの利点として、どれか一つの値にマッチすれば結果を返してくれるという点があります。 つまり、先程説明した証明書の属性(CN, C, OUなど)を意識することなく検索ができるようになります。
どの属性に一致したかは情報としてなくなってしまいますが、元のフィールド「ssl_cert_subject/ssl_cert_issuer」を確認すればわかります。
以下は両方同じ結果となります。

CNの値で検索した例

CNの値で検索した例

OUの値で検索した例

OUの値で検索した例

当初想定していた「ssl_cert_subject_c」、「ssl_cert_subject_cn」と属性ごとにフィールドを作るより 設定やフィールド数がシンプルで済むうえ、検索も属性を意識することがなくなり満足です。

これらの設定をGitHubのappにも追加しました。
github.com