Linux
Security
audit
auditd

auditdで特定のsyscallとexit (errno) の組み合わせを無視する

More than 1 year has passed since last update.

以前auditdでLinuxのファイル改竄検知をやりたくて、こんなのを書いた。
auditdでLinuxのファイル改竄検知を行う

実際に監視してみるとノイズが色々出るので、システムコールレベルで監視条件をチューニングしたくなった。
例えば以下のようなメッセージを無視したい。ちょっと見づらいので改行してるが、実際には1行です。

Nov 25 11:45:01 myhost audispd: 
node=myhost type=SYSCALL msg=audit(1480041901.111:5431): 
arch=c000003e syscall=83 success=no exit=-17 
a0=7ffc046bdb7a a1=1ff a2=7ffc046bc750 a3=7ffc046bc1e0 items=1 
ppid=17266 pid=17276 auid=502 uid=502 gid=501 euid=502 suid=502 fsuid=502 egid=501 sgid=501 fsgid=501 
tty=(none) ses=318 comm="mkdir" exe="/bin/mkdir" key="file_changes"

検証環境

# cat /etc/system-release
Amazon Linux AMI release 2016.09
# uname -a
Linux myhost 4.4.30-32.54.amzn1.x86_64 #1 SMP Thu Nov 10 15:52:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

syscall番号を調べる

問題のsyscallが何なのか調べます。

# ausyscall 83
mkdir

mkdirのようです。

念のためアーキテクチャを指定して逆向け引いてみます。

# ausyscall i386 mkdir
mkdir              39
mkdirat            296

# ausyscall x86_64 mkdir
mkdir              83
mkdirat            258

ログに出ているarch=c000003eのアーキテクチャはx86_64を表しているよう。

exit番号の意味を調べる

exitに出てるのはLinuxのerrnoです。
includeファイルがどこにあるかはディストリビューションによります。AmazonLinux2016.09だとこの辺にあった。

# grep -e '\<17\>' /usr/include/asm-generic/errno*.h
/usr/include/asm-generic/errno-base.h:#define   EEXIST          17      /* File exists */

これはmkdirで既に存在してますなので、実害ないので無視して良さそう。

audit.rulesで除外指定する

/etc/audit/audit.rulesに以下の条件を追記します。
※exitの値はsuccess=noの場合はマイナス、success=yesの場合はプラスで指定することに注意。

/etc/audit/audit.rules
-a exit,never -F arch=b64 -S mkdir -F exit=-17 -k exclude

反映するためにauditdを再起動

# service auditd restart

(2016/12/12追記) ausearchによる名前解決

サーバ上にauditdのログがある状態であれば ausearch コマンドに --interpret を付けるとシステムコール名やexit番号をよしなに名前解決してくれることに気付いた。

イメージこんな感じになる。

# ausearch --interpret --exit -13
type=PATH msg=audit(2016年12月12日 13:31:58.507:17283877) : item=2 name=(null) inode=394973 dev=ca:01 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=NORMAL
type=PATH msg=audit(2016年12月12日 13:31:58.507:17283877) : item=1 name=(null) inode=394973 dev=ca:01 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=NORMAL
type=PATH msg=audit(2016年12月12日 13:31:58.507:17283877) : item=0 name=XXXXXXXXXXX inode=394972 dev=ca:01 mode=dir,755 ouid=root ogid=root rdev=00:00 nametype=PARENT
type=CWD msg=audit(2016年12月12日 13:31:58.507:17283877) :  cwd=XXXXXXXXXXXXXXXXXXXX
type=SYSCALL msg=audit(2016年12月12日 13:31:58.507:17283877) : arch=x86_64 syscall=open success=no exit=-13(許可がありません) a0=0x18e1540 a1=O_RDWR|O_CREAT|O_CLOEXEC a2=0644 a3=0x100 items=3 ppid=1776 pid=1849 ... (略)

ログの一番最後のところなんだけど
syscall=open success=no exit=-13(許可がありません) ってなってて名前解決されてる。