知识宝库在此藏,一键关注获宝藏
1. 启动audit内核模块
有些系统audit的内核模块时默认关闭。可以查看/proc/cmdline,若存在audit=0,则默认不启动audit。通过设置/boot/grub2/grub.cfg文件,使audit=1,或者去掉audit=0,然后重启系统,使audit内核模块启动。在此查看/proc/cmdline已修改为audit=1。
如果audit的内核模块启动了,用auditctl -s 查询enabled为1,但是用户空间的auditd守护进程没有运行(auditd进程为dead状态),审计日志无人接管,就会被写入到/var/log/messages 中。(PS:自己测试centos 7.x,已证实该结论正确。)
1.1 测试enabled对应值对审计记录的影响:
观察audit.log、messages文件不再记录audit日志
②此时auditd进程关闭,rsyslog进程正常运行
![Linux测评延展知识 — 读懂audit 审计 Linux测评延展 — audit 审计]()
![Linux测评延展知识 — 读懂audit 审计 Linux测评延展 — audit 审计]()
经测试,使用passwd test 命令,结果如下
![Linux测评延展知识 — 读懂audit 审计 Linux测评延展 — audit 审计]()
![Linux测评延展知识 — 读懂audit 审计 Linux测评延展 — audit 审计]()
结论:audit日志将记录在messages文件中,audit.log文件中将不再记录相应日志信息
messages、audit.log文件均不再记录相应日志信息
2. 启动auditd守护进程
我们习惯使用systemctl start xxx 来启动一个服务,但是auditd手册中,明确指出使用service命令是唯一一个正确开启auditd守护进程的方式。
systemctl stop auditd.service 无法关闭
systemctl start auditd.service 可以开启
service audit start 先确认服务为关闭状态
虽然显示要你用systemctl 但是还是启动成功了
正常一个服务,我们使用service xx start 时都会显示Redirecting to /bin/systemctl start xxx.service。我们可以通过which service来查看这个命令的源文件,/usr/sbin/service。这里对于不同的情况,有不同的处理。
2) /usr/libexec/initscripts/legacy-actions目录下有这个服务;
3) 除了以上两种情况,其他情况下会定向到systemctl cmd xxx.service。
auditd属于第二种情况,/usr/libexec/initscripts/legacy-actions目录有auditd目录,如下:
systemctl reload auditd.service
两个命令均生效,重新加载auditd的配置文件/etc/audit/auditd.conf
强制立即循环日志文件,老的日志文件将被命名为audit.log.N
当日志记录停止时,用于恢复日志记录(暂不清楚什么情况下用的)。
service auditd condrestart
condrestart是conditional restart(条件重新启动)的意思,如果服务当前已经是运行的话,它可以重启这个服务,但是如果服务没有运行,condrestart是无法启动这个服务的,而restart都可以。
但好像对于centos 7.x这块好像都一样,condrestart也能启动未启动的服务。
![Linux测评延展知识 — 读懂audit 审计 Linux测评延展 — audit 审计]()
3. auditctl -s
通过auditctl -s查询可以看到audit的状态,这个是查询audit内核模块的状态
其中“enabled”这个选项很重要,如果值为0,贼代表audit不工作,看不到任何审计日志,哪怕是系统日志messages。无论是使用auditctl临时配置规则、还是用/etc/audit/audit.rules文件永久配置规则,所有规则设定都要在enabled为1时才可以生效。
当enabled为2时,则表示规则锁定,所有设置都不起作用。
服务是服务,enable是enable,这两者没有关系,服务启动或停止是针对auditd这个守护进程。auditctl -s查询的enabled的状态为audit内核模块的状态。内核模块主要用来获取审计信息,用户态的守护进程主要用来收集信息和记录日志。enabled为1,服务停止,日志会记录在messages中;enable为0,服务启动,没有任何审计信息,不会记录日志。也就是auditd服务是否启动,决定日志记录在哪里,启动了,日志记录在配置文件指定的路径,没有启动,记录在messages日志中。enable决定内核是否开始审计,为0,不启动,为1,启动。
4. auditd守护进程配置文件
通过/etc/audit/auditd.conf 文件进行配置,默认的auditd配置文件可以满足大多数环境要求。
log_file = /var/log/audit/audit.log
#当设置为RAW时,数据会以从内核中检索到的格式写到日志文件中。
#当设置为NOLOG时,数据不会写到日志文件中,但是如果用dispatcher选项指定了一个,则数据仍然会发送到审计事件调度程序中
#审计应采用多少优先级推进守护进程。必须是非负数。0表示没有变化。
#多长时间向日志文件中写一次数据。值可以是NONE、INCREMENTAL、DATA和SYNC之一。
#如果设置为NONE,则不需要做特殊努力来将数据刷新到日志文件中。
#如果设置为INCREMENTAL,则用freq选项的值确定多长时间发生一次向磁盘的刷新。
#如果设置为DATA,则审计数据和日志文件一直是同步的。
#如果设置为SYNC,则每次写到日志文件时,数据和元数据是同步的
#如果flush设置为INCREMETNAL,审计守护进程在写到日志文件中前从内核中接收的记录数
#max_log_file_action设置为ROTATE时要保存的日志文件数目。必须是0~99之间的数。如果设置为小于2,则不会循环日志。如果递 增了日志文件的数目,就可能有必要递增/etc/audit/audit.rules中的内核backlog设置值,以便留出日志循环的时间。如果没有设 置num_logs值,它就默认为0,意味着从来不循环日志文件。
#控制调度程序与审计守护进程之间的通信类型。有效值为lossy和lossless。
#如果设置为lossy,若审计守护进程与调度程序之间的缓冲区已满 (缓冲区为128千字节),则发送给调度程序的引入事件会被丢弃。然而,只要log_format没有设置为nolog,事件就仍然会写到磁盘中。如果设置为lossless,则在向调度程序发送事件之前和将日志写到磁盘之前,调度程序会等待缓冲区有足够的空间。
dispatcher = /sbin/audispd
#以兆字节表示的最大日志文件容量。当达到这个容量时,会执行max_log_file _action指定的动作
#当达到max_log_file的日志文件大小时采取的动作。值必须是IGNORE、SYSLOG、SUSPEND、ROTATE和KEEP_LOGS之一。
#如果设置为IGNORE,则在日志文件达到max_log_file后不采取动作。
#如果设置为SYSLOG,则当达到文件容量时会向系统日志/var /log/messages中写入一条警告。
#如果设置为SUSPEND,则当达到文件容量后不会向日志文件写入审计消息。
#如果设置为ROTATE,则当达到指定文件容量后会循环日志文件,但是只会保存一定数目的老文件,这个数目由num_logs参数指定。老文件的文件名将为audit.log.N,其中 N是一个数字。这个数字越大,则文件越老。
#如果设置为KEEP_LOGS,则会循环日志文件,但是会忽略num_logs参数,因此不会删除日志文件。
max_log_file_action = ROTATE
#以兆字节表示的磁盘剩余空间。当达到这个水平时,会采取space_left_action参数中的动作
#当磁盘空间量达到space_left中的值时,采取这个动作。有效值为IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和 HALT。
#如果设置为SYSLOG,则向系统日志/var/log/messages写一条警告消息,停止记录日志。
#如果设置为EMAIL,则从action_mail_acct向这个地址发送一封电子邮件向/var/log/messages中写一条警告消息。
#如果设置为SUSPEND,则不再向审计日志文件中写警告消息。
#如果设置为SINGLE,则系统将在单用户模式下运行,让管理员释放磁盘空间。
space_left_action = SYSLOG
#负责维护审计守护进程和日志的管理员的电子邮件地址。如果地址没有主机名,则假定主机名为本地地址,比如root。
#必须安装sendmail并配置为向指定电子邮件地址发送电子邮件
#以兆字节表示的磁盘空间数量。用这个选项设置比space_left_action更多的主动性动作,以防万一space_left_action没有让管理员释放任何磁盘空间。这个值应小于space_left_action。如果达到这个水平,则会采取admin_space_left_ action所指定的动作。
#如果含有这个审计文件的分区已满,则采取这个动作。可能值为IGNORE、SYSLOG、SUSPEND、SINGLE和HALT。与这些值关联的动作,与space_left_action中的相同。
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
这是一个数字值,该值表示一个地址允许有多少个并发连接。默认为1,最大为1024。设置过大可能会允许拒绝服务攻击的日志服务器。
tcp_client_ports = 1024-65535
如果设置为“yes”,Kerberos 5将用于认证和加密。默认是“no”
krb5_key_file = /etc/audit/audit.key
5. audit 审计规则配置
audit可以配置审计规则,这个规则主要是给内核模块下发的,内核audit模块会按照这个规则获取审计信息,发送给auditd来记录日志。
文件系统规则:也可以认为是文件监控,可以监控一个特定文件或者一个路径。
audit规则可以通过auditctl,在命令行里输入,这些设置的规则为临时的,当系统重启后就不存在了。可以通过配置/etc/audit/audit.rules文件,当每次audit服务启动后,都会从这个文件来加载规则。
1)控制规则
auditctl [options]
-b <backlog>
设置在内核中audit缓冲空间的最大值(默认为64),若缓冲沾满了,则kernel会发出一个失败标记。
-e [0|1|2]
设置0,关闭audit;设置1,开启audit;设置2,表示锁定,一般在设置完其他规则后最后设置,防止其他人修改规则,任何修改规则的行为都会被拒绝,并且记录审计日志,只有当系统重启后,这个使能标志才能被修改。
-f 这个选项来决定内核如何处理,设置失败标记的等级,值为0,1,2三种,0为不输出日志,1为输出printk日志,2为最高级,将大量输出日志信息。
-s 输出audit内核状态信息
-l 列出所有当前配置的规则
2)文件系统规则
auditctl -w path_to_file -p permissions -k key_name
path_to_file 要做审计的文件或路径;
permissions 要记录的许可:rwx文件或路径的读写执行,a修改文件或路径的属性
key_name 为一个可选字符串,明确哪些规则产生的日志。过滤时可使用
定义规则,记录所有对/etc/passwd文件的写入以及属性修改:
auditctl -w /etc/passwd -p wa -k passwd_chages
记录所有对/etc/selinux/目录的写入以及属性修改:
auditctl -w /etc/selinux -p wa -k selinux_chages
记录所有执行了/sbin/insmod命令,向内核插入模块的:
auditctl -w /sbin/insmod -p x -k module_insertion
3)系统调用规则
auditctl -a action,filter -S system_call -F field=value -k key_name
action和filter 明确一个事件被记录。action可以为always或者never,fileter明确出对应的匹配过滤,filter可以为:task,exit,user,exclude。
system_call 明确出系统调用的名字,几个系统调用可以卸载一个规则里,
如-S xxx -S xxx。系统调用的名字可以在/usr/include/asm/unistd_64.h文件中找到。
field=value 作为附加选项,修改规则以匹配特定架构、GroupID,ProcessID等的事件。
如auditctl -a exit,always -S umask -S chown是监控对umask、chown命令的调用
定义一个规则,当每次使用系统调用adjtimex或者settimeofday时,
auditctl -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_chage
一个文件被user ID为1000或者更大的用户删除,或重命名,记录审计:
auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 auid!=4294967295 -k delete
注意, -F auid!=4294967295 这个是为了排除login UID没有被设置的用户。
也可以通过系统调用规则,用来定义文件系统规则,如下的系统调用规则,与-w /etc/shadow -p wa 的文件系统规则等同:
auditctl -a always,exit -F path=/etc/shadow -F perm=wa
6. audit永久生效的规则配置
定义reboot系统后,仍然生效的审计规则,有两种办法:
1) 直接写入/etc/audit/audit.rules文件中
ExecStartPost=-/sbin/auditctl -R /etc/audit/audit.rules
auditctl -R path-to-rules,如
auditctl -R /etc/audit/reles.d/30-pci-dss.rules
2) 将规则文件放入到/etc/audit/rules.d
● 7.x以后不能直接卸载audit.rules文件中
这个文件是从/etc/audit/rules.d 自动生成的
在service文件中加入 augenrules --load (7.x自带)
使用这个命令可以将/etc/audit/rules.d目录下的规则,按照顺序编辑到audit.rules中。
在/usr/share/doc/audit-2.8.5/rules/ 路径下,audit包提供了已经配置好的规则文件,用于各种认证,如PCI DSS,STIG等。如下:
![Linux测评延展知识 — 读懂audit 审计 Linux测评延展 — audit 审计]()
注意,每个rules有一个数字,这些表示的是加载顺序。如果需要pci-dss认证的规则,可以将10-base-config,30-pci-dss-v31,一级99-finalize拷贝到rules.d目录下。然后再使用augenrules --load 命令将这些规则加载进来。
这些规则分类如下:
10 - Kernel and auditctl configuration
20 - Rules that could match general rules but you want a different match
30 - Main rules
40 - Optional rules
50 - Server-specific rules
70 - System local rules
90 - Finalize (immutable)
使用audictl -R 可以加载多个规则文件,不会覆盖,使用augenrules --load后,之前的规则就没有了。
7. 读懂audit日志
1) 构造一条audit日志
首先我们来构造一条audit日志。在home目录下新建一个目录,然后配置一条audit规则,对这个目录的wrax,都记录审计日志:
auditctl -w /home/test/ -p wrax -k audit_test
root用户访问/home/test/目录时,即使用ls /home/test/命令,审计日志如下:
type=SYSCALL msg=audit(1591087544.072:570): arch=c000003e syscall=257 success=yes exit=3 a0=ffffffffffffff9c a1=dc25b0 a2=90800 a3=0 items=1 ppid=10893 pid=13492 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=4 comm="ls" exe="/usr/bin/ls" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="audit_test"
type=CWD msg=audit(1591087544.072:570): cwd="/"
type=PATH msg=audit(1591087544.072:570): item=0 name="/home/test" inode=16932 dev=fd:00 mode=040700 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_home_dir_t:s0 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1591087544.072:570): proctitle=6C73002D2D636F6C6F723D6175746F002F686F6D652F74657374
2) 日志分析
当我使用su命令切换到test用户时,再访问/home/test目录,具体日志如下:
type=SYSCALL msg=audit(1591088222.887:678): arch=c000003e syscall=257 success=yes exit=3 a0=ffffffffffffff9c a1=1e645b0 a2=90800 a3=0 items=1 ppid=14147 pid=14190 auid=0 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts1 ses=17 comm="ls" exe="/usr/bin/ls" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="audit_test"
type=CWD msg=audit(1591088222.887:678): cwd="/home/test"
type=PATH msg=audit(1591088222.887:678): item=0 name="/home/test" inode=16932 dev=fd:00 mode=040700 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_home_dir_t:s0 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1591088222.887:678): proctitle=6C73002D2D636F6C6F723D6175746F002F686F6D652F74657374
type=SYSCALL
每条记录都是以type=“keyword”开头,SYSCALL表示这条记录是向内核的系统调用触发产生的。
msg=audit(1591088222.887:678)
在audit(time_stamp:ID)格式中,记录的时间,从1970年1月1日00:00:00到现在的时间,ID为记录中唯一的ID标识,同一个事件产生的ID是相同的,如上访问test目录会触发产生三条日志,但是事件ID是相同的。
其中,时间可以用date命令转换格式,date --date=@******:
![Linux测评延展知识 — 读懂audit 审计 Linux测评延展 — audit 审计]()
arch=c000003e
表示系统CPU架构,这个十六进制表示“x86_64”。
syscall=257
向内核的系统调用的类型,类型值为257,在/usr/include/asm/unistd_64.h定义,这里257表示openat,可以使用命令ausyscall来查询不同的数字对应的系统调用名称。或者使用ausyscall --dump命令来显示所有的系统调用。
![Linux测评延展知识 — 读懂audit 审计 Linux测评延展 — audit 审计]()
success=yes
表示调用成功与否
exit=3
系统调用结束时的返回码,不同的系统调用,返回值不同。
a0=ffffffffffffff9c a1=1e645b0 a2=90800 a3=0
为系统调用时的前四个arguments,这些arguments依赖于使用的而系统调用,可以使用ausearch来查看解释(部分参数可以打印出数值具体的解释)
items=1
表示跟在系统调用后,补充记录的个数。
ppid=14147
父进程ID。
pid=14190
进程ID,该处表示ls进程的ID。
audit=0
auid记录Audit user ID,that is the loginuid。当我使用root账户登录系统时,再使用su命令切换到test用户,使用ls命令,此时auid为0。
auid为登录用户的ID,如果是root,ID为0,并且即使使用su更换了用户,每个进程事件的auid还是初始那个登录用户的ID。
uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000
uid为启动这个分析进程的用户的ID,即具体执行进程的用户ID。后面分别对应,group ID,effective user ID, set user ID, file system user ID, effective group ID, set group ID, file system group ID。
tty=pts1
具体在哪个终端tty执行的操作。如执行passwd这个操作是在哪个终端进行的。
ses=17
session ID,对话ID
comm="ls"
什么命令导致的审计记录,这里是ls,ls访问读取了这个目录,故记录了审计日志。
exe="/usr/bin/ls"
type值为CWD,即current working directory(当前工作目录)。
在第三条记录中,type字段值是PATH。审核事件包含作为参数传递给系统调用的每个路径的路径类型记录。在此审核事件中,只有一个路径用作参数。
item字段指示在SYSCALL类型记录中引用的项目总数中,当前记录是哪个项目。这个数字是从零开始的;值0表示它是第一项。
当我访问test这个目录时,是直接在这个目录下执行ls的,这个name字段记录系统调用时文件或目录的full path(完整路径)。
若我直接在test目录下执行ls,name值为. 完整命令就对应为ls .
若我在/test/test1目录中访问test目录,则完整命令为ls ../test1
inode表示这个文件或目录的inode number,可以使用如下命令来查询当前inode对应的文件。
find / -inum 16932 -print
也可以使用stat命令来查询文件或目录的inode number
dev字段,指明device的minor和major ID。
the object owner's user ID,对象所有者的用户ID。
the object owner's group ID,对象所用户组ID。
rdev字段只包含记录的特殊文件的设备标识符。在这种情况下,不会使用它,因为记录的文件是常规文件。
objtype字段记录给定系统调用上下文中每个路径记录操作的意图。
3) 使用ausearch查看日志
ausearch这个工具,可以针对指定的事件来搜索audit日志文件。默认情况下,ausearch搜索/var/log/audit/audit.log 这个文件。
经过测试,应该是能在/var/log/audit/目录下搜索通过轮替后产生的audit.log.N文件
自身重命名的N也可以,但是N必须是连贯的,如果N=10,但是没有1-9的文件,他就无法读取到audit.log.10中的内容
#只显示事件ID为指定数字的日志信息,如只显示470事件
#只显示和指定命令有关的事件,如只显示touch命令产生的事件
#显示出的信息更清晰,如事件事件、相关用户名都会直接显示出来,而不再是数字形式
#显示出和之前auditctl -k 所定义的关键词相匹配的事件信息,如audit_test
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设定的字符串查找
以上的命令可以联合使用,例如我查询使用touch命令,关键词定义audit_test,更清晰的显示日志
① 搜索/var/log/audit/audit.log对于失败的登录尝试
ausearch --message USER_LOGIN --success no --interpret
ausearch -m ADD_USER -m DEL_USER -m ADD_GROUP -m USER_CHAUTHTOK -m DEL_GROUP -m CHGRP_ID -m ROLE_ASSIGN -m ROLE_REMOVE -i
ausearch --start yesterday --end now -m SYSCALL -sv no -i
原文始发于微信公众号(等保不好做啊):Linux测评延展知识 — 读懂audit 审计
评论