linux服务之audit
http://blog.chinaunix.net/uid-20786165-id-3167391.html
http://blog.chinaunix.net/uid-8389195-id-1741610.html
Linux的日志系统与审核系统
最近在读倪继利的《Linux安全体系分析与编程》,想把一些笔记发出来,这是第一篇。
Linux的日志系统主要就是syslog系统构架,其实现是内核函数printk将消息写入一个环形缓冲区中,供高层的sys_syslog系统调用读取。代码部分在linux/kernel/printk.c
相关链接:http://lxr.linux.no/linux+v3.1.6/kernel/audit.c
Linux的审核系统提供了一种记录系统安全信息的方法,为系统管理员在用户违反系统安全规则时提供及时的警告信息。内核其他线程通过内核审计API写入套接字缓冲区队列audit_skb_queue中,内核线程kauditd通过netlink机制将审计消息定向发送给用户控件的审计后台auditd的主线程,auditd主线程再通过事件队列将审计消息传给审计后台的写log文件线程,写入log文件。另一方面,审计后台还通过一个与套接字绑定的管道将审计消息发送给dispatcher应用程序。代码部分主要在 linux/kernel/audit.c
auditd在Debian里默认没有安装启动,需要通过aptitude install auditd开启。
《Linux安全体系分析与编程》部分章节下载见 http://www.linuxidc.com/Linux/2012-02/53191.htm
Linux audit的作用:帮助你了解,分析发生在你系统中的事情。
Linux 的组成:
audit 内核模块----->监听系统调用,记录有价值事件
audit daemon(auditd)----->把记录事件写入磁盘(/var/log/audit/audit.log)
audit 命令行工具(aureport,ausearch等)------>帮助分析audit日志
内核审计缓冲区管理机制
内核审计系统将审计消息写入审计用的缓冲区(称为审计缓冲区)。由于审计信息是通过netlink机制发往用户空间后台进程的,因此,审计缓冲区包括了结构sk_buff描述的套接字缓冲区,套接字缓冲区用来存储用于发送的审计消息记录。
审计缓冲区的结构定义如下(在linux26/kernle/audit.c中):
struct audit_buffer { struct list_head list; struct sk_buff *skb;/*格式化的套接字缓冲区,准备用于发送审计消息 */ /*每个进程的审计上下文,包括进程的状态、时间和uid等,与进程上下文相关,可以为空 */ struct audit_context *ctx; gfp_t gfp_mask;//缓存区的标识,如:__GFP_WAIT }; |
审计套接字缓冲区组成链表,用于存入填充了审计消息的审计套接字缓冲区指针,链表定义如下(在linux26/kernle/audit.c中):
static struct sk_buff_head audit_skb_queue; |
审计套接字缓冲区链表用于存入审计消息,当链表中的缓冲区个数超过上限时,当前进程需要等待用户空间的后台进程将审计消息写入log文件,直到缓冲区个数小于上限值为止。
内核审计系统还使用空闲审计缓冲区链表audit_freelist 存放空闲的审计缓冲区,存放的个数上限为AUDIT_MAXFREE。这样,维持一定数据的空闲缓冲区数,对于频繁操作的审计系统来说,可以减少缓冲区的分配与释放次数,提高系统性能。
当申请审计缓冲区时,系统先查看链表audit_freelist是否存在空闲的审计缓冲区;如果存在,就从链表中取下一个返回给申请者。如果链表中没有空闲审计缓冲区,就分配一个审计缓冲区。
当调用函数audit_buffer_free释放审计缓冲区时,先检查空闲审计缓冲区链表audit_freelist的空闲审计缓冲区是否超过 上限;如果没有超过上限,就将审计缓冲区放入链表audit_freelist,留给以后使用。否则,释放缓冲区。函数 audit_buffer_free释放审计缓冲区时,每次都释放它包含的套接字缓冲区。
空闲审计缓冲区链表的定义列出如下:
#define AUDIT_MAXFREE (2*NR_CPUS) static LIST_HEAD(audit_freelist); |
Linux 系統中已經 syslog 了,syslog 會記錄系統狀態、如硬體的警告或應用軟體的記錄等。但是syslog屬於應用層,且僅只於此一應用而已,沒辦法記錄太多資訊。因此,audit 誕生以取代 syslog 的責任,來記錄核心層的事件:檔案的讀寫、系統呼叫、權限的狀態等。
在Linux/UNIX 中,审计工作主要由auditd 服务来完成。Auditd可以对整个操作系统的以下行为做审计
账户管理
文件系统管理
权限管理
网络配置管理
日志文件操作管理
audit 的設定檔為 /etc/audit/audit.rules,主要分為三種類別:
• Basic audit system parameters
• File and directory watches
• System call audits
# basic audit system parameters
-D (刪除舊記錄,預設-D)
-b 8192 (buffer大小,預設256,改為8192)
-f 1 (失敗控制旗標,可設為 0 (silent), 1 (印出錯誤,預設), and 2 (panic, 把系統關閉—非正常關閉,所以會有資料遺失的風險).
-e 1 (生失效,0為失效,1為生效(預設)
# some file and directory watches
-w /var/log/audit/ (觀查目錄 /var/log/audit/)
-w /etc/auditd.conf -p rxwa (觀查檔案 /etc/auditd.conf,-p 設定權限為rxw及a屬性變更)
-w /etc/audit.rules -p rxwa
-w /etc/passwd -p rwxa
-w /etc/sysconfig/
# an example system call rule
-a entry,always -S umask
對於設定檔有幾點要說明:
• 目錄觀察的詳細度比檔案觀察低
• 無法使用任何的pathname globbing,如?或*
• 只能設定已存在的檔案,若設定觀察目錄而有新增檔案,新檔案只會在下次 audit 重啟後才會加入
利用 -k 產生 key string,以供ausearch 直接索引
-w /etc/var/log/audit/ -k LOG_audit
audit daemon的主要配置文件有两个,一个是/etc/sysconfig/auditd, 另一个是/etc/audit/auditd.conf.
/etc/sysconfig/auditd---->配置auditd运行时的环境
AUDITD_LANG--->auditd运行时的locale
AUDITD_DISABLE_CONTEXTS---->不监控系统调用
/etc/audit/auditd.conf---->配置auditd运行时的功能,格式val = value
log_file, log_format, log_group--->log_file标示日志存放路径,log_format标示日志记录格式,log_group 日志的属主。log_format有两种格式一种是raw,记录内核发送的原始格式,一种是nolog,也就是日志不会被写到硬盘。注:如果你想使用aureport生成报告的话,请使用raw格式。
priority_boost--->设置auditd的优先启动级,默认是4,具有较高的优先级启动,0的话是正常顺序启动。
ps aux的显示来观察auditd的启动优先级
root 3318 0.0 0.0 12516 764 ? S<sl Mar25 0:00 auditd
S<sl S表示进程正在睡眠,<表示具有较高的优先级,s表示多进程l表示多线程
flush and freq ---->flush的可选值为none(日志不写到磁盘), incremental (日志写到磁盘,freq指定多少记录开始写到磁盘),data(保持部分数据和磁盘的一直同步),sync(每次记录都写到磁盘)。freq和 incremental 可选值一起使用,表示多少条记录一组写到磁盘。对于高等级的业务系统设置为DATA
num_logs ------>指定log的数目,数目要求是正数,如果数目小于2,表示不会rotate日志,大于2,也就是达到指定大小会rotate日志。 max_log_file_action 指定rotate行为。
dip_qos and dipatcher--->
disp_qos = lossy 控制调度程序与审计守护进程之间的通信类型。有效值为lossy和lossless 建议使用缺省值
dispatcher = /sbin/audispd 当启动这个守护进程时,由审计守护进程自动启动程序。所有守护进程都传递给这个程序。 建议使用缺省值
name_format and name---->name_format 可以为none(不使用名字),fqd(DNS解析的详细名字),numeric(IP地址),user(使用name选项指定的字符串)
max_log_file and max_log_file_action ---->max_log_file 指定当文件大小达到设定的M值,执行action,action可选为ignore(不处理),rotate(压缩分文件),syslog(发warning信息),suspend(暂停auditd),keep_logs(rotate log 保留所有log)
space_left and space_left_action---->space_left指定space M 值触发action。space_left_action 执行的动作(具体参看man auditd.conf)
action_mail_acct--->设定warning 发送的email地址
admin_space_left and admin_space_left_action ----->遗留空间 用法同space_left
disk_full_action------>同 space_left_action,执行盘空间满的行为。如果含有这个审计文件的分区已满,则采取这个动作
disk_error_action---->同 space_left_action, 监测磁盘错误发生时作出某些action
tcp_listen_port, tcp_listen_queue, tcp_client_ports and tcp_client_max_idle--->从其他audit发来的事件参数。
enable_krb5 = no 是否启用kerberos认证 建议使用缺省值
krb5_principal = auditd Kerberos认证校验值 建议使用缺省值
##krb5_key_file= /etc/audit/audit.key Kerberos生成的验证key存放位置 建议使用缺省值
配置audit的规则,也就是说我们要audit什么样的事件,具体什么事件需要audit来监控跟实际的应用有关。这里主要介绍audit的规则配置工具auditctl和文件配置方法/etc/audit/audit.rules.
这里首先介绍auditctl的应用,具体使用指南查看man auditctl。auditctl的man 描述说明这个工具主要是用来控制audit系统行为,获取audit系统状态,添加或者删除audit系统的规则。控制audit系统行为和获取audit系统状态参数:
-s 或者auditd 状态 auditctl -s 显示:AUDIT_STATUS: enabled=1 flag=1 pid=2792 rate_limit=0 backlog_limit=320 lost=0 backlog=0
-e [0|1|2] 设置audit使能标识, 0 表示临时关闭audit,1 表示启用audit,2表示锁住audit规则配置文件,这条命令一般设这在audit.rules的最后一条,任何人试图修改audit规则都会被记录,并且禁止修改。我们先运行auditctl -e 1 显示:AUDIT_STATUS: enabled=1 flag=1 pid=2792 rate_limit=0 backlog_limit=320 lost=0 backlog=0;我们运行auditctl -e 0 显示AUDIT_STATUS: enabled=0 flag=1 pid=2792 rate_limit=0 backlog_limit=320 lost=0 backlog=0 这里我们看到不同的参数只是修改了enabled项
-f [0|1|2]控制失败标识。也就flag位,这个位的主要作用是This option lets you determine how you want the kernel to handle critical errors
-r 设置速率,也就是每秒钟消息数目,非0的话如果系统在1秒钟大于设定的值,就会触发系统flag标识的行为
-b 设置backlog_limit
audit系统规则设置:
文件系统audit设置:
-w path path是一个文件或者目录的绝对路径。
-p [r|w|x|a] 和-w一起使用,监测用户对这个目录的读 写 执行 或者属性变化如时间戳变化。
-k 指定一个key,在ausearch的时候使用
系统调用的监控:
-a 添加一条系统调用监控规则
-S 后面接需要监测的系统调用的名称
显示规则和移除规则:
-D 删除所有规则
-d 删除一条规则和-a对应
-W 删除一条规则和-w对应
-l 列出所有规则
Linux、Unix 系统审计重点位置 -w /var/log/audit/ -k LOG_audit -w /etc/audit/ -p wa -k CFG_audit -w /etc/sysconfig/auditd -p wa -k CFG_auditd.conf -w /etc/libaudit.conf -p wa -k CFG_libaudit.conf -w /etc/audisp/ -p wa -k CFG_audisp -a entry,always -F arch=b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -a entry,always -F arch=b32 -S mknod -S mknodat -a entry,always -F arch=b32 -S mount -S umount -S umount2 -w /etc/cups/ -p wa -k CFG_cups -w /etc/init.d/cups -p wa -k CFG_initd_cups -w /etc/netlabel.rules -p wa -k CFG_netlabel.rules -w /etc/racoon/racoon.conf -p wa -k CFG_racoon.conf -w /etc/racoon/psk.txt -p wa -k CFG_racoon_keys -w /etc/racoon/certs/ -p wa -k CFG_racoon_certs -w /etc/selinux/config -p wa -k CFG_selinux_config -w /etc/selinux/mls/ -p wa -k CFG_MAC_policy -w /usr/share/selinux/mls/ -p wa -k CFG_MAC_policy -w /etc/selinux/semanage.conf -p wa -k CFG_MAC_policy -a entry,always -F arch=b32 -S adjtimex -S settimeofday -S clock_settime -w /usr/sbin/stunnel -p x -w /etc/security/rbac-self-test.conf -p wa -k CFG_RBAC_self_test -w /etc/aide.conf -p wa -k CFG_aide.conf -w /etc/cron.allow -p wa -k CFG_cron.allow -w /etc/cron.deny -p wa -k CFG_cron.deny -w /etc/cron.d/ -p wa -k CFG_cron.d -w /etc/cron.daily/ -p wa -k CFG_cron.daily -w /etc/cron.hourly/ -p wa -k CFG_cron.hourly -w /etc/cron.monthly/ -p wa -k CFG_cron.monthly -w /etc/cron.weekly/ -p wa -k CFG_cron.weekly -w /etc/crontab -p wa -k CFG_crontab -w /var/spool/cron/root -k CFG_crontab_root -w /etc/group -p wa -k CFG_group -w /etc/passwd -p wa -k CFG_passwd -w /etc/gshadow -k CFG_gshadow -w /etc/shadow -k CFG_shadow -w /etc/security/opasswd -k CFG_opasswd -w /etc/login.defs -p wa -k CFG_login.defs -w /etc/securetty -p wa -k CFG_securetty -w /var/log/faillog -p wa -k LOG_faillog -w /var/log/lastlog -p wa -k LOG_lastlog -w /var/log/tallylog -p wa -k LOG_tallylog -w /etc/hosts -p wa -k CFG_hosts -w /etc/sysconfig/network-scripts/ -p wa -k CFG_network -w /etc/inittab -p wa -k CFG_inittab -w /etc/rc.d/init.d/ -p wa -k CFG_initscripts -w /etc/ld.so.conf -p wa -k CFG_ld.so.conf -w /etc/localtime -p wa -k CFG_localtime -w /etc/sysctl.conf -p wa -k CFG_sysctl.conf -w /etc/modprobe.conf -p wa -k CFG_modprobe.conf -w /etc/PAM.d/ -p wa -k CFG_pam -w /etc/security/limits.conf -p wa -k CFG_pam -w /etc/security/pam_env.conf -p wa -k CFG_pam -w /etc/security/namespace.conf -p wa -k CFG_pam -w /etc/security/namespace.init -p wa -k CFG_pam -w /etc/aliases -p wa -k CFG_aliases -w /etc/postfix/ -p wa -k CFG_postfix -w /etc/ssh/sshd_config -k CFG_sshd_config -w /etc/stunnel/stunnel.conf -k CFG_stunnel.conf -w /etc/stunnel/stunnel.pem -k CFG_stunnel.pem -w /etc/vsftpd.ftpusers -k CFG_vsftpd.ftpusers -a exit,always -F arch=b32 -S sethostname -w /etc/issue -p wa -k CFG_issue -w /etc/issue.net -p wa -k CFG_issue.net
目前的推送方式在使用syslog服务来完成审计内容向安全管理平台发送的任务,那么首先要配置相应的日志级别发送到指定的安全管理平台。
利用tail查看审计的日志,把tail的结果重定向给logger,重新打标记之后发送给syslog中的相应的日志级别。由syslog发送到安全管理平台中
tail -f /var/log/audit/audit.log |logger -it stationlog -p local3.notice&
为了使得开机启动 把这条命令写入到/etc/rc.local中
[root@localhost audit]# auditctl -l
No rules
[root@localhost audit]# auditctl -s
AUDIT_STATUS: enabled=1 flag=1 pid=985 rate_limit=0 backlog_limit=320 lost=0 backlog=0
[root@localhost audit]# ps -ef|grep audi
root 771 2 0 03:51 ? 00:00:00 [kauditd] 内核模块
root 985 1 0 03:51 ? 00:00:00 auditd 用户进程
root 1317 1238 0 06:12 pts/0 00:00:00 grep audi
审计(audit)是linux安全体系的重要组成部分,他是一种“被动”的防御体系。
在内核里有内核审计模块,核外有核外的审计后台进程auditd。
应用程序给内核发送审计消息,内核的审计模块再把消息转发给用户空间的后台进程auditd处理。
大概就是这么回事,我不是太深入,如果需要更多的内容,自己去查阅相关资料。如果没有好的资料,我推荐一本,《linux安全体系分析与编程》作者倪继利 。
审计说穿了就是把和系统安全有关的事件记录下来:谁谁谁在什么时候做了什么事,结果是啥。
审计的消息来源主要有两方面:
1.内核(我不太确定)、应用程序(audit-libs-devel包里面有编程接口)产生的。
2.系统管理员添加的审计规则,匹配规则的事件都将被记录下来。
规则添加:
1 添加文件监视:
该规则能监视文件被读、写、执行、修改文件属性的操作,并记录
auditctl -w /etc/passwd -p rwax
上述命令记录/etc/passwd 被读、写、执行修改属性的操作
2 系统调用入口监视(entry链表)
该规则在进入系统调用的时候触发,记录此时的执行上下文
auditctl -a entry,always -F UID=root -S mkdir
上述命令记录uid为root的用户调用mkdir系统调用的情况
3 系统调用出口(exit链表)
同系统调用入口规则,不同的是在退出系统调用的时候被触发
4 任务规则(task表)
该规则在调用fork() 或者clone()产生新进程的时候触发,因此,该规则适用的“域”仅仅是此时可见的,例如uid gid pid 等等。(参见man auditctl和这里
auditctl -a task,always -F uid=root
5 可信应用程序规则(user表)
按照各种资料上的说法,这里的user表是用来过滤消息的,内核传递给审计后台进程之前先查询这个表。
但是,不管怎么设置规则都达不到这个效果。如下:
auditctl -a user,always -F uid=root
添加上述规则,发现root的行为被记录。这样添加规则还是被记录:
auditctl -a user,never -F uid=root
后来发现我的CentOS里面system-config-audit上面,该链表被命名为“可信应用程序”。受此启发写了个小程序,向审计内核里写消息,发现这样的消息被过滤了。
这点需要进一步验证。
6 过滤规则(exclude表)
这个表是用来过滤消息的,也就是不想看到的消息可以在这里写规则进行过滤。
例如:不想看到用户登陆类型的消息,可以如下添加规则:
auditctl -a exclude,always -F msgtype=USER_LOGIN
这里过滤是以“消息类型”为对象的。
man auditctl
man auditd.conf
man audit.rules
auditctl -a exit,always -S open -S truncate -F dir=/etc -F success=0
auditctl -a exit,always -S open -F auid=510
auditctl -a exit,always -S all -F pid=1005
auditctl -a exit,always -F path=/etc/shadow -F perm=wa
auditctl -w /etc/ -p wa
auditctl -a exit,always -F dir=/etc/ -F perm=wa
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面的图片说明了Linux Audit的各个组成之间是如何相互作用的:
linux的审计功能(audit)(转) - llei - llei的学习笔记linux的审计功能(audit)(转) - llei - llei的学习笔记
图片上实线代表数据流,虚线代表组件关之间的控制系
auditd
Audit 守护进程负负责把内核产生的信息写入到硬盘上,这些信息是由应用程序和系统活动所触发产生的。Audit守护进程如何启动取决于它的配置文件,/etc /sysconfig/auditd。Audit系统函数的启动受文件/etc/audit/auditd.conf的控制。有关auditd更多的信息参照第三节:配置Audit守护进程。
auditctl
auditctl功能用来控制Audit系统,它控制着生成日志的各种变量,以及内核审计的各种接口,还有决定跟踪哪些事件的规则。关于auditctl的更多信息参照第四节:用auditctl控制Audit系统。
audit rules
在/etc/audit/audit.rules中包含了一连串auditctl命令,这些命令在audit系统被启用的时候被立即加载。更所关于审计规则的信息请参看第五节:给audit系统传递变量
aureport
aureport的功能是能够从审计日志里面提取并产生一个个性化的报告,这些日志报告很容易被脚本化,并能应用于各种应用程序之中,如去描述结果,更多信息参看第六节:理解审计日志和生成审计报告
ausearch
这个功能能让我们从审计日志之中通过关键词或者是格式化录入日志中的其它特征变量查询我们想要看到的信息。详细信息请参看第七节:用ausearch查询audit守护进程的的日志。
audispd
这是一个审计调度进程,它可以为将审计的信息转发给其它应用程序,而不是只能将审计日志写入硬盘上的审计日志文件之中。
autrace
这个功能更总类似于strace,跟踪某一个进程,并将跟踪的结果写入日志文件之中。更多详细信息请参看第八节:用autrace分析进程
/etc/audisp
/etc/audisp/audispd.conf
/etc/audisp/plugins.d
/etc/audisp/plugins.d/af_unix.conf
/etc/audisp/plugins.d/syslog.conf
/etc/audit
/etc/audit/audit.rules
/etc/audit/auditd.conf
/etc/rc.d/init.d/auditd
/etc/sysconfig/auditd
/sbin/audispd
/sbin/auditctl
/sbin/auditd
/sbin/aureport
/sbin/ausearch
/sbin/autrace
/usr/bin/aulast
/usr/bin/aulastlog
/usr/bin/ausyscall
/usr/bin/auvirt
type=CRYPTO_KEY_USER msg=audit(1410606795.368:1907135): user pid=21049 uid=0 auid=0 ses=1 msg='op=destroy kind=server fp=91:81:25:ac:cb:fc:07:aa:07:47:18:e2:17:57:61:bc direction=? spid=21049 suid=0 exe="/usr/sbin/sshd" hostname=? addr=192.168.2.83 terminal=? res=success'
type=CRYPTO_SESSION msg=audit(1410606795.368:1907136): user pid=21048 uid=0 auid=0 ses=1 msg='op=start direction=from-client cipher=blowfish-cbc ksize=128 spid=21049 suid=74 rport=54438 laddr=192.168.2.109 lport=22 exe="/usr/sbin/sshd" hostname=? addr=192.168.2.83 terminal=? res=success'
type=CRYPTO_SESSION msg=audit(1410606795.368:1907137): user pid=21048 uid=0 auid=0 ses=1 msg='op=start direction=from-server cipher=blowfish-cbc ksize=128 spid=21049 suid=74 rport=54438 laddr=192.168.2.109 lport=22 exe="/usr/sbin/sshd" hostname=? addr=192.168.2.83 terminal=? res=success'
type=USER_AUTH msg=audit(1410606795.691:1907138): user pid=21048 uid=0 auid=0 ses=1 msg='op=PAM:authentication acct="root" exe="/usr/sbin/sshd" hostname=192.168.2.83 addr=192.168.2.83 terminal=ssh res=success'
type=USER_ACCT msg=audit(1410606795.691:1907139): user pid=21048 uid=0 auid=0 ses=1 msg='op=PAM:accounting acct="root" exe="/usr/sbin/sshd" hostname=192.168.2.83 addr=192.168.2.83 terminal=ssh res=success'