SplunkでREGEXとFORMATを使ったフィールド抽出
きっかけ
SquidでSSL-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 |
各属性の名称は以下のサイトを参考にさせていただきました。
属性のフィールド抽出
各属性は「/」と大文字の略名で始まり、「=」をデリミタとして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の場合は複数回マッチしたとしても最初の値のみ保持されるシングルバリューフィールドになってしまいます。
設定後のフィールドはこんな感じです。
マルチバリューの利点
マルチバリューの利点として、どれか一つの値にマッチすれば結果を返してくれるという点があります。
つまり、先程説明した証明書の属性(CN, C, OUなど)を意識することなく検索ができるようになります。
どの属性に一致したかは情報としてなくなってしまいますが、元のフィールド「ssl_cert_subject/ssl_cert_issuer」を確認すればわかります。
以下は両方同じ結果となります。
CNの値で検索した例
OUの値で検索した例
当初想定していた「ssl_cert_subject_c」、「ssl_cert_subject_cn」と属性ごとにフィールドを作るより 設定やフィールド数がシンプルで済むうえ、検索も属性を意識することがなくなり満足です。
これらの設定をGitHubのappにも追加しました。
github.com