このエントリーは、Mackerelアドベントカレンダーの24日目エントリーです。
12/23に開催されたMakcerel Day #2で「Mackerelのチェック監視で監査ログ取得」というテーマでLTしました。Mackerelローンチ5周年おめでとうございます!
この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通知は以下の通りです(ログの性格上モザイクだらけですが)
sudo
でコマンドを実行した場合は、以下の様な通知が来ます。 sudo
権限があるユーザーがrm -rf /*
とか実行した時は、通知がきた時は実行された後なので、後の祭り感がありますが。
ここで見てきた通り、Mackerelはプラグインとの組み合わせで使い道がひろがります。ここではログの監査用途でcheck-logプラグインとアラート通知を組み合わせる用途を紹介しました。プラグインを活用して楽しいMackerelライフを送っていきましょう。