一、Linux用户空间审计系统简介

   Linux内核有用日志记录事件的能力,比如记录系统调用和文件访问。然后管理员可以评审这些日志,确定可能存在的安全漏洞,比如失败的登录尝试,或者用户对系统文件不成功的访问。这种功能称为Linux用户空间审计系统,在Red Hat Enterprise Linux 5及其之后版本中已经直接可用。当然老版本的Linux 也可以手工添加软件使用。Linux在用户空间审计系统由auditd、audispd、auditctl、autrace、ausearch和aureport等应用程序组成。审计后台auditd应用程序通过netlink机制从内核中接收审计消息,然后通过一个工作线程将审计消息写入到审计日志文件中,Linux的审核系统提供了一种记录系统安全信息的方法,为系统管理员在用户违反系统安全规则时提供及时的警告信息。内核其他线程通过内核审计API写入套接字缓冲区队列audit_skb_queue中,内核线程kauditd通过netlink机制将审计消息定向发送给用户控件的审计后台auditd的主线程,auditd主线程再通过事件队列将审计消息传给审计后台的写log文件线程,写入log文件。另一方面,审计后台还通过一个与套接字绑定的管道将审计消息发送给dispatcher应用程序。图1是Linux audit架构示意图 .

2012052314224542.jpg

   图1 Linux audit架构示意图

   图1的实线代表数据流,虚线代表组件关之间的控制关系 .

   auditd :audit 守护进程负负责把内核产生的信息写入到硬盘上,这些信息是由应用程序和系统活动所触发产生的。audit守护进程如何启动取决于它的配置文件,/etc /sysconfig/auditd.audit系统函数的启动受文件/etc/audit/auditd.conf的控制。在用户空间审计系统通过auditd后台进程接收内核审计系统传送来的审计信息,将信息写入到/var/log/audit/audit.log 中,audit.log的路径可在/etc/auditd.conf 中指定。当auditd没有运行时,内核将审计信息传送给 syslog,这些消息通常保存在/var/log/messages文件中,可以用dmesg命令查看。

   auditctl:auditctl功能用来控制audit系统,它控制着生成日志的各种变量,以及内核审计的各种接口,还有决定跟踪哪些事件的规则。

   audit.rules:在/etc/audit/audit.rules中包含了一连串auditctl命令,这些命令在audit系统被启用的时候被立即加载。

   aureport:aureport的功能是能够从审计日志里面提取并产生一个个性化的报告,这些日志报告很容易被脚本化,并能应用于各种应用程序之中,如去描述结果。

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

   audispd:audispd是消息分发的后台进程,用于将auditd后台发过来的一些消息通过syslog写入日志系统。这是一个审计调度进程,它可以为将审计的信息转发给其它应用程序,而不是只能将审计日志写入硬盘上的审计日志文件之中。

   autrace这个功能更总类似于strace,跟踪某一个进程,并将跟踪的结果写入日志文件之中。

   要使用安全审计系统可采用下面的步骤:

   ●  安装软件包

   ● 了解配置文件

   ●  了解配置命令

   ●  添加审计规则和观察器来收集所需的数据

   ● 启用了内核中的audit并开始进行日志记录

   ●  通过生成审计报表和搜索日志来周期性地分析数据    二、 安装软件包并且配置审计守护进程

   1 安装软件包

   要使用auditd和实用程序来生成日志文件报表,必须安装audit RPM程序包

   #yum install audit

   audit也可以从源码安装,源码下载地址:http://people.redhat.com/sgrubb/audit/

   2 了解audit配置文件

   (1) audit配置文件简介

   audit是系统中的一个服务。是Linux audit Subsystem 的缩写。这一服务用来审计系统调用的纪录,并把记录写入文件当中。auditd是audit系统的用户空间程序,主要作用是将audit记录信息写到磁盘上。audit安装后,会生成2个文件。audit在启动时会读取2个配置文件:/etc/audit/auditd.conf  和/etc/audit/audit.rules  .相关文件的位置:

   /etc/audit/audit.conf 守护程序的默认配置文件

   /etc/audit/audit.rules 守护程序默认的过滤文件

   auditd使用方法:

   auditd [ -f ]

   -f  auditd在前台运行,调试时使用。

   (2) /etc/audit/audit.conf文件详解

   /etc/audit/audit.conf守护程序的默认配置文件是Linux安全审计系统最关键文件。/etc/audit/audit.conf文件包括如下几个部分:

   ● 设置审计消息的专用日志文件

   ● 确定是否循环使用日志文件

   ● 如果日志文件的启动用掉了太多磁盘空间则发出警告

   ● 配置审计规则记录更详细的信息

   ● 激活文件和目录观察器

   这些设置值及更多设置值位于/etc/audit/auditd.conf文件中,它包含修改审计守护进程的行为的选项。每个选项均应在独立的一行上,后面跟着等于号(=)和这个选项的值。/etc/audit.audit.rules中的每个规则和观察器必须单独在一行中,以#开头的行会被忽略。规则和观察器是auditctl命令行选项,前面没有auditctl命令。它们从上到下阅读文件。如果一个或多个规则或观察器互相冲突,则使用找到的第一个。auditd.conf的选项说明如表1所示。

   表1 auditd.conf的选项和说明

   选项

   选项说明

   log_file =

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

   log_format =

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

   priority_boost =

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

   flush =

   多长时间向日志文件中写一次数据。值可以是NONE、INCREMENTAL、DATA和SYNC之一

   freq =

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

   num_logs =

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

   dispatcher =

   当启动这个守护进程时,由审计守护进程自动启动程序。所有守护进程都传递给这个程序。可以用它来进一步定制报表或者以与您的自定义分析程序兼容的不同格式产生它们。由于调度程序用根用户特权运行,因此使用这个选项时要极其小心。这个选项不是必需的

   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

   disk_full_action =

   如果含有这个审计文件的分区已满,则采取这个动作。可能值为IGNORE、SYSLOG、SUSPEND、SINGLE和HALT

   disk_error_action =

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

   说明:/etc/sysconfig/auditd文件可以用来设置带EXTRAOPTIONS参数的auditd的命令行选项。唯一的命令行选项-f以调试模式安排守护进程。如果启用了调试模式,则会出现标准错误消息而不是日志文件。AUDITD_LANG设置值可以用来修改守护进程的位置。如果设置为none,则所有位置信息会从审计环境中删除。如果AUDITD_CLEAN _STOP选项设置为yes,则当用service auditd stop命令停止守护进程时,会删除审计规则与观察器。

   (3)审计规则文件/etc/audit/audit.rules

   要添加审计规则,可在/etc/audit/audit.rules文件中用下面的语法:

   -a <list>,<action> <options>

   以下在 CentOS 6 下的 audit.rules 下配置,请根据不同的环境进行修改。

   添加基本的审计配置参数

   -D

   -b 8192

   -f 1

   -e 1

   添加 audit 日志文件和配置文件的审计

   -w /var/log/audit/

   -w /etc/audit/auditd.conf -p rxwa

   -w /etc/audit/audit.rules -p rxwa

   -w /etc/passwd -p rwxa

   -w /etc/sysconfig/

   注意:监控系统调用可能会引起高负荷的日志活动,这会让内核承受更大的负荷。所以要慎重衡量哪些系统调用需要放到 audit.rules 中。如果审计的是目录的话,只能对该目录本身的属性进行审计,也就是诸如拥有者,目录权限之类的进行审计,并不能审计目录下面的文件。如果想审计下面的文件,需要一一列出。另外不支持通配符/正则。

   监控其他的系统调用

   -a entry,always -F arch=b64 -S clone -S fork -S vfork

   -a entry,always -S umask

   -a entry,always -S adjtimex -S settimeofday

   以上的都设置完毕了,就可以生成各种报告了。

   (4) 启动auditd守护进程

   #service auditd start

   如果在守护进程运行时您添加了观察器/etc/audit/audit.rules,则一定要以根用户身份用service auditd restart命令启用修改。也可以用service auditd reload命令,但是它不会通知您关于配置文件错误的消息。

   要使它自动在运行时启动,则应作为根用户执行命令:

   chkconfig auditd on

   要停止它,可使用service auditd stop命令,要验证规则与观察器已经修改,应以根用户身份执行auditctl -1命令列出所有活动的规则和观察器。

   auditctl -1    三、用户空间审计系统的使用实例

   1 auditctl命令实例:

   auditctl用于对kernel中的audit进行控制,可以用来获取audit状态和增删audit规则。auditctl命令控制行为、得到状态、从内核审计系统增加或删除规则。命令格式如下:

   auditctl [options]

   auditctl的命令行选项(options)很多,例如:

   -e [0|1]表示停止或启动内核审计功能;-a表示将规则追加到链表;-S表示系统调用号或名字;-F表示规则域。-w表示为文件系统对象<path>插入一个watch(监视)。-p表示设置文件权限。-k key 表示设置审计规则上的过滤关键词key,key是不超过32字节长的任意字符串,它能唯一鉴别由watch产生的审计记录 .-D 表示删除所有的规则和watch .-s 表示报告状态 .

   下面是几个例子:

   先查看audit运行状态

   # auditctl -s

   AUDIT_STATUS: enabled=1 flag=1 pid=1585 rate_limit=0 backlog_limit=256 lost=0 backlog=0

   通过enabled flag  rate_limit backlog_limit lost backlog参数可以得知audit运行状态是否正常。

   从 auditctl 命令参数可以看到

   enabled值为 [0|1]   启用/禁用audit审核。

   flag值为  [0.1.2] 设置失败标记的等级,有0,1,2三个值,0是不输出日志,1为输出printk日志,2为最高级,会大量输出日志信息。这个选项用于设置audit获得错误的等级。默认值为1.在安全环境下可以设置为2 .

   查看已有的audit规则

   # auditctl -l

   添加一条audit规则,记录maj用户的所用open系统调用

   # auditctl -a entry,always -S open -F uid=500

   open表示:要查看某一特定用户打开的文件

   在另一个终端以maj用户登录,登录后执行一个ls命令即可

   删除这条audit规则

   # auditctl -d entry,always -S open -F uid=500

   如不想看到用户登陆类型的消息,可以如下添加规则:

   #auditctl -a exclude,always -F msgtype=USER_LOGIN

   这里过滤是以“消息类型”为对象的。

   监视/etc/passwd文件被读、写、执行、修改文件属性的操作记录

   #auditctl -w /etc/passwd -p rwax

   查看程序所有的系统调用

   #auditctl -a entry,always -S all -F pid=1005

   查看指定用户打开的文件

   #auditctl -a exit,always -S open -F auid=510

   查看不成功的open系统调用

   auditctl -a exit,always -S open -F success!=0

   设置规则和显示规则的命令样例列出如下:

   #auditctl -a entry,always -S all -F pid=1005

   #auditctl -l

   LIST_RULES: entry,always pid=1005 (0x3ed) syscall=all

   查看audit日志文件:

   #cat /var/log/audit/audit.log

   2 使用aureport 生成报表

   要生成审计消息的报表,可使用aureport.为了安全起见/var/log/audit/目录和其中的所有审计日志文件只对根用户可读。因此必须作为根用户执行aureport命令。aureport 命令格式:

   aureport [选项]

   主要选项:

   -a 报告关于访问向量缓冲(access vector cache,AVC)的消息

   -c报告关于配置修改的消息

   -cr报告关于crypto事件的消息

   -e报告关于事件的消息

   -f报告关于文件的消息

   -h报告关于主机的消息

   -l报告关于登录的消息

   -m报告关于账户修改的消息

   -ma报告关于Mandatory Access Control(MAC)事件的消息

   -p报告关于进程的消息

   -s报告关于系统调用的消息

   -tm报告关于终端的消息

   如果执行aureport时没有使用任何选项,则会显示如汇总报表。

   要显示每个日志的启动和停止时间,可以添加-t选项:

   aureport -<flag> -i -t

   要仅显示失败事件,则使用- -failure,注意这个选项前面有两条虚线而不是一条:

   aureport -<flag> -i ——failed

   要仅显示成功事件,则使用- -success,注意这个选项前面有两条虚线而不是一条:

   aureport -<flag> -i ——success

   要产生来自一个日志文件的报表而不是默认报表,则可用-if选项指定它:

   aureport -<flag> -i -if /var/log/audit/audit.log.1

   下面是一些实际的例子:

   生成一段特定时间内的报告

   # aureport -ts 8:00 -te 17:30 -f -i

   显示失败事件

   # aureport –-failed

   显示成功事件

   # aureport –-success

   列出未被成功访问的文件

   # aureport -f -i –-failed ——summary

   还可以图形化报告,下载如下脚本:

   # wget http://people.redhat.com/sgrubb/audit/visualize/mkbar

   #chmod +x mkbar

   在rhel和 centos 上需要安装 gnuplot

   # yum install gnuplot

   生成整体的事件报告

   # aureport -e -i ——summary | /path/mkbar events

   系统会生成一个图像文件events.png如图2 .

