TheRiver | blog

You have reached the world's edge, none but devils play past here

0%

文件审计-auditd

目录

前言

文件系统是计算机信息系统中至关重要的资源,而文件监控正是监控系统安全状态,保证计算机系统安全的关键技术。在Linux系统中,诸如 /etc/passwd, /usr/local/sbin 的文件和目录尤为关键。任何对这些文件的破坏和篡改都会引起严重的安全问题。甚至造成系统瘫痪,因此我们有必要使用一种好的策略和工具来对文件系统进行保护。

audit简介

audit是linux系统中用于记录用户底层调用情况的系统,如记录用户执行的open、exit等系统调用。并会将记录写到日志文件中。在内核里有内核审计模块,核外有核外的审计后台进程auditd。应用进程给内核发送审计消息,内核的审计模块再把消息转发给用户空间的后台进程auditd处理

auditd工具

auditd是audit系统的用户空间程序.主要作用是将audit记录信息写到磁盘上
auditd在大多数linux系统中默认安装的,如果没有的话网上搜索下安装也比较简单

auditd在启动时会读取2个配置文件:
/etc/audit/auditd.conf   audit配置文件
/etc/audit/audit.rules   audit规则文件

auditd使用方法

  • auditd [ -f ]

选项-f表示让auditctl在前台运行,以方便调试,消息可以直接输出到stderr,而不是输出到log系统

auditctl

工具auditctl控制行为、得到状态、从内核审计系统增加或删除规则

选项名 选项的值 说明
-b 设置内核允许的缓冲区数,默认值为64
-e [0|1] 关闭或启动内核审计系统
-f [0..2] 设置失败标识0=silent 1=printk 2=panic,默认值为1。设置内核如何处理临界错误,如:backlog限制超出、内存错误等
-h 帮助信息
-i 当从文件中读取规则时忽略错误
-l 列出所有的规则,每行一条规则
-k [key] 设置审计规则上的过滤关键词key,key是不超过32字节长的任意字符串,它能唯一鉴别由watch产生的审计记录
-m text 仅由root用户发送用户空间消息到审计系统。为文件系统watch设置许可过滤器。r=read,w=write,x=execute,a=attribute change。这些许可不是文件的标准许可,而是系统调用使用的,read和write系统调用将忽略这种设置,否则它们将淹没log
-r [rate] 设置每秒传输的消息数限制,默认值为0,表示无限制
-R [file] 从file文件中读取规则
-s 报告状态
-a [l,a] 追加规则到l链表,a表示规则的动作
有效链表名l task 追加规则到每个任务链表AUDIT_FILTER_TASK 。域应用任务创建时的uid、gid等
有效链表名l entry 追加规则到系统调用进入链表AUDIT_FILTER_ENTRY,用于决定进入到系统调用时是否创建审计事件
有效链表名l exit 追加规则到系统调用退出链表AUDIT_FILTER_EXIT 。用于决定退出系统调用时是否创建审计事件
有效链表名l user 追加规则到用户消息过滤链表AUDIT_FILTER_USER ,内核在转播用户空间产生的事件到审计后台之前,用这个链表过滤这些事件。仅域为uid、auid、gid和pid时有效
有效链表名l exclude 用于过滤不想看到的事件,对应内核消息过滤链表AUDIT_FILTER_TYPE
规则的有效动作a never 不产生审计记录
规则的有效动作a always 分配一个审计上下文,在系统调用退出时填充
-A [l,a] 添加规则到l链表头,动作为a
-d [l,a] 从带有a动作的l链表删除规则
-D 删除所有的规则和watch
-S [系统调用名或号|all] 如果程序使用指定的系统调用,则它启动一项审计记录。如果给出域规则而没有指定系统调用,它将默认为所有系统调用
-F [n=v | n!=v | n<v | n>v | n<=v | n>=v] 创建一个规则域:名字、操作、值。可以单个命令行传递最多64个域。每个域必须启动一个审计记录。可支持6种操作:等于、不等于、小于、大于、小于或等于和大于或等于
-w [path] 为文件系统对象[path]插入一个watch(监视)。不支持匹配符
-W [path] 移去文件系统对象[path]上的watch
  • -F 对应的域

autrace

