以前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の場合はプラスで指定することに注意。
-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(許可がありません)
ってなってて名前解決されてる。