2.3函数实现机制2.3.1.审计消息的天生 和发送函数2.3.1.1 根本 数据布局
内核审计体系 将审计消息写入审计缓冲区audit_buffer,由于审计信息是通过netlink 机制发往用户空间背景 进程 的 ,因此,审计缓冲区包罗 了对布局 sk_buff 形貌 的netlink套接字缓冲区,netlink套接字缓冲区用来存储用于发送的审计消息记录 。
审计缓冲区的数据布局 界说 如下:
struct audit_buffer {
struct list_head list;
struct sk_buff *skb; //格式化的netlink套接字缓冲区,预备 用于发送审计消息
/*每个进程 的审计上下文,包罗 进程 的状态、时间和 uid 等 ,与进程 上下文相干 ,可以为空 */
struct audit_context *ctx;
Gfp_t gfp_mask; //为缓冲区分配内存所利用 的标识,如:__GFP_WAIT
};
该布局 如图2-5所示 。
图2-5 audit_buffer布局
审计netlink套接字缓冲区skb构成 链表 ,用于存入添补 了审计消息的审计netlink套接字缓冲区指针,链表界说 如下(在 linux/kernle/audit.c 中):
static struct sk_buff_head audit_skb_queue ;
审计netlink套接字缓冲区链表用于存入审计消息,当链表中的缓冲区个数高出 上限时,当进步 程 必要 等待 用户空间的背景 进程 将审计消息写入 log 文件,直到缓冲区个数小于上限值为止。别的 ,内核审计体系 还利用 空闲审计缓冲区链表 audit_freelist 存放空闲的审计缓冲区,存放的个数上限为 AUDIT_MAXFREE。如许 ,维持肯定 命 据的空闲缓冲区数,对于频仍 操纵 的审计体系 来说 ,,可以镌汰 缓冲区的分配与开释 次数,进步 体系 性能 。空闲审计缓冲区链表的界说 列出如下:
#define AUDIT_MAXFREE (2*NR_CPUS)
static LIST_HEAD(audit_freelist);
在 Linux 内核必要 输出审计信息时,先调用函数 audit_log_start 创建缓冲区。接着 ,调用函数 audit_log 或 audit_log_format 写缓冲区写入审计信息,末了 调用函数audit_log_end 发送审计信息,并开释 缓冲区。这三个函数分别分析如2.3.1.1-2.3.1.3节所述 。
2.3.1.1分析函数audit_log_start
1.audit_log_start接口功能阐明
函数名:Audit_log_start
参数:ctx为审计上下文实例 ,gfp_mask为分配内存的范例 ,type为审计消息的范例 。
返回值:假如 审计缓冲区申请乐成 ,返回审计缓冲区的指针 ,否则返回 NULL。
功能:创建一个用于存放格式化审计消息的审计缓冲区 。
2.函数分析
函数 audit_log_start 申请审计缓冲区,当审计缓冲区链表的缓冲区个数高出 上限时,当进步 程 必要 等待 用户空间的背景 进程 将审计消息写入 log 文件 ,直到缓冲区个数小于上限值为止。函数 audit_log_start 在申请并初始化审计缓冲区后,给缓冲区加时间戳和审计记录 序列号。该函数的处理 惩罚 流程如图2-6所示。
图2-6 audit_log_start的流程图
2.3.1.2分析函数audit_log_format
1.audit_log_format接口功能阐明
函数名:Audit_log_format
参数:ab为审计缓冲区实例,fmt为格式化的字符串 。
返回值:无。
功能:格式化一个审计消息并放入审计缓冲区.
2.函数分析
该函数重要 调用audit_log_vformat函数,audit_log_vformat起首 查抄 netlink套接字缓冲区是否由充足 的空间 ,假如 空间不敷 ,则扩充缓冲区的空间,由于 printk一次打印的字节数最大为1024个字节 ,以是 这里扩充的空间就是1024个字节;然后,利用 vsnprintf函数向缓冲区写入审计消息的格式化字符串,audit_log_vforma的流程图如下图所示:
图2-7 audit_log_vformat的流程图
赞赏
人赞赏