Help us understand the problem. What is going on with this article?

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

More than 3 years have 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(許可がありません) ってなってて名前解決されてる。

crowdworks
21世紀の新しいワークスタイルを提供する日本最大級のクラウドソーシング「クラウドワークス」のエンジニアチームです!
https://crowdworks.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away