Modsecurity (3.0) + Elasticsearch + Kibanaでログを可視化する

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面 和毅です。

WAF等に用いられるModSecurityのログですが、可視化するのは意外に面倒くさいです。ここでは、ModSecurity(3.0)のログをElasticsearchに入れKibanaで可視化する方法をまとめます。具体的にはmodsecurity-to-elasticsearchのPythonスクリプトを修正して利用します。


1. 元になるスクリプトと修正

ModSecurity + Elasticsearch + Kibanaを実現するためのスクリプトとして、modsecurity-to-elasticsearch(https://github.com/theMiddleBlue/modsecurity-to-elasticsearch)が公開されていますので、こちらを利用します。

ただし、現状公開されているバージョン(2017/12/12更新版)のままですと、実行した際にエラーが出ますので、修正を加えます。


60c60
< 	d['transaction']['unixts'] = int(d['transaction']['id'][0:14].replace('.',''))
---
> 	d['transaction']['unixts'] = int(d['transaction']['unique_id'][0:14].replace('.',''))
115c115
< 	if res['created'] is True:
---
> 	if res['result'] == 'created':

のように、’unixts’となる所を’id’->’unique_id’に修正、またres[‘created’]をres[‘result’]で取得するように修正します。


2. ElasticsearchとKibanaの準備

Elasticsearch/KibanaはDebian(Stretch)を用いて構成します。現状のバージョン(6.4.3)を使用します。

Elasticsearch/Kibanaのインストール方法に関しては、ElasticsearchのサイトKibanaのサイトを確認してください。

3. ModSecurityのログ出力の修正

Modsecurityのログ出力をjson形式で一ファイルずつ出力するように修正します。modsecurity.confファイル等で(この辺はインストール方法によって変わります)


# -- Audit log configuration -------------------------------------------------
--省略--
SecAuditLogRelevantStatus "^[0-9]+"
--省略--
SecAuditLogType concurrent
SecAuditLogStorageDir /var/log/modsecurity/[好きなディレクトリ名]
--省略--
SecAuditLogFormat JSON

となるように修正します。(注)上述の/var/log/nginx/logs/modsecurity/[好きなディレクトリ名]を作成する際には、ディレクトリのアクセス権に注意してください。Modsecurityを動かすApacheやnginx等のプロセスが書き込めるようにしておきましょう。

4. ModsecurityのログをElasticsearchに入れる

ModsecurityのログをElasticsearchに入れるように1.で修正したPythonスクリプトを動かします。

  • まずは(Debianの場合)pipをインストールし、pipを用いてPython client for Elasticsearch(elasticsearch-py)をインストールします。
    
    sios@elasticsearch:~$ pip show elasticsearch
    Name: elasticsearch
    Version: 6.3.1
    Summary: Python client for Elasticsearch
    Home-page: https://github.com/elastic/elasticsearch-py
    Author: Honza Král, Nick Lang
    Author-email: honza.kral@gmail.com, nick@nicklang.com
    License: Apache License, Version 2.0
    Location: /usr/local/lib/python2.7/dist-packages
    Requires: urllib3
    Required-by:
    
    • 最初に修正したmodsec_parserを用いて、Elasticsearchにログを流します。
      
      root@elasticsearch:~# python /opt/modsecurity-to-elasticsearch/modsec_parser.py -d /var/log/modsecurity/[好きなディレクトリ名]/20181231/20181231-1504/
      

      のように、ログのディレクトリを”-d”で指定して流し込みます。

    • Elasticsearch中のログを確認します。curlを用いて、indexを見て確認します。
      
      sios@elasticsearch:~$ curl 'http://localhost:9200/_cat/indices?v'
      health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
      green  open   .monitoring-es-6-2018.12.31     7iWfzAUWRFu8s0fXofVjzw   1   0      44396           72     16.4mb         16.4mb
      green  open   modsecurity_20181231            9gRC0ArDRsucvM9Y4uARkw   1   0         23            0    181.2kb        181.2kb
      green  open   .kibana                         0B_tHSuOQAuomh8JxcafpQ   1   0          3            0     23.2kb         23.2kb
      green  open   modsecurity_20181230            nF7KAJgYTQS_zJlN4lE5zA   1   0       2862            0        2mb            2mb
      

      のように、indexにmodsecurity_[日付]がついた形で格納されています。


5. Kibanaでの確認

KibanaでManagementを選択し、Index Patterns->Create IndexでIndexにElasticsearchに入れたログのIndexが表示されます。





まとめ

これでKibanaでModsecurityのログを表示することが出来ました。ここから、更にフィールドの対応付などを行うことで、Modsecurityのログを可視化することが出来ます。可視化に関しては、時間がありましたら別途記事にします。

セキュリティ系連載案内


セミナー情報

2019/01/09 18:30-20:30で、「OSSライセンスMeetup Vol.1」を行います。

今回は技術評論社刊「OSSライセンスの教科書」著者・上田さんを迎えて刊行に至った理由・本著に込めた思い・見どころなどを語っていただき、後半ではテクニカルライター可知豊さんと共に上田さんと本書についてのディスカッションを行います。

https://sios.connpass.com/event/104422/がプログラム内容と申し込みの詳細になります。奮ってご参加下さい。

タイトルとURLをコピーしました