autrace是一个程序,它将添加审计规则、类似于strace跟踪一个进程,审计信息的结果将记录在审计log文件中。在目标程序执行的前后,它都将删除审计规则。目前没用,以后补充

ausearch

工具ausearch用于查询审计后台的日志,它能基于不同搜索规则的事件查询审计后台日志。每个系统调用进入内核空间运行时有个唯一的事件ID,系统调用在进入内核后的运行过程的审计事件共享这个ID

option full name description
-a --event audit-event-id 基于event ID检索(msg里包含time_stamp和eventID)
-c --comm 基于comm名称检索
-e --exit 基于exit code或errno检索
-f --file 基于filename检索
-ga --gid-all all-group-id 基于group ID或groupname检索
-ge --gid-effectuve effective-group-id 基于effective group ID或name检索
-gi --gid group-id 基于group ID或name检索
-h --help 帮助信息
-hn --host host-name 基于hostname检索,hostname不会进行解析
-i --interpret 将数字编码解析问字符串(很多字段都进行了数字编码,通过此参数还原)
-if --input file-name 搜索给定的文件,而不会去系统的audit日志中检索。通过这个参数可以将日志导出到其他机器上进行检索
--input-logs 使用auditd.conf中配置的日志文件路径来做检索,该参数用于写cron job的时候配合使用
--just-one 当出现了第一条匹配的日志时即停止检索,所以只会检索出第一条匹配的结果
-k --key key-string 基于key进行检索
-l --line-buffered 如果默认的缓冲规则不能满足需要,通过此参数可以将每条输出都立即flush到连接的stdout流中
-m --message message-type |comma-sep-message-type-list 使用messagetype进行索引,可以指定某个type,也可以使用“逗号”将多个messagetype并列起来,逗号两侧不能有空格。可以使用ALL作为message type,用于匹配所有message type
-n --node node-name 匹配node name
-o --objectSE-Linux-context-string 匹配tcontext(object)
-p --pid process-id 匹配process ID
-pp --ppidparent-process-id 匹配parent process ID
-r --raw 将未经格式化处理的原日志输出
-sc --syscallsyscall-name-or-value 匹配syscall参数
-se --context SE-Linux-context-string 匹配scontext/subject或tcontext/object
--session Login-Session-ID 匹配用户的Login Session ID
-su --subject SE-Linux-context-string 匹配scontext(subject)
-sv --success success-value 匹配success value
-te --end[end-date][end-time] 匹配time stamp等于或早于给定参数的event,时间格式与本地时间格式匹配,如果省略掉日期,则默认指定today作为默认值。如果省略掉时间,则now作为默认值,使用24小时制。例如09/03/2009 18:00:00。常用的一些预定义的关键字:now/recent/today/yesterday/this-week/week-ago/this-month/this-year,其中,recent表示10分钟之前,其他的都可以按照字面意思理解
-ts --start [start-date][start-time] 与-te参数类似,用于过滤日期和时间晚于给定时间的event。区别是如果时间参数省略,会以midnight作为默认值
-tm --terminal terminal 匹配terminal参数
-ua --uid-all all-user-id 匹配user ID/effective user ID/login user ID(auid)
-ue --uid-effective effective-user-id:匹配effective user ID
-ui --uid user-id 匹配user ID
-ul --loginuid login-id 匹配login user ID
-uu --uuid guest-uuid 匹配guest UUID
-v --version 打印版本
-vm --vm-name guest-name 匹配guest name
-w --word 条件中如果有字符串匹配,必须完全匹配,例如filename/hostname/terminal/SELinux context
-x --executable executable 匹配executable名

aureport

工具aureport用于产生审计后台日志的总结报告

配置文件

/etc/audit/auditd.conf 有以下作用
1. 设置审计消息的专用日志文件
2. 确定是否循环使用日志文件
3. 如果日志文件的启动用掉了太多磁盘空间则发出警告
4. 配置审计规则记录更详细的信息
5. 激活文件和目录观察器
[root@localhost ~]# cat /etc/audit/auditd.conf 
#
# This file controls the configuration of the audit daemon
#

log_file = /var/log/audit/audit.log
log_format = RAW
log_group = root
priority_boost = 4
flush = INCREMENTAL
freq = 20
num_logs = 5
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file = 6 
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
##tcp_listen_port = 
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
enable_krb5 = no
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key

