linux审计子系统用于记录内核部分子模块及应用层(应用程序)的运行状态,如文件系统、进程、systemd应用的执行进展、遇到的问题等信息。审计子系统通过netlink与auditd应用建立kernel <-> audit直接的通信,并通过auditd把信息写入/var/log/audit/audit.log文件(默认地址,可以设置)。
linux审计子系统内核部分设计相对较为简单,甚至内核文档都没有找到关于它的单独描述(只找到了它的函数定义描述)。
linux审计子系统主要看audit_init和audit_fsnotify_init函数即可明白它的大致流程。audit_init函数主要用于分配审计缓存(audit_log_start中获取审计缓冲区的时候使用),初始化audit_queue(审计队列)、audit_retry_queue(重审队列)、audit_hold_queue(保留队列),注册audit_net_ops(网络命名空间子系统,在net结构对象init_net中记录、遍历),运行队列服务线程,它的核心点在kauditd_thread线程函数, kauditd_thread线程函数随着审计系统启动一直运行到审计系统退出,它在有信息时按顺序检查、发送队列信息(audit_hold_queue -> audit_retry_queue -> audit_queue),无信息时进入休眠状态,依次循环一直到退出。而audit_fsnotify_init函数主要用于状态的变更,如多播侦听器是否生效,是否可以多发消息,是否从冻结状态唤醒等等。
1. 函数分析
1.1 audit_init
audit_init 分配审计缓存(audit_log_start中获取审计缓冲区的时候使用),初始化audit_queue(审计队列)、audit_retry_queue(重审队列)、audit_hold_queue(保留队列),注册audit_net_ops(网络命名空间子系统,在net结构对象init_net中记录、遍历),运行队列服务线程
kauditd_thread线程函数随着审计系统启动一直运行到审计系统退出,它在有信息时按顺序检查、发送队列信息(audit_hold_queue -> audit_retry_queue -> audit_queue),无信息时进入休眠状态,依次循环一直到退出
static int __init audit_init(void)
{
int i;
if (audit_initialized == AUDIT_DISABLED) // 如果禁用审计模块,直接返回
return 0;
audit_buffer_cache = kmem_cache_create("audit_buffer",
sizeof(struct audit_buffer),
0, SLAB_PANIC, NULL); // 分配审计缓存
skb_queue_head_init(&audit_queue); // 初始化审计队列,通过kauditd_task发送(kauditd_thread)
skb_queue_head_init(&audit_retry_queue); // 重审队列,由于临时单播发送问题而将消息排队
skb_queue_head_init(&audit_hold_queue); // 保留队列,队列消息等待新的审核连接
for (i = 0; i < AUDIT_INODE_BUCKETS; i++)
INIT_LIST_HEAD(&audit_inode_hash[i]); // 基于索引节点的规则的散列(哈希节点)
register_pernet_subsys(&audit_net_ops);
// 注册网络命名空间子系统
// 注册一个子系统,该子系统具有
// 分别在创建和销毁网络命名空间时调用的init和exit函数
// 注册后,所有网络命名空间的初始化函数
// 都会为每个现有的网络命名空间调用
// 允许内核模块拥有一组网络命名空间的无竞争视图
// first_device <- ops
audit_initialized = AUDIT_INITIALIZED; // 已初始化
kauditd_task = kthread_run(kauditd_thread, NULL, "kauditd"); // 运行队列服务线程
// kauditd_thread 向用户空间发送审核记录的工作线程
audit_log(NULL, GFP_KERNEL, AUDIT_KERNEL,
"state=initialized audit_enabled=%u res=1",
audit_enabled); // 记录审计信息,初始化完成
return 0;
}
postcore_initcall(audit_init);

最低0.47元/天 解锁文章
1237

被折叠的 条评论
为什么被折叠?



