讓我們先來構造一條audit日志。在home目錄下新建一個目錄,然后配置一條audit規則,對這個目錄的wrax,都記錄審計日志:
auditctl -w /home/audit_test -p wrax -k audit_test
root用戶訪問audit_test目錄時,即在這個目錄下ls,審計日志如下:
type=SYSCALL msg=audit(1523501721.433:4172989307): arch=c000003e syscall=257 success=yes exit=3 a0=ffffffffffffff9c a1=21e0550 a2=90800 a3=0 items=1 ppid=13329 pid=18721 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=10711 comm="ls" exe="/usr/bin/ls" key="audit_test"
type=CWD msg=audit(1523501721.433:4172989307): cwd="/home/audit_test"
type=PATH msg=audit(1523501721.433:4172989307): item=0 name="." inode=99213313 dev=08:11 mode=040755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL
使用ausearch命令可以看到這條日志的解釋,使日志中的一些我們看不懂的參數轉換為可讀形式:
type=SYSCALL msg=audit(04/12/2018 10:55:21.433:4172989307) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffffffffffff9c a1=0x21e0550 a2=O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC a3=0x0 items=1 ppid=13329 pid=18721
auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts2 ses=10711 comm=ls exe=/usr/bin/ls key=audit_test
type=CWD msg=audit(04/12/2018 10:55:21.433:4172989307) : cwd=/home/audit_test
type=PATH msg=audit(04/12/2018 10:55:21.433:4172989307) : item=0 name=. inode=99213313 dev=08:11 mode=dir,755 ouid=root ogid=root rdev=00:00 objtype=NORMAL
其他用戶訪問audit_test時,審計日志如下:
type=SYSCALL msg=audit(1523501777.709:4172989316): arch=c000003e syscall=257 success=yes exit=3 a0=ffffffffffffff9c a1=10ce550 a2=90800 a3=0 items=1 ppid=2354 pid=30729 auid=0 uid=1001 gid=1001 euid=1001 suid=1001 fsuid=1001 egid=1001 sgid=1001 fsgid=1001 tty=pts1 ses=9870 comm="ls" exe="/usr/bin/ls" key="audit_test"
type=CWD msg=audit(1523501777.709:4172989316): cwd="/home/audit_test"
type=PATH msg=audit(1523501777.709:4172989316): item=0 name="." inode=99213313 dev=08:11 mode=040755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL
type=SYSCALL msg=audit(04/12/2018 10:56:17.709:4172989316) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffffffffffff9c a1=0x10ce550 a2=O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC a3=0x0 items=1 ppid=2354 pid=30729
auid=root uid=lbh gid=lbh euid=lbh suid=lbh fsuid=lbh egid=lbh sgid=lbh fsgid=lbh tty=pts1 ses=9870 comm=ls exe=/usr/bin/ls key=audit_test
type=CWD msg=audit(04/12/2018 10:56:17.709:4172989316) : cwd=/home/audit_test
type=PATH msg=audit(04/12/2018 10:56:17.709:4172989316) : item=0 name=. inode=99213313 dev=08:11 mode=dir,755 ouid=root ogid=root rdev=00:00 objtype=NORMAL
下面我們來分析每個字段的含義:
type=SYSCALL
每條記錄都是以type=”keyword“開頭,SYSCALL表示這條記錄是向內核的系統調用觸發產生的。更詳細的type值和解釋可以參考:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/sec-Audit_Record_Types
msg=audit(1523501777.709:4172989316)
在audit(time_stamp:ID)格式中,記錄時間戳,從1970年1月1日00:00:00到現在的時間,ID為記錄中唯一的ID標識,同一個事件產生的ID是相同的,如上訪問audit_test目錄會觸發產生三條日志,但是事件ID是相同的。
arch=c000003e
表示系統的CPU架構,這個十六進制表示”x86_64“,使用命令ausearch -i --arch c000003e可以打印出有這部分內容的audit.log中日志的解釋。需要注意的是,使用ausearch來查詢時,需要保證audit log中有這樣的日志記錄。
syscall=257
向內核的系統調用的類型,類型值為257,在/usr/include/asm/unistd_64.h中有定義,這里257表示openat,可以使用命令ausyscall來查詢不同的數字對應的系統調用名稱。或者使用ausyscall --dump命令來顯示所有的系統調用。
# ausyscall 257 openat
# ausyscall --dump
Using x86_64 syscall table:
0 read
1 write
2 open
……
success=yes
表示系統調用成功與否
exit=3
系統調用結束時的返回碼,可以使用如下命令來查看返回值為3的日志解釋,不同的系統調用,返回值不同。
#ausearch --interpret --exit 3
a0=ffffffffffffff9c a1=21e0550 a2=90800 a3=0
為系統調用時的前四個arguments,這些arguments依賴於使用的系統調用,可以使用ausearch來查看解釋(部分參數可以打印出數值具體的解釋)。
items=1
表示跟在系統調用后,補充記錄的個數。
ppid=2354
父進程ID,如bash的ID。
pid=30729
進程Id,即為ls進程的ID。我們通過ps來查詢,可以看到bash的進程與ppid是對應的
linux-xdYUnA:/home/audit_test # ps -aux | grep bash lbh 2354 0.0 0.0 115376 2100 pts/1 S+ Apr11 0:00 bash root 12478 0.0 0.0 115888 2608 pts/0 Ss Apr11 0:00 -bash root 13329 0.1 0.0 115888 2612 pts/2 Ss 11:15 0:00 -bash root 15531 0.0 0.0 112652 972 pts/2 S+ 11:15 0:00 grep --color=auto bash root 30707 0.0 0.0 115888 2632 pts/1 Ss Apr11 0:00 -bash