OSSECでPostgreSQLのログを監視対象にしたのにアラートが上がらない場合の対処方法を記します。
バージョンは以下の通りです。
OSSEC:2.8.3
PostgreSQL:9.3
OSはUbuntu 14.04で試しています。
●原因
PostgreSQLのログ(デフォルトでは/var/log/postgresql/postgresql-9.3-main.log)を見ると
2015-09-14 13:58:58 JST LOG: database system is ready to accept connections
OSSECのソースコード(https://github.com/ossec/ossec-hids/blob/master/src/logcollector/read_postgresql_log.c)を見てみると
/* PostgreSQL messages have the following format:
* [2007-08-31 19:17:32.186 ADT] 192.168.2.99:db_name
*/
if ((str_len > 32) &&
(str[0] == '[') &&
(str[5] == '-') &&
(str[8] == '-') &&
(str[11] == ' ') &&
(str[14] == ':') &&
(str[17] == ':') &&
isdigit((int)str[1]) &&
isdigit((int)str[12])) {
PostgreSQLのデフォルトのログフォーマットは”2016-09-12 13:58:58 JST”。
一方、OSSECがPostgreSQLのログ解析対象とするフォーマットは”[2007-08-31 19:17:32.186 ADT]”。
このフォーマットが一致していないためOSSECがPostgreSQLのログとして認識できていないことが原因でした。
●対処
対処としては以下の3つの方法があります。
- PostgreSQLのログフォーマットをOSSECのログ解析フォーマットに合わせる
- OSSECのログ解析フォーマットをPostgreSQLのログフォーマットに合わせる
- PostgreSQLのログフォーマットをsyslogやapacheなどの別のログと認識させる
1.の方法の場合はPostgreSQLのログ出力フォーマットを変えるだけでできます。
2.の方法の場合はOSSECのソースコードを修正する必要があり手間が大きいかつ、OSSECがアップグレードされる度に該当部分を修正する必要がでてきます。(今後、ログ解析フォーマットが変更される可能性もあります)
3.の方法の場合はPostgreSQLのルールが適用される前に別のルールが適用されてしまうなど、設定が複雑になってしまいます。また2.と同様にアップグレードの度に設定を見直す必要が出てきます。
ということで変更が簡単かつOSSECのアップグレードに影響されない1.の方法で今回は対処したいと思います。
PosgreSQLの設定ファイル(/etc/postgresql/9.3/main/postgresql.conf)を以下のように編集し、
(変更前)log_line_prefix = '%t ' ↓ (変更後)log_line_prefix = '[%t] %h: '
PostgreSQLの設定を再読み込みします。
$ sudo service postgresql reload