【安全】audispd调研

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写入日志文件的配置项,还有与日志转发相关的两个配置项:dispatcher,disp_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_unix:audispd将审计日志发送给unix套接字
内部插件的syslog:audispd将审计日志发送给syslog
外部插件:audispd将审计日志发送给某个程序的标准输入

从上面对几个配置文件进行分析可以发现,auditd和audispd只是作为审计日志转发的中间组件,并且使用队列作为中间缓冲,而对于内核的日志发送者来说,日志的接收者只有auditd。

从几个组件的启动方来看,auditd负责拉起audispd,audispd负责拉起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)
  • 4C8G
  • audit: backlog_limit=8192

只启动auditd,audispd没有配置插件:

是否丢弃日志可以通过查看auditctl -s中的lost或者/var/log/messages日志文件。

事件量级(eps)是否丢弃日志系统CPU
1000NO1.3%
5000NO5%
6000NO6%
7000NO7%
8000YES8%
9000YES10%
10000YES10%

启动auditd,audispd开启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.h>int 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(ret<0) {perror("audit set_pid failed: ");}ret = audit_set_backlog_limit(fd, 8192);if(ret<0) {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语句,事件量级只能到1000eps,2000eps就开始丢弃日志;如果将printf语句注释,事件量级则可以到9000eps。

从上面的测试结果可以得出以下结论:

  • auditd和audispd之间的队列对目标程序接收审计日志的影响很大,完全限制了处理的审计日志量级
  • audispd内部的q_depth参数对审计日志量级影响不大,测试时可以忽略
  • 性能排序:直接读取审计日志并快速处理 > 启动auditd但不启动audispd > 启动audispd转发日志

5 结论

audispd能够将auditd收到的日志转发出来供多个程序使用,也让其他程序能够得以与auditd同时运行,但是,使用该方式需要解决auditd的启停问题以及audispd带来的性能损耗问题,因此,如果直接使用audit接收日志不会引起其他的问题,建议还是直接使用占用audit的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML有哪些列表以及具体的使用!!!

文章目录 一、HTML列表二、列表的应用1、无序列表2、有序列表3、自定义列表 三、总结 一、HTML列表 html的列表有三种&#xff0c;一种是无序列表&#xff0c;一种是有序列表&#xff0c;还有一种为自定义列表。 二、列表的应用 1、无序列表 <ul> <li>无序列表…

在GBASE南大通用ADO.NET 中调用一个存储过程

使用 GBASE南大通用ADO.NET 调用一个存储过程&#xff0c;要先创建一个GBASE南大通用Command 对象并且使用属性 CommandText 传递存储过程名&#xff0c;并将属性 CommandType 设为CommandType.StoredProcedure。为存储过程中的每个输入、输出参数创建一个GBaseCommand 参数。使…

nodejs 使用 ws/socket.io 模块 websocket 即时通讯

源码 koa-mongodb-template ws 模块 下载 npm install ws简单使用 服务端代码 const WebSocket require("ws"); const WebSocketServer WebSocket.WebSocketServer;const wss new WebSocketServer({ port: 8080 });// 监听客户端连接 wss.on("connectio…

【Linux】冯诺依曼体系结构与操作系统及其进程

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解冯诺依曼体系结构与操作系统&#xff0c;掌握…

我为什么从来不给患者方子?

有的患者问&#xff1a;“大夫我给您几百块钱处方费&#xff0c;拿您的方子自己去抓&#xff0c;行吗&#xff1f;” 我笑着回答&#xff1a;“不行的&#xff0c;跟钱没有关系&#xff0c;原因有以下四个。” 【1】 有的患者带方子走后&#xff0c;找抓药的人或者别的中医对…

用bash写脚本

本章主要介绍如何使用bash写脚本。 了解通配符 了解变量 了解返回值和数值运算 数值的对比 判断语句 循环语句 grep的用法是“grep 关键字 file”&#xff0c;意思是从file中过滤出含有关键字的行。 例如&#xff0c;grep root /var/log/messages&#xff0c;意思是从/var/log/…

【工作流Activiti】MyActivit的maven项目

1、Idea新建一个项目MyActivit的maven项目 2、安装插件 在 idea 里面&#xff0c;activiti 的插件叫 actiBPM&#xff0c;在插件库里面把它安装好&#xff0c;重启 idea 就行了。 3、 maven 项目中&#xff0c;并更改 pom.xml。pom 中依赖如下&#xff1a; <?xml version…

Postman使用总结-断言

让 Postman 工具 代替 人工 自动判断 预期结果 和 实际结果 是否一致 断言代码 书写在 Tests 标签页中。 查看断言结果 Test Results 标签页

安防视频云平台/可视化监控云平台EasyCVR获取设备录像失败,该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。GB28181音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视…

鸿蒙-arkTs:基础组件

图片组件 - Image(src: string | PixelMap | Resource) string格式&#xff1a;加载远程地址图片&#xff08;需要配置ohos.permission.INTERNET&#xff09;PixelMap格式&#xff1a;加载像素图Resource格式&#xff1a;加载本地图片&#xff08;Image($r(app.media.icon))&a…

torch.optim.lr_scheduler.LambdaLR( )函数的用法

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch-1) 是 PyTorch 中的学习率调度器类之一&#xff0c;用于根据自定义的函数 lr_lambda 调整优化器的学习率 用法: torch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambda,last_epoch-1)参数说明&#xf…