2012052314245120.jpg

   图2 整体的事件报告图像文件

   生成文件事件报告

   # aureport -f -i ——summary | /path/mkbar files

   生成登陆事件报告

   # aureport -l -i ——summary | /path/mkbar login

   生成用户事件报告

   # aureport -u -i ——summary | /path/mkbar users

   生成系统调用事件报告

   # aureport -s -i ——summary | /path/mkbar syscalls

   要了解不同 audit 对象之间的关系,比如用户跟系统调用,可以使用 mkgraph 脚本

   使用 mkgraph 要用到 graphviz请先配置好再使用:

   # wget http://people.redhat.com/sgrubb/audit/visualize/mkgraph

   ##chmod +x mkgraph

   例如users 和 executables关系

   # aureport -u -i | awk '/^[0-9]/ { print $4" "$7 }' | sort | uniq | mkgraph users_vs_exec

   审计守护进程将关于这些事件的日志消息写到专门的日志文件中。然后可以用aureport和ausearch实用程序生成报表来找到失败的系统调用,以确定谁在访问文件以及访问频率如何,执行程序是成功的还是失败等。举个安全管理的例子,如果使用aureport命令发现如下字段信息:

   Number of logins: 111

   Number of failed logins: 111

   Number of authentications: 111

   Number of failed authentications:111

   表示111次登录并且全部失败, (我们知道一个正常用户不可能连续登录系统111次并且每次都失败而且连续不断)那么系统可能遭到暴力口令登录 .

   3 使用ausearch命令使用搜索记录

   ausearch的语法列出如下:

   ausearch [ options ]

   其中,options表示选项值,如:-a <audit event id>、-f <file name>等。

   除了生成事件报表并用aureport汇总外,管理员也可以用ausearch搜索审计记录。以根用户身份执行ausearch命令,当显示结果时,每个记录用4条虚线组成的一行隔开,每个记录前均显示时间标记。图3 是ausearch -x su中的结果 .

