Mackerelのチェック監視で監査ログ取得

このエントリーは、Mackerelアドベントカレンダーの24日目エントリーです。

qiita.com

12/23に開催されたMakcerel Day #2で「Mackerelのチェック監視で監査ログ取得」というテーマでLTしました。Mackerelローンチ5周年おめでとうございます!

mackerelio.connpass.com

このLTは、いわゆる「共有アカウント」を使用して、SSHでリモートログインしているサーバーに対し、リモートログインと特権操作(sudo)の履歴をMackerelで取得する方法を解説したものです。

共有アカウントを使用しているのがよくないとか、SSHでなく(AWSだと)セッションマネージャーを使うのが良くのではとか、改善すべきところはありますが、そのような制約をどのようにクリアしていくかを考えました。

ユーザーそれぞれが独自の公開鍵を使用し、Ansibleで各サーバーに公開鍵を配布するようにしています。公開鍵のメンテナンス時は、AnsibleのGitレポジトリーにプルリクエストを作成をすることによって、どの公開鍵をどのユーザーが使用しているか管理できるようにしています。

SSHDの設定ファイル(/etc/ssh/sshd_config)でLogLevel VERBOSEを設定することにより、リモートログイン時にどの公開鍵を使用したかがログに出力されます。またLinuxサーバー上でauditdを有効にすることにより、sudo等で特権を得た場合の操作ログが出力されます。

Mackerelのcheck-logプラグインを設定することで監視することにより、これらのログを監視しています。mackerel-agent.confの設定は以下の通りです。

[plugin.checks.user_auth_success]
command = ["check-log", "--file", "/var/log/audit/audit.log", "--pattern", "USER_AUTH", "--pattern", "success", "--return"]
[plugin.checks.user_auth_fail]
command = ["check-log", "--file", "/var/log/audit/audit.log", "--pattern", "USER_LOGIN", "--pattern", "failed", "--return"]
[plugin.checks.user_sudo]
command = ["check-log", "--file", "/var/log/audit/audit.log", "--pattern", "USER_CMD", "--pattern", "success", "--exclude", "terminal=\\?", "--return"]

Mackerelでチェックした内容をSlackにアラート送信することにより、ログの内容の記録および、インシデント対応を行っています。

リモートログイン時のSlack通知は以下の通りです(ログの性格上モザイクだらけですが)

f:id:setoazusa:20191224221625p:plain

sudoでコマンドを実行した場合は、以下の様な通知が来ます。 sudo権限があるユーザーがrm -rf /*とか実行した時は、通知がきた時は実行された後なので、後の祭り感がありますが。

f:id:setoazusa:20191224221655p:plain

ここで見てきた通り、Mackerelはプラグインとの組み合わせで使い道がひろがります。ここではログの監査用途でcheck-logプラグインとアラート通知を組み合わせる用途を紹介しました。プラグインを活用して楽しいMackerelライフを送っていきましょう。