linux中数据库的概念、mysql的两种安装方法

数据库 数据库数据库DBsql语言关系型数据库&#xff08;SQL&#xff09;非关系型数据库&#xff08;NOSQL&#xff09;关系型数据库与非关系型数据库的区别 Mysqlmysql定义版本演化 Mysql安装Mysql源码安装准备环境清理环境安装依赖包添加MySQL用户添加mysql组创建数据目录和其…

鸿蒙实现年月日十分选择框,支持年月日、月日、日、年月日时分、时分切换

import DateTimeUtils from ./DateTimeUtils;CustomDialog export default struct RQPickerDialog {controller: CustomDialogControllertitle: string 这是标题TAG: string RQPickerDialog// 0 - 日期类型&#xff08;年月日&#xff09; 1 - 时间类型&#xff08;时分&a…

Ubuntu安装ARM交叉编译器

Ubuntu安装交叉编译器 更新apt # 更新apt sudo apt update安装gcc sudo apt install build-essential查看gcc版本 gcc -v下载交叉编译工具 复制到用户目录 解压 tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz移动到/opt/下 sudo ./gcc-linaro-5.…

14、Kafka 请求是怎么被处理的

Kafka 请求是怎么被处理的 1、处理请求的 2 种常见方案1.1、顺序处理请求1.2、每个请求使用单独线程处理 2、Kafka 是如何处理请求的&#xff1f;3、控制类请求和数据类请求分离 无论是 Kafka 客户端还是 Broker 端&#xff0c;它们之间的交互都是通过 “请求 / 响应” 的方式完…

42 经典回溯算法题-全排列

问题描述&#xff1a;给你的那个一个不好喊重复数字的数组nums&#xff0c;返回其所有可能的全排列&#xff0c;你可以按照任何顺序返回答案&#xff1b; 回溯算法求解&#xff1a;定义一个used数组用来表征数组nums是否被选择&#xff0c;每一个回溯函数都要经过nums.length个…

Home Assistant HAOS版如何安装HACS

环境&#xff1a; Home Assistant 11.2 SSH & Web Terminal 17.0 问题描述&#xff1a; Home Assistant HAOS版如何安装HACS 解决方案&#xff1a; 1.打开WEB 里面的终端输入下面命令 wget -O - https://hacs.vip/get | bash -如果上面的命令执行后卡住不动&#xff…

深度学习模型(目标检测)轻量化压缩算法的挑战与解决方法

深度学习模型&#xff0c;尤其是用于目标检测的模型&#xff0c;是高度复杂的&#xff0c;通常包括数以百万计的参数和复杂的层次结构。虽然模型压缩和轻量化算法允许这些模型在资源受限的设备上部署和运行&#xff0c;但这仍然是一个活跃和具有挑战性的研究领域&#xff0c;包…

R语言生物群落(生态)数据统计分析与绘图丨R语言基础、tidyverse数据清洗、多元统计分析、随机森林模型、回归及混合效应模型、结构方程模型、统计结果作图

R 语言的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。本教程以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自…

js 字符串之间转换

一. 字符串转换 &#xff08;1&#xff09;对象转字符串stringify var str JSON.stringify(weather);&#xff08;2&#xff09;字符串转对象 var obj JSON.parse(str);&#xff08;3&#xff09;数字转字符串toString() var num 2023; var str ; str num.toString();…