審計(jì) Linux 系統(tǒng)的操作行為的 5 種方案對(duì)比


來(lái)源:http://blog.arstercz.com/how-to-audit-linux-system-operation/
很多時(shí)候我們?yōu)榱税踩珜徲?jì)或者故障跟蹤排錯(cuò),可能會(huì)記錄分析主機(jī)系統(tǒng)的操作行為。比如在系統(tǒng)中新增了一個(gè)用戶,修改了一個(gè)文件名,或者執(zhí)行了一些命令等等,理論上記錄的越詳細(xì), 越有利于審計(jì)和排錯(cuò)的目的。不過(guò)過(guò)剩的記錄也會(huì)為分析帶來(lái)不少麻煩, 尤其是將很多主機(jī)的記錄行為發(fā)送到固定的遠(yuǎn)程主機(jī)中,數(shù)據(jù)越多,分析的成本便越大。
忽略 cron,daemon 產(chǎn)生的記錄;
忽略帶密碼的敏感命令行或腳本操作記錄;
忽略監(jiān)控用戶(比如 nagios,zabbix,promethus 等)產(chǎn)生的記錄;
忽略頻繁產(chǎn)生日志的操作行為;
history 記錄方式 定制 bash 記錄方式 snoopy 記錄方式 auditd 記錄方式 eBPF 記錄方式
history 記錄方式
history 方式 很傳統(tǒng)也很簡(jiǎn)單,本質(zhì)上是將歷史的命令發(fā)送到 syslog 日志中,可以用來(lái)簡(jiǎn)單記錄用戶的命令操作歷史。但是這種方式有幾個(gè)重要的缺點(diǎn),并不適合審計(jì)的目的:
容易被修改,被繞過(guò); 記錄太簡(jiǎn)單,沒(méi)有上下文信息(比如 pid, uid, sid 等); 無(wú)法記錄 shell 腳本內(nèi)的操作; 無(wú)法記錄非登錄的操作; 難以實(shí)現(xiàn)過(guò)濾規(guī)則;
定制 bash 記錄方式
容易被繞過(guò),用戶可以使用 csh,zsh 等; 無(wú)法記錄 shell 腳本內(nèi)的操作; 過(guò)濾規(guī)則可能單一; 可能需要不停的更新 bash 版本,工作量大,否則容易被發(fā)行版替換;
snoopy 記錄方式
難以繞過(guò),只要設(shè)置了 PRELOAD,就肯定會(huì)記錄;
無(wú)論是否存在 tty 會(huì)話,都會(huì)記錄 execv,execve 相關(guān)的命令行操作,包含詳細(xì)的進(jìn)程上下文信息;
可以記錄 shell 腳本內(nèi)部的操作行為,腳本內(nèi)的命令行操作大部分都會(huì)調(diào)用 execv,execve;
可以記錄操作行為的參數(shù), 比如指定了用戶名,密碼等;
過(guò)濾規(guī)則豐富,可以忽略指定 daemon,uid,也可以僅記錄指定的 uid;
如下日志示例:
Oct 27 11:34:31 cz-t1 snoopy[24814]: [time_ms:778 login:cz uid:0 pid:24814 ppid:24676 sid:24579 tty:/dev/pts/0 cwd:/root filename:/bin/uptime username:root]: uptime -p
上述日志顯示 root 用戶執(zhí)行了uptime命令,參數(shù)包含?-p對(duì)應(yīng)的進(jìn)程上下文信息都比較全,不過(guò) snoopy 的缺點(diǎn)也比較明顯,主要包含以下幾點(diǎn):
僅支持 execv,execve 相關(guān)系統(tǒng)調(diào)用的操作; 不設(shè)置規(guī)則可能產(chǎn)生的日志過(guò)多,對(duì)日志搜集系統(tǒng)造成很大的負(fù)擔(dān); 暫不支持過(guò)濾敏感信息規(guī)則;
在實(shí)際的使用中,snoopy 記錄方式可以很詳細(xì)的記錄所有的命令操作信息,幫助我們定位很多疑難問(wèn)題。不過(guò)我們也需要通過(guò)過(guò)濾規(guī)則來(lái)避免產(chǎn)生過(guò)多的信息,snoopy 的過(guò)濾規(guī)則可以滿足以下需求:
忽略 cron,daemon 產(chǎn)生的記錄;
忽略監(jiān)控用戶(比如 nagios,zabbix,promethus 等)?產(chǎn)生的記錄;
比如以下配置,即可忽略 crond,my-daemon 守護(hù)進(jìn)程,忽略 zabbix 用戶:
# zabbix uid 為 992filter_chain = exclude_uid:992;exclude_spawns_of:crond,my-daemon
備注:過(guò)濾規(guī)則在(filtering.c - snoopy_filtering_check_chain)函數(shù)實(shí)現(xiàn),由 log.c - snoopy_log_syscall_exec 函數(shù)調(diào)用,過(guò)濾規(guī)則為事后行為,即在打印日志的時(shí)候判斷是否滿足過(guò)濾規(guī)則,并非事前行為。
另外,我們?cè)?snoopy 的基礎(chǔ)上增加了 exclude_comm 過(guò)濾規(guī)則,我們可以忽略記錄指定的命令,比如以下:
filter_chain = exclude_uid:992;exclude_comm:mysql,mongo,redis-cli
auditd 記錄方式
type=SYSCALL msg=audit(1603800704.305:5304075): arch=c000003e syscall=59 success=yes exit=0 a0=1c79fd0 a1=1bf51a0 a2=1bd4450 a3=7ffe7270d320 items=2 ppid=95264 pid=99702 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=571973 comm="mysql" exe="/usr/bin/mysql" key="command"type=EXECVE msg=audit(1603800704.305:5304075): argc=5 a0="/usr/bin/mysql" a1="-h" a2="127.0.0.1" a3="-P" a4="3301"
auditd 整體上為分離的架構(gòu),auditctl 可以控制 kauditd 生成記錄的策略,kauditd 生成的記錄事件會(huì)發(fā)送到 auditd 守護(hù)程序,audisp 可以消費(fèi) auditd 的記錄到其它地方。其主要的幾個(gè)工具包含如下:
### ignore common tools-a never,exit -F arch=b64 -F exe=/usr/bin/redis-cli-a never,exit -F arch=b64 -F exe=/usr/bin/mysql-a never,exit -F arch=b64 -F exe=/usr/bin/mongo....## Kernel module loading and unloading-a always,exit -F perm=x -F auid!=-1 -F path=/sbin/insmod -k modules....
never 和 always 所能支持的 -F 過(guò)濾字段不盡相同, 如果要按照 exe 忽略指定的工具路徑, 只能通過(guò) never 實(shí)現(xiàn), exe 為執(zhí)行工具的路徑, 需要設(shè)置其絕對(duì)值, 這點(diǎn)沒(méi)有 snoopy 的 exclude_comm 方便.
更多規(guī)則設(shè)置見(jiàn): audit-define
eBPF 記錄方式
# ./execsnoopPCOMM PID PPID RET ARGSbash 32647 32302 0 /bin/bashid 32649 32648 0 /usr/bin/id -unhostname 32651 32650 0 /usr/bin/hostnameuptime 410 32744 0 /bin/uptime
總結(jié)
從上述介紹可以看到,審計(jì)系統(tǒng)的操作行為其實(shí)就是為了更方便的追溯和排查問(wèn)題,審計(jì)所產(chǎn)生的日志記錄本身也可以作為取證的材料。一些對(duì)安全敏感的企業(yè)可以通過(guò) auditd 方式來(lái)實(shí)現(xiàn)不同級(jí)別的審計(jì)標(biāo)準(zhǔn)。
在實(shí)際的使用中,我們建議通過(guò) snoopy 或 auditd 來(lái)實(shí)現(xiàn)系統(tǒng)操作的審計(jì)需求,一些細(xì)致的記錄追蹤可以通過(guò) eBPF 方式實(shí)現(xiàn)。另外也可以將審計(jì)的日志發(fā)送到 ELK 等日志平臺(tái)做一些策略方面的告警,不過(guò)在具體的實(shí)踐中,我們需要做好詳細(xì)的過(guò)濾規(guī)則避免產(chǎn)生大量重復(fù)且收效甚微的數(shù)據(jù)。
推薦閱讀:
記住看小電影前一定要檢查一下域名是不是 ?HTTPS 的,不然……
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲取??!
