2.3 进程的审计
进程的审计包括系统调用的审计和一些内核函数的审计。系统调用的审计是在系统调用的入口和出口处加上审计函数,内核函数的审计是在函数内部的审计点加上审计hook函数,这些审计函数将需要截获的消息通过规则过滤后,填充到审计上下文,在系统调用退出时,进程将审计上下文发送给审计后台。
2.3.1 进程审计上下文
每个进程的进程结构(或者进程上下文)含有审计上下文结构audit_context指针,审计上下文记录进程上下文的审计信息,当进程从进入系统调用和退出系统调用时,使用审计上下文结构audit_context记录系统调用进入和退出的各种属性数据,如:时间戳、参数、调用号等。审计上下文还通过辅助数据结构链表记录进程运行中的各种关键数据结构的审计信息。
对于系统调用来说,审计上下文只能记录系统调用进入和退出时的审计信息,审计上下文所描述的数据在系统调用退出时可以通过内核审计系统发送给审计后台,由审计后台写入到log文件中。这样,审计上下文的使用周期为一个系统调用过程,每完成一次系统调用过程,就将审计上下文信息写出一次。审计信息写出后,审计上下文就可以清空,为下次系统调用做好准备。
每个进程的进程结构task_struct含有审计上下文结构audit_context指针,其列出如下(在linux26/include/linux/sched.h中):
struct task_struct {
......
struct audit_context *audit_context;
......
}
|
审计上下文结构audit_context列出如下(在linux26/kernel/auditsc.c中):
/* 每个任务的审计上下文*/
struct audit_context {
int dummy;
/*必须是第一个元素*/
int in_syscall;
/*如果任务在一个系统调用中,设置为1 */
enum audit_state state;
/*审计状态*/
unsigned int serial;
/*记录的序列号*/
struct timespec ctime;
/*系统调用入口的时间*/
uid_t loginuid;
/*注册的用户uid */
int major;
/*系统调用号 */
unsigned long argv[4];
/*系统调用参数*/
int return_valid;
/*返回代码有效*/
long return_code;
/*系统调用返回代码*/
int auditable;
/*为1表示记录已被写入log文件*/
int name_count;
struct audit_names names[AUDIT_NAMES];
//存储getname()得到的文件名和文件属性信息,以便记录
char * filterkey;/*触发记录的规则的关键字*/
struct dentry * pwd; /*当前目录*/
struct vfsmount * pwdmnt; /*文件系统挂接的当前目录*/
struct audit_context *previous;
/* 以前的审计上下文,用于系统调用进入到退出时配对*/
struct audit_aux_data *aux;
/* 用于存储需要打印的task_struct结构信息*/
pid_t pid, ppid;
uid_t uid, euid, suid, fsuid;
gid_t gid, egid, sgid, fsgid;
unsigned long personality;
int arch;
#if AUDIT_DEBUG
int put_count;
int ino_count;
#endif
};
|
在任务启动时,用每个任务的过滤器设置审计上下文中的audit_state值,在系统调用入口,系统调用过滤器设置audit_state值。枚举变量audit_state列出如下:
enum audit_state {
AUDIT_DISABLED,
/*不创建审计上下文,不产生系统调用审计记录*/
AUDIT_SETUP_CONTEXT,
/*创建审计上下文,但在系统调用进入时,不必填充审计上下文*/
AUDIT_BUILD_CONTEXT,
/*创建审计上下文并总是在系统调用进入时填充它,由内核其他部分决定是否产生完全的系统调用记录*/
AUDIT_RECORD_CONTEXT
/*创建审计上下文并总是在系统调用进入时填充它,总是在系统调用退出时写出记录*/
};
|
结构audit_aux_data用来存储审计辅助数据,包括进程运行过程中的各种关键结构信息等,其列出如下:
struct audit_aux_data {
struct audit_aux_data*next;
inttype;
};
|
结构audit_aux_data是其他派生结构的基类,派生结构描述了具体的审计信息,派生结构一般将基类结构作为第一个成员。通过基类结构指针,可将描述具体信息的派生结构形成链表放在审计上下文中。
派生结构可根据需要记录信息的任意扩展,例如:记录执行应用程序环境信息和路径信息的结构分别列出如下(在linux26/kernel/auditsc.c中):
struct audit_aux_data_execve {
struct audit_aux_datad;
int argc;
int envc;
char mem[0];
};
struct audit_aux_data_path {
struct audit_aux_datad;
struct dentry*dentry;
struct vfsmount*mnt;
};
|
| 回书目 上一节 下一节 |