配置文件说明

  • log_file

    审计日志文件的完整路径。如果您配置守护进程向除默认/var/log/audit/外的目录中写日志文件时,一定要修改它上面的文件权限,使得只有根用户有读、写和执行权限。所有其他用户都不能访问这个目录或这个目录中的日志文件

  • log_format

    写日志时要使用的格式。当设置为RAW时,数据会以从内核中检索到的格式写到日志文件中。当设置为NOLOG时,数据不会写到日志文件中,但是如果用dispatcher选项指定了一个,则数据仍然会发送到审计事件调度程序中

  • priority_boost

    审计应采用多少优先级推进守护进程。必须是非负数。0表示没有变化

  • flush

    多长时间向日志文件中写一次数据。值可以是NONE、INCREMENTAL、DATA和SYNC之一。如果设置为NONE,则不需要做特殊努力来将数据 刷新到日志文件中。如果设置为INCREMENTAL,则freq参数用于确定发出显式刷新磁盘的频率。如果设置为DATA,则审计数据和日志文 件一直是同步的。如果设置为SYNC,则每次写到日志文件时,数据和元数据是同步的

  • freq

    如果flush设置为INCREMETNAL,审计守护进程在写到日志文件中前从内核中接收的记录数

  • num_logs

    max_log_file_action设置为ROTATE时要保存的日志文件数目。必须是0~99之间的数。如果设置为小于2,则不会循环日志。如果递 增了日志文件的数目,就可能有必要递增/etc/audit/audit.rules中的内核backlog设置值,以便留出日志循环的时间。如果没有设 置num_logs值,它就默认为0,意味着从来不循环日志文件

  • dispatcher

    当启动这个守护进程时,由审计守护进程自动启动程序。所有守护进程都传递给这个程序。可以用它来进一步定制报表或者以与您的自定义分析程序兼容的不同格式 产生它们。自定义程序的示例代码可以在/usr/share/doc/audit- [version]/skeleton.c中找到。由于调度程序用根用户特权运行,因此使用这个选项时要极其小心。这个选项不是必需的

  • disp_qos

    控制调度程序与审计守护进程之间的通信类型。有效值为lossy和lossless。如果设置为lossy,若审计守护进程与调度程序之间的缓冲区已满 (缓冲区为128千字节),则发送给调度程序的引入事件会被丢弃。然而,只要log_format没有设置为nolog,事件就仍然会写到磁盘中。如果设 置为lossless,则在向调度程序发送事件之前和将日志写到磁盘之前,调度程序会等待缓冲区有足够的空间

  • max_log_file

    以兆字节表示的最大日志文件容量。当达到这个容量时,会执行max_log_file _action指定的动作

  • 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参数,因此不会删除日志文件

  • space_left

    以兆字节表示的磁盘空间数量。当达到这个水平时,会采取space_left_action参数中的动作

  • space_left_action

    当磁盘空间量达到space_left中的值时,采取这个动作。有效值为IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和 HALT。如果设置为IGNORE,则不采取动作。如果设置为SYSLOG,则向系统日志/var/log/messages写一条警告消息。如果设置为 EMAIL,则从action_mail_acct向这个地址发送一封电子邮件,并向/var/log/messages中写一条警告消息。如果设置为 SUSPEND,则不再向审计日志文件中写警告消息。如果设置为SINGLE,则系统将在单用户模式下。如果设置为SALT,则系统会关闭

  • action_mail_acct

    负责维护审计守护进程和日志的管理员的电子邮件地址。如果地址没有主机名,则假定主机名为本地地址,比如root。必须安装sendmail并配置为向指定电子邮件地址发送电子邮件

  • admin_space_left

    以兆字节表示的磁盘空间数量。用这个选项设置比space_left_action更多的主动性动作,以防万一space_left_action没有让 管理员释放任何磁盘空间。这个值应小于space_left_action。如果达到这个水平,则会采取admin_space_left_ action所指定的动作

  • admin_space_left_action

    当自由磁盘空间量达到admin_space_left指定的值时,则采取动作。有效值为IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和HALT。与这些值关联的动作与space_left_action中的相同

  • disk_full_action

    如果含有这个审计文件的分区已满,则采取这个动作。可能值为IGNORE、SYSLOG、SUSPEND、SINGLE和HALT。与这些值关联的动作与space_left _action中的相同。

    提示:如果不循环审计日志文件,则含有/var/log/audit/的分区可能变满并引起系统错误。因此,建议让/var/log/audit/位于一个单独的专用分区

  • disk_error_action

    如果在写审计日志或循环日志文件时检测到错误时采取的动作。值必须是IGNORE、SYSLOG、SUSPEND、SINGLE和HALT之一。与这些值关的动作与space_left_action中的相同。

