auditd は事の後に浮かぶ問いに答えます。このファイルを誰が変えたのか、このユーザーはいつ作られたのか、このプロセスはどこから起動されたのか。ほかのツールはそれに答えません——アプリケーションのログにその情報は無く、シェルの履歴はそれを残した本人が編集できます。

難しいのは、パッケージを入れるだけでは何も得られないことです。既定のルールは実質ありません。ジャーナルは書かれていますが中身は空で、そしてそれが判明するのは最悪の瞬間——データが必要なのに無いときです。

インストール

sudo apt install auditd audispd-plugins
sudo systemctl status auditd

一つ特徴があります。いくつかの版では auditdsystemctl restart で再起動できません——このサービスは自前のコマンドで管理されます。ルールはこう読み直します。

sudo augenrules --load
sudo auditctl -l

二つ目のコマンドが実際に読み込まれたものを示します。ファイルの中身ではなく、これを信じてください。

ルールの組

ルールは /etc/audit/rules.d/ に別ファイルとして置きます。以下は元が取れる最小限の組です。ディスクを埋め尽くさずに、事故の際に出てくる問いの大半に答えてくれます。

sudo tee /etc/audit/rules.d/50-baseline.rules <<'EOF'
## ユーザーと権限
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k privileges
-w /etc/sudoers.d/ -p wa -k privileges

## SSH のアクセス
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /root/.ssh/ -p wa -k ssh_keys

## スケジュールされたジョブ
-w /etc/crontab -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /var/spool/cron/ -p wa -k cron

## カーネルモジュール
-w /sbin/insmod -p x -k modules
-w /sbin/modprobe -p x -k modules
-a always,exit -F arch=b64 -S init_module -S delete_module -k modules

## sudo と su の使用
-w /usr/bin/sudo -p x -k privileged
-w /bin/su -p x -k privileged
EOF
sudo augenrules --load

構文は短いものです。-w は監視するパス、-p wa は書き込みと属性変更に反応する、-p x は実行に反応する、-k は後で検索するための鍵です。この鍵こそが主な便利さです。それが無ければジャーナルの検索は一ギガバイトのテキストのふるい分けになります。

その一覧に無いもの、そしてその理由

手引きはしばしば execve のすべての呼び出し——つまりあらゆるプログラムのあらゆる起動——を記録することを勧めます。誘惑は理解できます。何が行われたかの完全な絵です。実際には、稼働中のサーバーではそれは一日に数百メガバイトを生み、プロセッサの目に見える割合を食い、必要になる前にジャーナルが切り詰められる結果を招きます。その粒度が本当に要るなら、狭く有効にしてください——一人のユーザーについて、あるいは調査の期間だけ。

サイトのディレクトリを監視する場合も同じです。そこへの書き込みは絶え間なく、そのルールはジャーナルを無意味なイベントの流れに変えてしまいます。

読み方

鍵で検索し、数値の識別子は名前に直します。

sudo ausearch -k identity -i
sudo ausearch -k privileges -i -ts today

読めるようにするには -i フラグが欠かせません。これが無いとユーザー名やシステムコール名の代わりに数字が並びます。-ts は期間を絞ります(todayrecent、あるいは具体的な日付)。

期間のまとめ:

sudo aureport --summary -i
sudo aureport --auth -i --failed

イベントの記録では三つの項目が興味深いものです。セッションを開いたユーザーの識別子 auid、その動作が実行された身元 uid、そしてそれを実行したプログラム exeauiduid の差こそが「正確に誰が root になったのか」への答えです。特定の人物の auid を伴う uid=0 は、そのセッションの中で本人が何を名乗っていようと、当事者を一義的に指し示します。

ディスク

大きさの設定は /etc/audit/auditd.conf にあります。

max_log_file = 50
num_logs = 5
max_log_file_action = ROTATE
space_left = 500
space_left_action = SYSLOG

disk_full_action は別途見てください。設定によっては、ディスクが埋まったときにシステムを停止するのが既定です——監査要件のあるマシンでは筋の通った振る舞いですが、Web サーバーではまったく場違いです。ディスクが尽きる前にその値を確認してください。

変更不可のルール

ルールファイルの末尾の -e 2 の行は、再起動までルールの変更を禁じます——root を得た者に対しても同じです。これはジャーナルの価値を目に見えて高めます。侵入者はマシンを再起動せずに監視を切れませんし、再起動それ自体が目立つからです。

裏面は明らかです。あなた自身も再起動なしには自分のルールを変えられません。ルールの組が落ち着き、それと一か月暮らしてから有効にしてください。

普通のサーバーになぜ必要なのか

auditd は何も防ぎません。その価値が現れるのはちょうど一度きり——出来事の順序を再構成しなければならないときであり、そのときデータは在るか無いかのどちらかです。それは遡って集めることができません。だからこそルールの組は前もって置き、そのあとは触らないのです。

設定が正しいことの実務的な印は、ルール一覧が空でないこと、ジャーナルが制御不能に膨らまないこと、そして identityprivileges の鍵を持つイベントがまれにしか現れず、そのどれもが説明できることです。それが一つのページでどう見えるかは下のデモで。