计算机网站建设体会,网站改版怎么办,想换掉做网站的公司,北京网上申请营业执照audispd调研
1 问题背景
在Linux中#xff0c;当某个进程调用audit_set_pid将自己的pid保存到内核的audit模块后#xff0c;如果有日志生成#xff0c;kaudit内核线程就会通过netlink通信机制将审计日志发送给audit_pid#xff0c;因此#xff0c;只能有一个进程占用aud…audispd调研
1 问题背景
在Linux中当某个进程调用audit_set_pid将自己的pid保存到内核的audit模块后如果有日志生成kaudit内核线程就会通过netlink通信机制将审计日志发送给audit_pid因此只能有一个进程占用audit并接收audit日志那如果有另一个进程已经占用audit呢例如auditd或者其他组件。
一种方式是可以将选择权交给用户用户可以看到当前占用audit的进程然后再决定是否将已经占用audit的进程杀死然后进行占用。另一种方式是如果用户已经在使用auditd接收日志是否有一种方式可以让auditd在运行的同时我们也能够接收和处理日志呢这种场景下就可以使用audispd。
2 audispd
audispd是作为auditd的子进程运行而audispd会开启一些插件用于接收审计日志例如syslog或者sedispatch等也就是说日志转发路径变成了
kauditd - auditd - audispd - af_unix/syslog/sedispatch
下面逐个看下配置文件。
auditd.conf
local_events yes
write_logs yes // 将日志写入磁盘
log_file /var/log/audit/audit.log
log_group root
log_format RAW
flush INCREMENTAL_ASYNC // 刷新模式当前为异步增量刷新模式
freq 50 // 接收到多少条日志后就写入磁盘
max_log_file 8 // 日志文件大小8MB
num_logs 5 // 最大文件个数
priority_boost 4 //
disp_qos lossy
dispatcher /sbin/audispd // 将审计日志转发的目的进程的文件名以上是auditd.conf中的部分配置项除了控制auditd写入日志文件的配置项还有与日志转发相关的两个配置项dispatcherdisp_qos其中dispatcher是负责日志转发的组件auditd在启动后会拉起该程序然后将收到的日志转发给该程序该程序可以从标准输入读取审计日志disp_qos则是控制当审计日志太多时auditd和dispatcher之间的行为auditd和dispatcher之间有一个128K的队列当队列满时日志会被丢弃(lossy)或者auditd会等待队列有空间可以放入(lossless)。
audispd.conf
q_depth 250 // 队列深度
overflow_action SYSLOG // 当内部队列满时的行为当前值表示会写入一条syslog的日志
priority_boost 4 //
max_restarts 10 // 重启插件的最大次数
name_format HOSTNAME // 节点信息如何插入日志中当前值表示会将HOSTNAME写入到日志中
plugin_dir /etc/audisp/plugins.d/ // 插件的路径在plugin_dir目录下存放的就是插件的配置每个配置项告诉audispd应该如何转发日志例如af_unix.conf
active no // 是否启用yes/no
direction out //
path builtin_af_unix // 插件二进制的绝对路径对于内部插件就是插件的名称内部插件有af_unix和syslog
type builtin // 类型builtin/always
args 0640 /var/run/audispd_events // 参数
format string // 格式binary/string从插件类型看总共有三种类型
内部插件的af_unixaudispd将审计日志发送给unix套接字 内部插件的syslogaudispd将审计日志发送给syslog 外部插件audispd将审计日志发送给某个程序的标准输入
从上面对几个配置文件进行分析可以发现auditd和audispd只是作为审计日志转发的中间组件并且使用队列作为中间缓冲而对于内核的日志发送者来说日志的接收者只有auditd。
从几个组件的启动方来看auditd负责拉起audispdaudispd负责拉起always类型的插件。
因此如果在某些场景下希望与auditd同时运行且获取审计日志可以使用audispd的af_unix插件但是可能存在其他问题
规则是全局的多个程序都只设置自己的规则每个程序都会收到所有的数据对于新增af_unix插件的操作如果插件的目录是默认的当然没有问题如果是其他路径可能无法获取到插件目录audispd增加新的af_unix插件后需要重启auditd才能生效如果agent启动一段时间后出现问题退出就会导致频繁kill auditd会造成启动失败如果其他非auditd程序正在使用audit那就无法使用audispd如果audispd没有启动可能是由于启动异常也可能是由于没有需要启动的插件如何区分
3 高版本中的audispd
如何查看auditd的版本号auditd自身没有提供查看版本号的选项只能通过日志或者包管理工具查看auditd的版本号。
CentOS中在/var/log/messages中会打印auditd的版本号也可以通过rpm -qi audit查看版本号。对于ubuntu类在/var/log/kern.log中没看到auditd的版本号但是可以通过dpkg -l | grep auditd查看版本号。
audit-userspace仓库的标签最早只有2.7.4这个版本已经有audispd而从3.0.0开始audispd作为auditd的一个线程工作因此auditd就包含了audispd原有的能力。
4 audispd引入的性能问题
由于使用audispd进行日志中转在中转过程中引入了两个队列
auditd和audispd之间有一个128K的缓存队列disp_qos用于控制缓存队列满的行为audispd内部会维护一个队列q_depth用于控制队列的长度
测试环境
CentOS 7.5(3.10.0-1160.102.1.el7.x86_64)4C8Gaudit: backlog_limit8192
只启动auditdaudispd没有配置插件
是否丢弃日志可以通过查看auditctl -s中的lost或者/var/log/messages日志文件。
事件量级(eps)是否丢弃日志系统CPU1000NO1.3%5000NO5%6000NO6%7000NO7%8000YES8%9000YES10%10000YES10%
启动auditdaudispd开启af_unix插件并使用socat命令接收审计日志
使用socat - UNIX-CONNECT:/var/run/audispd_events命令接收审计日志是否丢弃日志可以查看/var/log/messages中的dispatch err (pipe full) event lost日志。
事件量级(eps)q_depth是否丢弃日志系统CPU备注50080NO2%500250NO2%5005000NO2%100080YES4%1000250YES4%10005000YES4%用例执行3分钟开始丢弃日志
不启动auditd使用其他程序占用并接收审计日志
#include stdio.h
#include libaudit.h
#include errno.hint main() {pid_t pid getpid();printf(current pid%d\n, pid);int fd audit_open();int ret 0;ret audit_set_pid(fd, pid, WAIT_YES);if(ret0) {perror(audit set_pid failed: );}ret audit_set_backlog_limit(fd, 8192);if(ret0) {perror(audit_set_backlog_limit failed: );}struct audit_reply audit_rep;struct sockaddr_nl local_addr;memset(local_addr, 0, sizeof(local_addr));local_addr.nl_family AF_NETLINK;do {fd_set read_mask;FD_ZERO(read_mask);FD_SET(fd, read_mask);ret select(fd 1, read_mask, NULL, NULL, NULL);if(ret 0 ) {break;}ret audit_get_reply(fd, audit_rep,GET_REPLY_NONBLOCKING, 0);audit_rep.msg.data[audit_rep.len] \0;printf(recv audit msg: %s\n, audit_rep.msg.data);} while(1);audit_close(fd);
}如果保留上面的代码中的printf语句事件量级只能到1000eps2000eps就开始丢弃日志如果将printf语句注释事件量级则可以到9000eps。
从上面的测试结果可以得出以下结论
auditd和audispd之间的队列对目标程序接收审计日志的影响很大完全限制了处理的审计日志量级audispd内部的q_depth参数对审计日志量级影响不大测试时可以忽略性能排序直接读取审计日志并快速处理 启动auditd但不启动audispd 启动audispd转发日志
5 结论
audispd能够将auditd收到的日志转发出来供多个程序使用也让其他程序能够得以与auditd同时运行但是使用该方式需要解决auditd的启停问题以及audispd带来的性能损耗问题因此如果直接使用audit接收日志不会引起其他的问题建议还是直接使用占用audit的方式。