日志文件

日志文件字段说明

type=SYSCALL msg=audit(1557677628.183:175): arch=c000003e syscall=59 success=yes exit=0 a0=c3a2d0 a1=c39d60 a2=c20a00 a3=7fff1f5044e0 items=3 ppid=5886 pid=6624 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=4 comm=”river.sh” exe=”/usr/bin/bash” key=”TheRiver”

type=EXECVE msg=audit(1557677628.183:175): argc=2 a0=”/bin/sh” a1=”./river.sh”

type=CWD msg=audit(1557677628.183:175): cwd=”/home/river”

type=PATH msg=audit(1557677628.183:175): item=0 name=”./river.sh” inode=1000168 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL

type=PATH msg=audit(1557677628.183:175): item=1 name=(null) inode=67111165 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL

type=PATH msg=audit(1557677628.183:175): item=2 name=(null) inode=146951365 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL

  • type=SYSCALL这一行说明了audit的消息类型,audit消息类型可以对照https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sec-Audit_Record_Types.html的表格进程查看,SYSCALL说明此次audit记录的是一次系统调用Kernel的记录
  • msg=audit(1557677628.183:175)这一行的格式是(time_stamp:ID),time_stamp是unix时间,可以将其转化为其他时间格式,可以使用站长工具进行转换:http://tool.chinaz.com/Tools/unixtime.aspx。相同的audit event可能会产生多条time_stamp和event ID相同的log
  • msg后面跟了很多形式为“name=value”的键值对,这些键值对由kernel或者用户空间的进程产生
  • arch=c000003e标明CPU的类型,c000003e对应x86_64,使用ausearch查看audit日志时会自动将其解码
  • syscall=59指出了发送给kernel的系统调用的类型,可以使用ausyscall –dump来显示所有的syscall的说明
  • succeed=yes/no,说明此次syscall成功或失败
  • exit=0说明syscall的返回值是0
  • a0,a1,a2,a3指明了前4个参数,也是编码成16进制,通过ausearch命令可以解码查看
  • items指出event中的path记录的数量
  • ppid=5886输入栏记录了父进程ID(PPID)
  • pid=6624输入栏记录了进程ID(PID)
  • auid=0输入栏记录了审核用户ID,这个是loginuid。这个ID是用户在登录时使用的并且即使当用户身份改变时,也可以通过每个进程获取该ID。(例如,通过切换用户账户,使用su - john命令)
  • uid=0指出了对应进程的所有者ID
  • gid=0对应进程的group ID
  • euid=0对应进程的effective user ID
  • suid=0对应set user ID
  • fsuid对应file system user ID
  • egid=0对应effective group ID
  • sgid对应set group ID
  • fsgid对应file system group ID
  • tty=pts1指出对应进程是在哪个终端启动的
  • ses=4指出了对应进程的session ID
  • comm="river.sh"对应了进程执行的命令
  • exe="/usr/bin/bash"指出了进程的执行文件的路径
  • key="TheRiver"是管理员定义的标明是哪条rule输出了这条audit日志
  • CWD指出了进程的执行目录(current working directory),cwd字段指出了第一条日志中syscall的执行路径
  • 第三条日志用来记录所有传递给syscall作为参数的路径,在这个audit事件中,仅有/etc/ssh/sshd_config作为参数进行传递,通过name字段指明
  • inode指出了与文件或目录相对应的inode number,可以通过下面的命令查看inode对应的文件或目录:find / -inum [inode number] -print – /home/river/river.sh
  • dev=fd:01指出文件或目录对应的device ID
  • mode=0100755对应文件或目录的权限:rwxr-xr-x 1 root root
  • ouid对应文件的owner’s user ID
  • ogid对应文件的owner’s group ID

实践


auditctl加入的规则是临时生效的,想永久生效需要在规则文件中加入,然后重启:service auditd restart
----------- ending -----------