记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

audit初探

2015-01-10 20:26

0×00:    

最近工作中学习了一个比较实用的系统服务:audit。下面进行一些使用介绍。

     audit 是Linux audit Subsystem 的简称。这一服务的主要作用是记录系统调用和文件访问。auditd 是audit 系统的守护进程,作用是将audit 记录的信息写到磁盘上。合理配置audit 日志审计规则,对安全运维大有帮助。当系统被入侵后,可以通过查看audit.log 追根溯源,找到系统的漏洞所在。

0×01:audit安装及启动

debian   apt-get install auditd
centOS   yum install audit 
源码下载: http://people.redhat.com/sgrubb/audit/

启动服务:

root@kali:~# service auditd start

    服务启动后,/var/log/audit 目录被创建,并生成audit.log 。为了安全,此目录只对root 用户可读。
    进入audit 日志目录,可以看到一条DAEMON_START ,记录了audit服务启动信息: 

root@kali:/var/log/audit# cat audit.log 
type=DAEMON_START msg=audit(1413124246.270:9427): auditd start, ver=1.7.18 format=raw kernel=3.12-kali1-amd64 auid=0 pid=1986 res=success
type=CONFIG_CHANGE msg=audit(1413124246.374:2): audit_backlog_limit=320 old=64 auid=0 ses=3 res=1

audit 默认含有若干管理工具,常用的有下面三个: 
    auditctl:控制audit系统,它控制着生成日志的各种变量,以及内核审计的各种接口,还有决定跟踪哪些事件的规则。
    aureport:能够从审计日志里面提取并产生一个个性化的报告,这些日志报告很容易被脚本化,并能应用于各种应用程序之中。
    ausearch:用于查询审计后台的日志,它能基于不同搜索规则的事件查询审计日志。

    个人认为ausearch 比较实用,后面有使用介绍。

0×02:audit 配置

audit安装后,会生成2个文件:
     /etc/audit/audit.conf 守护程序的默认配置文件
     /etc/audit/audit.rules 守护程序默认的规则文件

auditd.conf 的配置需要根据实际情况,一般使用默认配置即可,学习每个配置参数的含义可以:

#man 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 = 4
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file = 5
max_log_file_action = KEEP_LOGS
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

这里只介绍几个需要注意的参数:

    max_log_file_action 建议设置为 ROTATE,这时日志大小跟num_logs(log文件数) 和 max_log_file (单个文件大小)有关,两者相乘就是最大可存储的日志量。而设置成 keep_logs 会保留从设置之日起所有的日志文件,如果硬盘够大可以这么干。

    flush建议设为 INCREMENTAL,此时freq 参数生效, freq 会通知 audit daemon 每多少秒向内核请求将数据写入磁盘;如果是在安全要求十分高的场合下,flush可以设置为 data 或者 sync,二者都是将数据同步写入磁盘,不同点是后者在写入数据的同时还写入元数据(metadata)。

audit.rules 同样可以:
#man audit.rules

每个选项更详细的解释可以:

#man auditctl

下面是个audit.rules 的例子:

# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.

# First rule - delete all
-D

# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 1024

# Feel free to add below this line. See auditctl man page
-w /home/wwwroot/default -p wa -k aqb_sec

-a exit,always -F uid=3307 -F arch=b64 -S execve
-a exit,always -F uid=3309 -F arch=b64 -S execve
-a exit,always -F uid=3307 -F arch=b64 -S write

-w:配置一个监控目录
/home/wwwroot/default : 具体需要监控的目录,这里监控了web 文件夹
-p: 操作权限过滤
rwax:具体操作权限。r=读操作,w=写操作,x=执行,a=更改属性
-k:一旦规则触发,为当前记录打一个标签
aqb_sec :规则触发以后,会在记录最后打上 aqb_sec 标签,有助于日志审计

监控系统调用的规则:
规则格式:
     -a action,list -S syscall -F field=value -k keyname
规则实例:
    -a exit,always -F uid=3307 -F arch=b64 -S execve

