原标题:Linux安全审计机制模块实现分析(16)-核心文件之三auditsc.c文件描述及具体变量、函数定义
2.4.3文件三auditsc.c2.4.3.1 文件描述
kernel/auditsc.c
static void audit_set_auditable(struct audit_context *ctx)
功能:把进程审计上下文的状态设置为可审计的(审计上下文将在系统调用结束时被写出)。
static int audit_filter_rules(struct task_struct *tsk, struct audit_krule *rule, struct audit_context*ctx, struct audit_names *name, enum audit_state *state,bool task_creation)
功能:确定审计上下文中的审计项目是否符合给定的规则(即:这些项目是否应该被审计)
static enum audit_state audit_filter_task(struct task_struct *tsk, char **key)
功能:遍历task规则链表,以确定是否有一条规则要求该进程的某些信息应该被审计。
static enum audit_state audit_filter_syscall(struct task_struct *tsk, struct audit_context *ctx, struct list_head *list)
功能:在系统调用进入或退出时进行规则过滤。
static inline struct audit_context *audit_alloc_context(enum audit_state state)
功能:分配进程审计上下文。在进程创建时,如果进程需要被审计,就调用该函数。
static void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
功能:将进程的名字以及所有映射到内存的文件的路径信息生成审计消息。
void __audit_syscall_entry(int arch, int major, unsigned long a1, unsigned long a2, unsigned long 3, unsigned long a4)
功能:进入系统调用时执行的函数,把程序的执行信息、审计消息的当前序列号,查询规则链表后获得的对进程的审计项目应采取的动作等信息暂存到审计上下文中。
void __audit_syscall_exit(int success, long return_code)
功能:系统调用结束时调用的函数。如果审计上下文的状态是AUDIT_RECORD_CONTEXT,就将上下文中的信息全部写出。
2.4.3.2主要变量及宏定义
int audit_n_rules; //审计系统中的规则总数
2.4.3.3结构体定义
struct audit_names { //进程执行时的审计项目
struct list_head list;// 用来形成链表audit_context->names_list
const char*name; //当调用getname()时,这个指针指向名字
unsigned longino; //当调用path_lookup()时,把inode信息和dev信息保存下来,以下类似
dev_tdev;
umode_tmode;
uid_tuid;
gid_tgid;
dev_trdev;
u32osid;
struct audit_cap_data fcap; //保存能力数据
unsigned intfcap_ver;
intname_len;//审计项目名字长度
boolname_put;//是否调用__putname()释放名字,如果否,可以在系统调用结束时释放*/
boolshould_free;
};
struct audit_aux_data { //进程审计辅助数据,是所有进程审计辅助数据的基类
struct audit_aux_data*next;
inttype; //数据的类型
};
struct audit_aux_data_execve { //记录程序执行的进程审计辅助数据
struct audit_aux_datad; //继承基类
int argc; //程序执行的参数
int envc; //程序执行的环境变量
struct mm_struct *mm; 程序执行的内存映射
};
struct audit_context { //进程审计上下文
intdummy;//必须是第一个元素
intin_syscall;//进程是否在系统调用中
enum audit_state state, current_state; //审计状态
unsigned intserial; //审计消息的序列号
intmajor; //系统调用号
struct timespecctime; // 系统调用进入的时间
unsigned longargv[4]; /* 系统调用参数*/
longreturn_code;/* 系统调用返回码*/
u64prio; /*审计消息优先级*/
intreturn_valid; /* 返回是否有效*/
struct audit_names preallocated_names[AUDIT_NAMES]; /*审计项目的预分配链表*/
intname_count; /*审计项目的总数*/
struct list_head names_list;/* 所有的审计项目*/
char *filterkey;/*触发记录的关键词*/
struct pathpwd; /*当前工作路径*/
struct audit_context *previous; /* 上一个审计上下文,系统调用嵌套时使用*/
struct audit_aux_data *aux; /*进程审计辅助数据*/
struct sockaddr_storage *sockaddr;
/* 以下是进程的有关数据*/
pid_tpid, ppid;
uid_tuid, euid, suid, fsuid;
gid_tgid, egid, sgid, fsgid;
unsigned longpersonality;
intarch;
pid_ttarget_pid;
uid_ttarget_auid;
uid_ttarget_uid;
unsigned inttarget_sessionid;
u32target_sid;
chartarget_comm[TASK_COMM_LEN];
……
};
2.4.3.4外部函数
struct sk_buff *audit_make_reply(int pid, int seq, int type, int done,
int multi, const void *payload, int size)
功能:生成应答消息。
2.4.3.5内部函数
static void audit_set_auditable(struct audit_context *ctx)
功能:把进程审计上下文的状态设置为可审计的(审计上下文将在系统调用结束时被写出)。
static int audit_filter_rules(struct task_struct *tsk, struct audit_krule *rule, struct audit_context*ctx, struct audit_names *name, enum audit_state *state,bool task_creation)
功能:确定审计上下文中的审计项目是否符合给定的规则(即:这些项目是否应该被审计)
static enum audit_state audit_filter_task(struct task_struct *tsk, char **key)
功能:遍历task规则链表,以确定是否有一条规则要求该进程的某些信息应该被审计。
static enum audit_state audit_filter_syscall(struct task_struct *tsk, struct audit_context *ctx, struct list_head *list)
功能:在系统调用进入或退出时进行规则过滤。
static inline struct audit_context *audit_alloc_context(enum audit_state state)
功能:分配进程审计上下文。在进程创建时,如果进程需要被审计,就调用该函数。
static void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
功能:将进程的名字以及所有映射到内存的文件的路径信息生成审计消息。
void __audit_syscall_entry(int arch, int major, unsigned long a1, unsigned long a2, unsigned long 3, unsigned long a4)
功能:进入系统调用时执行的函数,把程序的执行信息、审计消息的当前序列号,查询规则链表后获得的对进程的审计项目应采取的动作等信息暂存到审计上下文中。
void __audit_syscall_exit(int success, long return_code)
功能:系统调用结束时调用的函数。如果审计上下文的状态是AUDIT_RECORD_CONTEXT,就将上下文中的信息全部写出。
责任编辑: