Auditd工具可以帮助运维人员审计Linux,分析发生在系统中的发生的事情。Linux 内核有用日志记录事件的能力,包括记录系统调用和文件访问。管理员可以检查这些日志,确定是否存在安全漏洞(如多次失败的登录尝试,或者用户对系统文件不成功的访问)。
1 安装Centos7默认已安装Audit 使用命令service auditd status可查看该服务是否开启
2 配置文件在/etc/audit路径下 auditd.conf文件 ----审计工具的配置文件 audit.rules文件 ----审计的规则,该文件由/etc/audit/rules.d产生 audit-stop.rules文件 ----审计停止规则,该文件定义了停止检测 rules.d目录 ----定义需要审计的规则,写到文件之后会永久有效
如下是auditd.conf,审计工具配置文件。在该文件中,用中文增加了对应的参数值解释。详细解释,可查阅官方解释:https://linux.die.net/man/8/auditd.conf
3 auditd工具 auditctl:auditd默认操作命令 aureport:生成和查看审计规则的文件 ausearch:是一个搜索各种事件的工具 autrce:用于跟踪进程的命令
3.1 auditctl命令 auditctl –l 查看当前定义的规则 auditctl –a 添加一条检测规则(当前添加的规则临时有效,永久生效需要修改配置文件) auditctl -a action,filter -S system_call -F field=value -k key_nameaction和filter 明确一个事件被记录。action可以为always或者never,filter明确出对应的匹配过滤,filter可以为:task、exit、user、exclude。 system_call 明确出系统调用的名字,几个系统调用可以写在一个规则里,如-S xxx -S xxx。系统调用的名字可以在/usr/include/asm/unistd_64.h文件中找到。其中字段中具体解释,参考: https://blog.csdn.net/xiyangfan/article/details/5259258 field=value 作为附加选项,修改规则以匹配特定架构、GroupID,ProcessID等的事件。具体有哪些字段,可以参考https://linux.die.net/man/8/auditctl 如:一个文件被user ID为1000或者更大的用户删除,或重命名,记录审计,命令如下:
auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete auditctl -a always,exit -F path=/etc/shadow -F perm=wa等价于 auditctl –w /etc/shadow –p wa
auditctl –d 删除一条规则 auditctl –D 删除所有规则 auditctl –w 指定要审计的文件或目录路径 auditctl –p[r|w|x|a] 和-w一起使用指定触发审计的文件/目录的访问权限rwxa : 指定的触发条件,r 读取权限,w 写入权限,x 执行权限,a 属性(改变在文件或者目录中的属性)
auditctl –k 指定别名,方便下次审计时可以根据该名字进行调用,并查看相关的信息 auditctl –s 查看auditd服务状态 auditctl -e 设置使能标志设置为0,关闭audit,设置为1,开启audit;当设置为2时,表示锁定,一般在设置完其他规则后最后设置,防止其他人修改规则;任何修改规则的行为都会被拒绝,并且记录审计日志,只有当重启系统后,这个使能标志才可以被修改。
3.2 aureport命令aureport 生成总结性记录
-au关于身份验证的报表-c关于配置更改的报表-cr关于加密事件的报表-e关于事件的报表-f关于文件的报表-i解释模式-if使用文件作为输入-h关于主机的报表-l有关登录的报表-k关于key的报表-m关于账户修改的报表-ma关于强制访问控制(MAC)事件的报表-p关于进程的报表-s关于系统调用的报表-tm关于终端的报表--node特定节点的事件--success在报表中只显示成功的事件--failed在报表中只显示失败的事件-n关于异常事件的报表--summary在报表中为主要对象排序总数-r关于异常事件响应的报表-t日志时间范围报表-te报表结束时间-ts报表起始时间--tty关于tty的报表-u关于用户的报表-x关于可执行文件的报表 3.3 ausearch命令 ausearch -a 5207 搜寻当前audit服务中event ID等于5207的logausearch –k xx 按指定别名查看审计内容ausearch –i 格式化输出ausearch –f 根据指定的审计目录或文件查看审计内容ausearch -m #按消息类型查找ausearch -ul #按登陆ID查找ausearch -ua #按uid和euid查找ausearch -ui #按uid查找ausearch -ue #按euid查找ausearch -ga #按gid和egid查找ausearch -gi #按gid查找ausearch -ge #按egid查找ausearch -c #按cmd查找ausearch -x #按exe查找ausearch -sc #按syscall查找ausearch -p #按pid查找ausearch -sv #按syscall的返回值查找(yes/no)ausearch -f #按文件名查找ausearch -tm #按连接终端查找(term/ssh/tty)ausearch -hn #按主机名查找ausearch -k #按特定的key值查找ausearch -w #按在audit rule设定的字符串查找 3.4 autrce为了跟踪设置的rule有没有生效,我们经常会追踪指定的进程,autrace生成的log会存放在/var/log/audit/audit.log。 当用autrace去跟踪一个进程时,为了保证避免autrace与之前audit rule生成的日志冲突,使用auditctl -D去停止所有的audit log, 当autrace结束后,使用systemctl restart auditd重启audit服务。
autrace /usr/bin/less 4 审计日志 4.1 例子添加如下两条审计的规则:
auditctl -w /root/chen/test.sh -p wxra -F uid=root -k auditest1 auditctl -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -S mkdir -S rmdir -S creat -F uid!=root -F dir=/root/chen/test -k auditest2添加完成之后用auditctl –l查看相关信息:
使用ausearch -k auditest1 -i 和ausearch -k auditest2 -i查看当前的审计日志 审计日志内容显示,当前审计规则已经录入 分别使用root和非root用户运行test.sh脚本,sh test.sh,此时再查看审计日志 此时可以使用命令ausearch –k auditest1 -i查看审计内容,只有root用户执行的命令被审计日志记录下来 同样在/root/chen/test目录下分别使用root和非root用户创建文件root和chen目录 使用命令ausearch -k auditest2 –i –c mkdir,只有非root用户创建文件夹的操作会被记录
4.2 审计日志内容分析 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
audit在audit(time_stamp:ID)格式中,记录时间戳,从1970年1月1日00:00:00到现在的时间,ID为记录中唯一的ID标识,同一个事件产生的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命令来显示所有的系统调用。
success=yes表示系统调用成功与否
exit=3系统调用结束时的返回码,可以使用如下命令来查看返回值为3的日志解释,不同的系统调用,返回值不同
#ausearch --interpret --exit 3a0=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是对应的
auid=0auid记录Audit user ID,that is the loginuid。auid为登录用户的ID,如果是root,ID为0。 uid=1001,gid=1001, euid=1001, suid=1001, fsuid=1001, egid=1001, sgid=1001, fsgid=1001 uid为启动这个分析进程的用户的ID,即具体执行进程的用户ID。后面分别对应着,group ID组用户ID,effective user ID有效用户ID, set user ID设置用户ID, file system user ID文件系统用户ID, effective group ID有效组用户ID, set group ID设置组用户ID, file system group ID文件系统组ID
tty=pts0具体在哪个终端tty执行的操作。如执行ls这个操作是在哪个终端进行的。
ses=10868session ID,对话ID。
comm=ls什么命令导致的审计记录。
exe=“/usr/bin/ls”记录可执行文件的具体路径
type=CWDtype值为CWD,即current working directory。记录的是当前进程的位置
inode=99213313inode表示这个文件或目录的inode number,可以用如下命令来查询当前inode对应的文件
find / -inum 99213313 -print dev=08:11dev字段,指明device的minor和major ID。
mode=040755mode字段表示文件或路径的权限。
ouid=0对象所有者的ID
ogid=0对象所有组者ID.
4.3 审计日志报告使用aureport命令可以生成日志报告
aureport –au 生成关于身份验证的报告 aureport –k –i 按之前设置的关键字生成报表 aureport –s 按系统调用生成报表 aureport –ts 02/02/2023 00:00:00 –te today 按指定时间生成报表 aureport -p –i 按进程的pid生成报表 aureport –t 按时间查看日志 aureport –if 按文件名生成报表