hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

ausearchコマンドの使い方



1 ausearchコマンドとは?

Auditデーモン(auditd)が出力する監査ログを検索するコマンドです。監査ログはシステム運用者が実行した操作履歴で、デフォルトで/var/log/audit/audit.logに出力されます。監査者が監査ログを調査することで,いつ、だれが、何をしたか、を知ることができます。

監査に関するコマンドとして以下のものがあります。

コマンド名 概要
ausearch audit.logファイルから特定のログを検索する
aureport audit.logファイルから監査のサマリを作成する
auditctl Auditデーモンの動作に関する設定、およびAuditルールの定義を行う

1.1 Auditデーモンの設定ファイル

Auditデーモンの設定は、/etc/audit/auditd.confで行います。監査ログの出力先、監査ログファイル数等を定義します。

1.2 Audtitルールの定義

Audtitルールの定義には、以下の3つがあります。これらのルールは、auditctlコマンドで設定するか、/etc/audit/audit.rulesに設定します。
・制御ルール(Auditデーモンの動作に関する設定)
ファイルシステムルール(ファイルやディレクトリに対する監査ルール)
システムコールルール(システムコールに対する監査ルール)

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

ausearchコマンドの版数は以下のとおりです。

[root@server ~]# ausearch -v
ausearch version 2.8.5

3 人が見やすい形式に変換する方法(-i)

audit.logは、そのままだと時刻がUNIX時間だったり、PIDが数値のままで分かりずらいです。以下のログは、オプション指定なしのときのログになります。

type=PROCTITLE msg=audit(1643460408.378:553): proctitle=2F7573722F7362696E2F69707461626C65732D726573746F7265002D77002D6E
type=NETFILTER_CFG msg=audit(1643460408.378:554): table=security family=2 entries=4
type=SYSCALL msg=audit(1643460408.378:554): arch=c000003e syscall=54 success=yes exit=0 a0=4 a1=0 a2=40 a3=7329e0 items=0 ppid=723 pid=5588 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="iptables-restor" exe="/usr/sbin/xtables-multi" subj=system_u:system_r:iptables_t:s0 key=(null)
-snip-

"-i"オプションを使うと、UNIX時間を現在時刻に変換したり、PIDをアカウント名に変換することができます。

[root@server ~]# ausearch -i -if /var/log/audit/audit.log
----
type=PROCTITLE msg=audit(2022年01月29日 21:46:48.378:553) : proctitle=/usr/sbin/iptables-restore -w -n
----
type=PROCTITLE msg=audit(2022年01月29日 21:46:48.378:554) : proctitle=/usr/sbin/iptables-restore -w -n
type=SYSCALL msg=audit(2022年01月29日 21:46:48.378:554) : arch=x86_64 syscall=setsockopt success=yes exit=0 a0=0x4 a1=ip a2=IPT_SO_SET_REPLACE a3=0x7329e0 items=0 ppid=723 pid=5588 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=iptables-restor exe=/usr/sbin/xtables-multi subj=system_u:system_r:iptables_t:s0 key=(null)
type=NETFILTER_CFG msg=audit(2022年01月29日 21:46:48.378:554) : table=security family=ipv4 entries=4
----
-snip-

4 出力範囲を絞り込む方法

4.1 今日出力されたログに絞り込む方法(today)

今日のログを表示してみます。今が2/17 10:20だとすると、2/17 00:00から10:20までのログを表示することになります。

[root@server ~]# ausearch -i -ts today
----
type=DAEMON_START msg=audit(2022年02月17日 10:16:22.403:623) : op=start ver=2.8.5 format=raw kernel=3.10.0-1160.el7.x86_64 auid=unset pid=3905 uid=root ses=unset subj=system_u:system_r:auditd_t:s0 res=success
----
-snip-
type=USER_END msg=audit(2022年02月17日 10:20:01.759:36) : pid=4052 uid=root auid=root ses=23 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_close grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct=root exe=/usr/sbin/crond hostname=? addr=? terminal=cron res=success'
[root@server ~]#

4.2 今週出力されたログを絞り込む方法(this-week)

今週出力されたログを表示してみます。日曜日から現在までのログを表示します。ログの1行目の2022年02月13日は日曜日です。