action 选项包括:  task,  entry,  exit,  user, exclude
    task:仅在fork或复制系统调用时监测,实际很少用到
    entry和exit :entry 运行在系统调用进入时,exit 运行在退出时,exit 的适用范围更广,一般会配置这个选项。
    user:用于过滤一些在用户控件起源的事件,适用于uid,pid,auid,pid字段
    exclude:用来排除某些事件
    action 选项后的list 选项有always和never ,一般填always ,表示记录一条事件。action和list 用逗号隔开。

    -F 选项表示一个规则域,每一个种类的过滤规则都要以-F 开始。比如实例里 -F uid=3307 -F arch=b64  表示检测uid 为3307 的用户的操作,系统类型为64位。如果是 -F auid=3307 则表示系统源用户uid 为3307 ,适用于通过sudo或su 转换系统角色后的操作。

-S :系统调用选项。具体系统调用名这里就不过多介绍了。常见的有 execve、write、fork等。

    以上解释均为个人根据系统手册按理解翻译过来的,更详尽的解释可以直接用man 命令查看系统手册。

0×03:日志查看

下面看一下配好规则以后audit 的日志记录情况。

如下日志记录了从用户登陆,到修改web 目录文件的过程(点击查看大图,下同):

1

修改文件的部分操作:

2

用上面提到的 ausearch 命令查看日志会更直观,结合-k 选项查看:
#ausearch -k aqb_sec
每一步操作都以四个减号分割:

3

这里的时间戳都已转化为可读模式。

以一条日志为例,解释下日志所记录的内容:

type=SYSCALL :事件类型,其他常见类型包括:PATH,CWD,LOGIN
msg=audit(1413946191.524:56366):  : 记录了时间戳和一个唯一的audit 事件id
arch=c000003e :表示系统架构 x86_64
syscall=93 :系统调用号
success=yes :执行成功
exit=0 :当值为0时表示记录成功
a0=3 a1=0 a2=0 a3=0 items=1 :系统调用信息,具体含义没深入研究
ppid=22987 :父进程pid
pid=23046 :进程pid
auid=0 uid=0 :源uid 和uid,这里是root
gid=0 :group id 
euid=0 :有效user id
suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 :file system uid,有效group id 等等各种。总之记录的用户信息很全,由于使用了root,所以所有值都为0 了。
tty=pts1 :使用的终端
ses=902 :没查到- -!
comm=”vi”: 系统命令
exe=”/usr/bin/vim.basic” :命令路径
key=”aqb_sec” :标签

    其他的日志内容都类似,需要具体情况具体分析,总之内容丰富。

    分享个tip:经常在应急时发现有网站被挂黑链,一般批量生成黑链的代码都是拿到网站webshell 以后再添加的,这些代码要么比较难找特征,要么就是经过层层加密,总之即使找到webshell,也很难找到这些代码 。不过这些代码一般会通过crontab 定时生成黑链代码,直接ausearch -c crontab 就能把相关日志找出来,具体代码文件也就不难找到了。

0×04:时间戳转换    

    使用ausearch 查看日志有一个好处是每一步操作时的时间戳都会被转换成可读模式,但是当日志量比较大想要借助管道命令查询信息时,就无法显示可读的时间了,这时可以写一个脚本将日志的时间戳批量转换一下。

    通过命令转换成普通格式:

root@kali:/tmp/audit$ date -d @1412971320.112
Fri Oct 10 16:02:00 EDT 2014

shell 脚本read_audit.sh:

#!/bin/bash
FILE=/var/log/audit/audit.log
cat $FILE |while read LINE
do
Udate=`echo $LINE|awk -F'[(.]+' '{print $2}'`
Cdate=`date -d @$Udate`
echo $LINE|sed "s/[0-9]\{10\}/$Cdate/" >> read.audit.log
done

转换后的格式:

4

参考文章:

http://thomasknowles.blogspot.ca/2011/03/linux-file-access-auditing.html

http://www.cyberciti.biz/tips/linux-audit-files-to-see-who-made-changes-to-a-file.html

http://os.51cto.com/art/201205/337496_all.htm  

http://jaseywang.me/2011/04/27/audit/ 

http://jaseywang.me/2011/04/25/config-for-auditd-conf/ 

http://leemon.blog.51cto.com/1903784/1256716

知识来源: www.imiyoo.com/secshare/2014/10/13/350.html

阅读:299266 | 评论:0 | 标签:安全分享

想收藏或者和大家分享这篇好文章→复制链接地址

“audit初探”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云