Specification

February 10, 2019 · View on GitHub

1. Web applications and Routing Rules

HTTP(S)リクエストを受け付けると、以下のWebアプリケーションのいずれかがレスポンスを返します。

nginxがリバースプロキシとして動作し、各Webアプリケーションはバックエンドで動作します。nginxは、URLを条件にバックエンドへリクエストをルーティングします。

ルーティングのルールを下表に示します。詳しくはdocker/nginx/dist/default.confを参照してください。

条件(case insensitive)ルーティング先
/wp-から始まるWordPress
phpMyAdmin|pma|mysqlを含むphpMyAdmin
/manager/から始まるApache Tomcat
.jspを含むApache Tomcat
.phpを含むPHP WebShell
その他WOWHoneypot

2. Port and Protocol

PortProtocol
80HTTP
443HTTPS
8080HTTP

HTTPSの場合は、nginxが自己署名証明書を使用して受け付けし、HTTPでバックエンドの各Webアプリケーションへ転送します。

Listenするポートを追加する場合は、以下のファイルを変更する必要があります。

3. Log file list

ログ種類保存先ファイル名保存期間
access log/data/nginx/log/access.json-yyyymmdd.gz180日間
error log/data/nginx/log/error.log-yyyymmdd.gz180日間
pcap file/data/tshark/dump/tcp.pcap-yyyymmdd-hhmmss.gz約180日間
tcp log/data/tshark/log/tcp.json0日間

当日分のログのファイル名には、-yyyymmdd(-hhmmss).gzは付きません。

4. Log file description

4.1. access Log

nginxのアクセスログです。JSON形式で保存します。

ログフォーマットを下表に示します。

項目説明
timeISO 8601フォーマットのアクセス日時。2019-02-01T12:34:56+09:00
src_ipリクエスト元のIPアドレス。5.40.XX.XX
src_portリクエスト元のPort番号。46970
dst_ipリクエスト先のIPアドレス。サーバのグローバルIPアドレスではなくDockerコンテナの内部IPアドレス。172.20.0.7
dst_portリクエスト先のポート番号。80
request_lengthリクエストのヘッダー部とボディ部のサイズ。184
response_lengthレスポンスのヘッダー部とボディ部のサイズ。224
schemeURLスキーマ。http
methodリクエストメソッド。GET
uriリクエストURI。/manager/html
protocolHTTPプロトコル。HTTP/1.1
hostHostヘッダー。13.231.XXX.XXX
http_refererリファラー。hxxp://13.231.XXX.XXX/test.php
http_user_agentユーザーエージェント。Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
request_headerリクエストのヘッダー部。Host: 13.231.XXX.XXX\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0\r\nContent-Length: 0\r\n\r\n
request_bodyリクエストのボディ部。hoge=fuga&aaa=bbb
statusステータスコード200
sizeレスポンスのボディ部のサイズ。12

4.2. error log

nginxの標準のエラーログです。エラーログのレベルはwarnです。

4.3. pcap file

tsharkが保存するネットワークキャプチャファイルです。 2. Port and Protocolに記載しているPort番号がキャプチャの対象です。

ホストOSのネットワークインターフェースからキャプチャします。

4.4. tcp log

tsharkが出力するJSON形式のネットワークキャプチャログです。
ログフォーマットはElasticsearch用のフォーマットです。(tsharkの-T ekオプションで出力)

ホストOSのネットワークインターフェースからキャプチャします。

5. Log Rotation

BW-Potのサービス起動前に、logrotateコマンドによるローテーションおよびログ削除を行います。

詳しくはetc/logrotate/を参照してください。

5.1. access log

etc/logrotate/logrotate_nginx.confの定義に基づいてローテーションします。

5.2. error log

etc/logrotate/logrotate_nginx.confの定義に基づいてローテーションします。

5.3. pcap file

etc/logrotate/logrotate_tshark.confの定義に基づいてローテーションします。

既にpcapファイルが存在する場合に上書きしないように、ファイル名に-hhmmssを付けて強制ローテーションを行います。 サーバ再起動およびサービス再起動を週に8回実行するため、ローテーションするファイルの最大数を200にすることで、保存期間が180日間になるよう調整しています。 よって、手動でサービス再起動した場合は保存期間が短縮されます。

5.4. tcp log

Fluentdへの連携を目的としたファイルであるため、ローテーションせずに日次でログファイルをクリアします。

6. Log forwarder

Fluentdを使用して、access Logとtcp logをGoogle BigQueryに転送します。

指定したdatasetにテーブルが存在しない場合は、自動でテーブルを作成します。 ただし、自動でテーブルを作成すると分割テーブルになりません。 コスト削減等を目的に分割テーブルを使用したい場合は、あらかじめWeb UIやbqコマンドでテーブルを作成し、分割する列にtime列を指定することを推奨します。 手順はInstallを参照してください。

7. Job schedule

cronを使用して以下の定期ジョブを実行します。

  • 毎日03:27にサーバを再起動します。Dockerコンテナも再起動しますのでクリーンな状態が保たれます。また、再起動後にログローテーションを実行します。
  • 毎週日曜16:27にパッケージを更新してサーバを再起動します。

8. Firewall

iptablesを使用して、2. Port and Protocol以外のPort番号への通信を禁止しています。

詳しくはetc/bwpot/setIptables.shを参照してください。

9. Directories

各ディレクトリの役割を下表に示します。

ディレクトリ役割
./docker/各DockerコンテナのDockerfileとコンテナ内に配備するファイルを格納するディレクトリ
./etc/ホストOSのサービスが参照するファイルを格納するディレクトリ
./host/ホストOSへのインストール時に使用するファイルを格納するディレクトリ
/data/各種ログファイルの格納ディレクトリ