2012052314221062.jpg

   图3  ausearch -x su中的结果

   设置 Keys 来管理审计事件记录

   假设你在 audit.rules 下加了如下的一条规则

   -w /etc/audit/audit.rules -p wa

   如果没有 key,如果要查找 SYSCALL 或者 PATH 事件,你可能要使用 grep 等类似的工具才能过滤到你想要的内容。使用 key 就能简化上述的过程

   -w /etc/audit/audit.rules -p wa -k CFG_audit.rules

   -k 后面的内容是你自己定义的。现在要找特定的内容就容易多了

   # ausearch -k CFG_audit.rules

   4 使用seaudit工具查看Linux 用户空间审计系统信息

   seaudit是SElinux故障诊断工具包(setools-gui)的组件。打开seaudit工具可以看到许多Linux 用户空间审计系统信息,seaudit工具可以读取/var/log/audit/audit.log,方法是从file菜单选择“open  log ”打开/var/log/audit/audit.log seaudit工作界面如图4.

2012052314214899.jpg

   图4使用seaudit工具查看Linux安全审计信息

   使用seaudit工具也可以生成报表方法是从tools菜单选择“Creat Report ”如图5 .

2012052314212953.jpg

   图5 使用seaudit工具生成报表

   可以使用浏览器查看生成的报表文件如图6 .

2012052314211181.jpg

   图6 使用浏览器查看生成的报表文件

   总结:Linux提供了用来记录系统安全信息的审计系统,审计系统分为用户空间和内核空间审计系统,用户空间审计系统用来设置规则和审计系统状态、将内核审计系 统传来的审计消息写入log文件。内核审计系统用于产生和过滤内核的各种审计消息。本文重点介绍Linux用户空间审计系统的使用。另外Linux用户空间审计系统通常是和Selinux系统配合使用的 .

转自:http://linux.chinaitlab.com/soft/885119.html