🤖

auditdを使用したファイル監査

2022/12/04に公開

はじめに

今回から何回かに分けて、Linuxで各種監査が可能な「Audit」システムを使って、色々試していきたいと思います。

Audit とは

以下は、RHELの公式サイトのマニュアル抜粋です。

The Linux Audit system provides a way to track security-relevant information on your system. Based on pre-configured rules, Audit generates log entries to record as much information about the events that are happening on your system as possible. This information is crucial for mission-critical environments to determine the violator of the security policy and the actions they performed.

ユースケースとして記載されているのは、以下のようなものです。

  • ファイルアクセスの監視
  • システムコールの監視
  • ユーザーが実行したコマンドの記録
  • システムのパス名の実行の記録
  • セキュリティーイベントの記録
  • イベントの検索
  • サマリーレポートの実行
  • ネットワークアクセスの監視

ユーザー側で事前にルールを作成することで、そのルールに基づいた操作が実行されたときに、それをログとして出力してくれます。
さまざまな監査が可能なので、セキュリティインシデントなどが発生した際に、どのようなことが誰によって行われたのかを確認することができます。

Auditd の導入

Auditシステムは、以下コマンドでインストールが可能です。

yum install audit

※私の場合は、OSインストール時に「セキュリティツール」を選択していたからなのか、最初からインストールされていました。

デーモンの起動確認をします。

systemctl status auditd.service

Activeの行でactive(running)になっていれば起動してます。

ファイル監査

今回は、適当に作成したファイルに対して、他の人がアクセスしたかどうか、監査する設定を入れてみようと思います。

  1. 適当なファイルを作成しておきます。
$ touch test.conf
$ echo "test" > test.conf
$ cat test.conf 
test
  1. 作成したファイルに対しファイル監査の設定をします。
$ sudo auditctl -w /tmp/test.conf -p w -k write_test.conf

オプションの説明は以下です。

  • -w:監査するファイルを指定します
  • -p:ファイルに対してどのような操作を監査するかを指定します。今回の場合は、書き込み(write:w)のみ設定しました。
  • -k:設定したルールに対して、キーワードを設定できます。これは、後で検索する時に楽になります。
  1. 設定されているかの確認は以下のコマンドでできます。
$ sudo auditctl -l
-w /tmp/test.conf -p w -k write_test.conf

事前準備ができたので、実際にどのようにログとして残るか確認してみます。
以下のコマンドで、作成したファイルに追記してみます。

$ echo "add" >> test.conf 
$ cat test.conf
test
add

auditのログは、デフォルトでは/var/log/audit/audit.logにあります。

$ sudo less /var/log/audit/audit.log

今回の書き込みで出力されたログは以下です。
※一部マスキングしてます。

type=SYSCALL msg=audit(1670075942.453:248): arch=c00000b7 syscall=56 success=yes exit=3 a0=ffffffffffffff9c a1=aaaaee84ca90 a2=441 a3=1b6 items=2 ppid=1268 pid=1269 auid=1000 uid=1000 gid=10 euid=1000 suid=1000 fsuid=1000 egid=10 sgid=10 fsgid=10 tty=pts0 ses=3 comm="bash" exe="/usr/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="write_test.conf"ARCH=aarch64 SYSCALL=openat AUID="XXX" UID="XXX" GID="wheel" EUID="XXX" SUID="XXX" FSUID="XXX" EGID="wheel" SGID="wheel" FSGID="wheel"
type=CWD msg=audit(1670075942.453:248): cwd="/tmp"
type=PATH msg=audit(1670075942.453:248): item=0 name="/tmp" inode=4194433 dev=fd:00 mode=041777 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:tmp_t:s0 nametype=PARENT cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0OUID="root" OGID="root"
type=PATH msg=audit(1670075942.453:248): item=1 name="test.conf" inode=1261508 dev=fd:00 mode=0100644 ouid=1000 ogid=10 rdev=00:00 obj=unconfined_u:object_r:user_home_t:s0 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0OUID="XXX" OGID="wheel"
type=PROCTITLE msg=audit(1670075942.453:248): proctitle="-bash"

情報量が多くて、解読が難しいですが、ユーザー「XXX」が「test.conf」に対して操作したということがわかります。
key="write_test.conf"の記載もあるため、どのルールに引っかかったものなのかもわかります。

audit.logからでも上記のように確認はできますが、それ以外の監査ログも大量に出力されているため、該当のログを探し当てるのは困難です。
そんな時に利用できるのが、ausearchです。
以下コマンドを実行することで、キーワードが該当するログのみを抽出してくれます。

$ sudo ausearch -k write_test.conf
----
time->Sat Dec  3 22:54:02 2022
type=PROCTITLE msg=audit(1670075642.424:239): proctitle="-bash"
type=PATH msg=audit(1670075642.424:239): item=1 name="test.conf" inode=1261508 dev=fd:00 mode=0100644 ouid=1000 ogid=10 rdev=00:00 obj=unconfined_u:object_r:user_home_t:s0 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1670075642.424:239): item=0 name="/tmp" inode=4194433 dev=fd:00 mode=041777 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:tmp_t:s0 nametype=PARENT cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(1670075642.424:239): cwd="/tmp"
type=SYSCALL msg=audit(1670075642.424:239): arch=c00000b7 syscall=56 success=yes exit=3 a0=ffffffffffffff9c a1=aaaaee857dc0 a2=441 a3=1b6 items=2 ppid=1268 pid=1269 auid=1000 uid=1000 gid=10 euid=1000 suid=1000 fsuid=1000 egid=10 sgid=10 fsgid=10 tty=pts0 ses=3 comm="bash" exe="/usr/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="write_test.conf"
----

さっきより断然に見やすく、かつ必要なログのみ抽出されています。

設定の永続化

auditctlコマンドでファイル監査ルールを作成しましたが、このままでは、OS再起動後にルールが削除されてしまいます。
以下は、OS再起動後のルール確認結果。

$ sudo auditctl -l
No rules

OSを再起動しても、ルールを保持するためには、/etc/audit/rules.d/ディレクトリ配下にルールファイルを作成します。

# 以下はrootで実行します。
$ cd /etc/audit/rules.d/
$ cat << EOF > test.rules
> -w /tmp/test.conf -p w -k write_test.conf
> EOF
$ chmod 600 test.rules
$ ll
合計 8
-rw-------. 1 root root 244 1120 21:34 audit.rules
-rw-------. 1 root root  42 124 21:54 test.rules

OS再起動後、ルールが保存されていることが確認できます。

$ sudo auditctl -l
-w /tmp/test.conf -p w -k write_test.conf

おわり

まだまだauditは奥が深いですが、今回はここまでにして、もう少し調べたら深掘りしていきたいなと思いました。

Discussion