linux审计子系统:内核层执行原理

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

1.2 audit_fsnotify_init

2. 源码结构

3. 部分结构定义

4. 扩展函数


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_net_ops

audit_initialized = AUDIT_INITIALIZED; // 已初始化

kauditd_task = kthread_run(kauditd_thread, NULL, "kauditd"); // 运行队列服务线程
// kauditd_thread 向用户空间发送审核记录的工作线程

kauditd_thread

audit_log(NULL, GFP_KERNEL, AUDIT_KERNEL,
                "state=initialized audit_enabled=%u res=1",
                 audit_enabled); // 记录审计信息,初始化完成

        return 0;
}
postcore_initcall(audit_init);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坤昱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值