[root@server ~]# ausearch -i -ts this-week
----
type=DAEMON_START msg=audit(2022年02月13日 08:35:28.379:3736) : op=start ver=2.8.5 format=raw kernel=3.10.0-1160.el7.x86_64 auid=unset pid=600 uid=root ses=unset subj=system_u:system_r:auditd_t:s0 res=success
----
-snip-
type=USER_END msg=audit(2022年02月17日 10:30:01.981:43) : pid=4145 uid=root auid=root ses=24 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_close grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct=root exe=/usr/sbin/crond hostname=? addr=? terminal=cron res=success'

4.3 月で絞り込む方法(this-month)

今月出力されたログを表示してみます。1日から現在までのログを表示します。

[root@server ~]# ausearch -i -ts this-month
----
type=DAEMON_START msg=audit(2022年02月01日 19:30:58.980:7307) : op=start ver=2.8.5 format=raw kernel=3.10.0-1160.el7.x86_64 auid=unset pid=600 uid=root ses=unset subj=system_u:system_r:auditd_t:s0 res=success
----
-snip-
type=USER_END msg=audit(2022年02月17日 10:30:01.981:43) : pid=4145 uid=root auid=root ses=24 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_close grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct=root exe=/usr/sbin/crond hostname=? addr=? terminal=cron res=success'

4.4 昨日から今日に出力されたログを絞り込む方法(yesterday,today)

昨日から現在までのログを表示してみます。

[root@server ~]# ausearch -i -ts yesterday -te today
----
type=DAEMON_START msg=audit(2022年02月16日 15:24:14.926:403) : op=start ver=2.8.5 format=raw kernel=3.10.0-1160.el7.x86_64 auid=unset pid=600 uid=root ses=unset subj=system_u:system_r:auditd_t:s0 res=success
----
-snip-
type=USER_END msg=audit(2022年02月17日 10:40:01.145:50) : pid=4242 uid=root auid=root ses=25 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_close grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct=root exe=/usr/sbin/crond hostname=? addr=? terminal=cron res=success'

4.5 直近に出力されたログに絞り込む方法(recent)

直近とは10分前を意味します。現在時刻は10:48:14なので、10:38:14以降のログが出力されることになります。

[root@server ~]# date
2022年  2月 17日 木曜日 10:48:14 JST

直近10分前のログを表示してみます。

[root@server ~]# ausearch -i -ts recent
----
type=USER_ACCT msg=audit(2022年02月17日 10:40:01.083:44) : pid=4242 uid=root auid=unset ses=unset subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:accounting grantors=pam_access,pam_unix,pam_localuser acct=root exe=/usr/sbin/crond hostname=? addr=? terminal=cron res=success'
----
-snip-
----
type=USER_END msg=audit(2022年02月17日 10:40:01.145:50) : pid=4242 uid=root auid=root ses=25 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_close grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct=root exe=/usr/sbin/crond hostname=? addr=? terminal=cron res=success'
[root@server ~]#

4.6 時刻で絞り込む方法(-ts:開始,-te:終了)

本日の14:50:00から14:50:01の間に出力されたログを表示してみます。

[root@server ~]# ausearch -i -if /var/log/audit/audit.log -ts 14:50:00 -te 14:50:01
----
type=USER_ACCT msg=audit(2022年02月17日 14:50:01.912:511) : pid=7184 uid=root auid=unset ses=unset subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:accounting grantors=pam_access,pam_unix,pam_localuser acct=root exe=/usr/sbin/crond hostname=? addr=? terminal=cron res=success'
----

5 システムコール種別で絞り込む方法(-sc)

writeシステムコールのログだけを出力してみます。

[root@server ~]# ausearch -i -sc write
----
type=PROCTITLE msg=audit(2021年11月09日 21:43:04.720:1608) : proctitle=/sbin/load_policy
type=SYSCALL msg=audit(2021年11月09日 21:43:04.720:1608) : arch=x86_64 syscall=write success=yes exit=3882576 a0=0x4 a1=0x7fd663ed5000 a2=0x3b3e50 a3=0x7fffda842e60 items=0 ppid=75356 pid=75361 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=6 comm=load_policy exe=/usr/sbin/load_policy subj=unconfined_u:unconfined_r:load_policy_t:s0-s0:c0.c1023 key=(null)
type=MAC_POLICY_LOAD msg=audit(2021年11月09日 21:43:04.720:1608) : policy loaded auid=root ses=6

