Send secure log to BigQuery
/var/log/secure
をBigQueryに送ってRe:dashで攻撃っぽいアクセスなどを可視化してみたかったので送ってみました。
準備
/var/log/secure
をtd-agentでも読めるようにパーミッションを下げる/var/log/secure
がローテートされてもパーミッションが戻らないようにlogrotateの設定を変更する
td-agentの設定
td-agentの設定を追加します。
<filter syslog.secure>
部分でログの送信元のサーバのホスト名をレコードに追加している
# syslog (secure log)
<source>
@type tail
format syslog
path /var/log/secure
tag syslog.secure
pos_file /var/log/td-agent/syslog.secure.pos
</source>
<filter syslog.secure>
@type record_transformer
<record>
logsource_hostname ${hostname}
</record>
</filter>
<match syslog.secure>
@type bigquery
@id bigquery_output_syslog.secure
method insert
auth_method json_key
json_key "jsonキー
project プロジェクト名
dataset データセット名
table テーブル名_%Y%m%d
auto_create_table true
schema_path /etc/td-agent/schema-bigquery-syslog.secure.json
time_format %s
time_field time
</match>
次にSchemaファイル(schema-bigquery-syslog.secure.json)を用意します。
[
{
"name": "time",
"type": "INTEGER"
},
{
"name": "host",
"type": "STRING"
},
{
"name": "ident",
"type": "STRING"
},
{
"name": "pid",
"type": "INTEGER"
},
{
"name": "message",
"type": "STRING"
},
{
"name": "logsource_hostname",
"type": "STRING"
}
]
Schemaはformatのsyslog部分の説明に従って設定しました。
logsource_hostnameをくっつけているのと、timeがよくわからなかったのですが値が入らなかったので、timeに関してはtd-agent.conf側で入れちゃってます。
結果
キタ━━━━(゚∀゚)━━━━!!
time_format %s
はUTCのユニックスタイム(秒)で入るので32400秒(9時間)を足してJSTにしている
$ bq query "SELECT SEC_TO_TIMESTAMP(time + 32400) as timestamp, host, ident, pid, message FROM データセット名.テーブル名_20170426 order by timestamp desc limit 10"
Waiting on bqjob_r425998fb2a8ed166_0000015ba9eb2b04_1 ... (0s) Current status: DONE
+---------------------+------------+-------+-------+-------------------------------------------------------------------------------------+
| timestamp | host | ident | pid | message |
+---------------------+------------+-------+-------+-------------------------------------------------------------------------------------+
| 2017-04-26 20:00:08 | ponpokopon | sshd | 13454 | Received disconnect from 121.18.238.98: 11: [preauth] |
| 2017-04-26 20:00:03 | ponpokopon | sshd | 13179 | Failed keyboard-interactive/pam for root from 182.100.67.4 port 18210 ssh2 |
| 2017-04-26 20:00:03 | ponpokopon | sshd | 13382 | pam_exec(sshd:auth): /usr/local/bin/vault-ssh-helper failed: exit code 1 |
| 2017-04-26 20:00:03 | ponpokopon | sshd | 13179 | error: PAM: System error for root from 182.100.67.4 |
| 2017-04-26 20:00:02 | ponpokopon | sshd | 13411 | Connection closed by 60.95.150.58 [preauth] |
| 2017-04-26 20:00:01 | ponpokopon | sshd | 13179 | Postponed keyboard-interactive for root from 182.100.67.4 port 18210 ssh2 [preauth] |
| 2017-04-26 20:00:01 | ponpokopon | sshd | 13156 | error: PAM: System error for root from 182.100.67.119 |
| 2017-04-26 20:00:01 | ponpokopon | sshd | 13316 | pam_exec(sshd:auth): /usr/local/bin/vault-ssh-helper failed: exit code 1 |
| 2017-04-26 20:00:01 | ponpokopon | sshd | 13156 | Failed keyboard-interactive/pam for root from 182.100.67.119 port 42704 ssh2 |
| 2017-04-26 20:00:00 | ponpokopon | sshd | 13179 | Failed keyboard-interactive/pam for root from 182.100.67.4 port 18210 ssh2 |
+---------------------+------------+-------+-------+-------------------------------------------------------------------------------------+
なかなかの勢いでsshdに対するアタックが来ていますね...。
感想
普段見えない部分で攻撃は日々行われているのじゃ…。
セキュリティを自然に意識するようになって良いですね。可視化するぞ!!
あと、ホントは同僚の真似をしてrsyslogから直にtd-agentに投げたかったんだけど(その方法ならログファイルのパーミッションもいじらなくて済むし)、CnetOS7なのでjournaldの設定でrsyslogに送るようにして、それからrsyslogの設定をいじらないとダメそうで面倒なのでtailで(そんなことはなかった)手抜きしてしまった。
journalctlコマンドに-o
オプションがあって、これでjsonフォーマットにして-f
オプションでたれながせばいい感じにtd-agentに送れそうだけど、journalctlをバックグラウンドで動かし続けるみたいなことしないとだめな気がしてそれはそれできついというのもあった。
td-agentはやはりちょっと苦手意識あるのでもっときれいな書き方とか身につけたい…。