6 最初に条件にヒットしたものを表示する方法(--just-one)

setsockoptシステムコールのログは全部で38872個あることがわかります。

[root@server ~]# ausearch -i -sc setsockopt|wc -l
38872

38872個のログの中から最初のログを表示してみます。

[root@server ~]# ausearch -i -sc setsockopt --just-one
----
type=PROCTITLE msg=audit(2021年11月09日 20:33:50.600:43) : proctitle=/usr/sbin/ebtables-restore --noflush
type=SYSCALL msg=audit(2021年11月09日 20:33:50.600:43) : arch=x86_64 syscall=setsockopt success=yes exit=0 a0=0x3 a1=ip a2=unknown-ipopt-name(0x80) a3=0x18e9c80 items=0 ppid=640 pid=803 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=ebtables-restor exe=/usr/sbin/ebtables-restore subj=system_u:system_r:iptables_t:s0 key=(null)
type=NETFILTER_CFG msg=audit(2021年11月09日 20:33:50.600:43) : table=filter family=bridge entries=0

7 タイプで絞り込む方法(-m)

7.1 サービス開始時のログを絞り込む(-m SERVICE_START)

httpdサービスを起動します。

[root@server ~]# systemctl start httpd.service

サービス開始時のログを表示してみます。

[root@server ~]# ausearch -i -ts today -m SERVICE_START
----
type=SERVICE_START msg=audit(2022年02月17日 11:45:29.510:317) : pid=1 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg='unit=httpd comm=systemd exe=/usr/lib/systemd/systemd hostname=? addr=? terminal=? res=success'

7.2 サービス終了時のログを絞り込む(-m SERVICE_STOP)

httpdサービスを終了します。

[root@server ~]# systemctl stop httpd.service

サービス終了時のログを表示してみます。

[root@server ~]# ausearch -i -ts today -m SERVICE_STOP
----
type=SERVICE_STOP msg=audit(2022年02月17日 11:46:53.991:318) : pid=1 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg='unit=httpd comm=systemd exe=/usr/lib/systemd/systemd hostname=? addr=? terminal=? res=success'

8 成功/失敗で絞り込む方法(-sv)

8.1 成功で絞り込む方法(yes)

[root@server ~]# ausearch -i -if /var/log/audit/audit.log -sv yes
----
type=SERVICE_START msg=audit(2022年02月17日 13:47:57.280:417) : pid=1 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg='unit=httpd comm=systemd exe=/usr/lib/systemd/systemd hostname=? addr=? terminal=? res=success'

8.2 失敗で絞り込む方法(no)

localhostsshでログインします。このとき、故意にパスワードを間違えてみます。

[root@server ~]# ssh localhost
root@localhost's password:
Permission denied, please try again.
root@localhost's password:

パスワードを間違えると、以下のログが出力されます。

[root@server ~]# ausearch -i -if /var/log/audit/audit.log -sv no
----
type=USER_AUTH msg=audit(2022年02月17日 13:56:45.476:468) : pid=6581 uid=root auid=unset ses=unset subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=password acct=root exe=/usr/sbin/sshd hostname=? addr=::1 terminal=ssh res=failed'

9 プロセスIDで絞り込む方法(-p)

rsyslogdのログを出力してみます。psコマンドを実行すると、rsyslogdのPIDは1088であることがわかります。

[root@server ~]# ps -C rsyslogd
   PID TTY          TIME CMD
  1088 ?        00:00:01 rsyslogd
[root@server ~]# ausearch -if /var/log/audit/audit.log -p 1088
----
time->Sat Feb  5 23:15:33 2022
type=CRYPTO_KEY_USER msg=audit(1644070533.060:974): pid=1088 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=SHA256:0b:0e:65:fb:59:ea:b5:f3:61:72:4c:88:37:51:b4:0c:51:f5:1c:41:17:12:2c:49:78:1e:ba:b8:7a:40:20:db direction=? spid=1088 suid=0  exe="/usr/sbin/sshd" hostname=? addr=? terminal=? res=success'

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