Linux安全审计机制模块,Linux安全审计机制模块实现分析(3)

2.3.1.3分析函数audit_log_end

1.audit_log_end接口功能说明

函数名:audit_log_end

参数:ab为审计缓冲区

返回值:无

功能:利用netlink机制发送审计缓冲区中的消息。

2.函数分析

该函数首先看审计后台进程是否存在,如果存在,则用netlink套接字发送审计消息,如果不存在则用printk把审计消息打印到日志。该函数流程图如下图所示:

0818b9ca8b590ca3270a3433284dd417.png

图2-8 audit_log_end流程图

2.3.2.内核审计系统的初始化

用来初始化内核审计系统的函数是auidt_init,该函数在内核初始化阶段被调用,它创建nelink机制套接字,注册接收函数。该函数的处理流程如下图:

0818b9ca8b590ca3270a3433284dd417.png

图2-9  audit_init函数的流程图

另外,函数audit_enable根据内核引导时的命令行参数设置审计系统的状态,参数audit=1表示开启,audit=0表示禁用。

对于文件系统的审计初始化,是由audit_watch_init函数创建并初始化一个监视处理实例audit_watch_group,用于处理文件系统监视事件。该函数的调用层次如下图:

0818b9ca8b590ca3270a3433284dd417.png

图2-10  audit_watch_init调用层次图

fsnotify_alloc_group是fsnotify机制提供的一个函数,用来创建监视处理实例,这里的监视处理实例是audit_watch_group,它的操作函数集是audit_watch_fsnotify_ops。

2.3.3用于审计消息过滤的规则链表

查看审计消息是否符合规则,是通过将审计消息的域和规则域进行运算匹配完成的,规则域共支持6种运算:等于、不等于、小于、大于、小于或等于和大于或等于。内核审计系统中有效的规则域见表2-1:

表2-1   规则域说明

有效的

规则域

a0, a1, a2, a3

对应系统调用的前4 个参数。不支持字符串参数。常用于复合的套接字或IPC 操作

arch

系统调用的CPU 构架

auid

audit uid ,是用户注册的最初的ID

b32

用于32位系统调用表的arch

b64

用于64 位系统调用表的arch

devmajor

主设备号(Device Major Number)

devminor

次设备号(Device Minor Number)

egid

有效组ID

euid

有效用户ID

exit

从一个系统调用退出时的值

fsgid

文件系统组ID

gid

组ID

inode

索引节点号

key

设置过滤关键字,与-k 选项一样

msgtype

用于匹配消息类型编号,仅用于排除(exclude )过滤链表

obj_user

资源的SE Linux 用户

obj_role

资源的SELinux 角色

obj_type

资源的SELinux 类型

obj_lev_low

资源的SELinux 低级别

obj_lev_hi gh

资源的SELinux 高级别

path

监视的文件的全路径,仅用于exit链表

pers

操作系统(OS )个人特征序列号

pid

进程ID

ppid

父进程ID

subj_user

程序的SE Linux 用户

subj_role

程序的SELinux 角色

subj_type

程序的SELinux 类型

subj_sen

程序的SELinux 敏感度(Sensitivity)

subj_clr

程序的SE Linux 的间隔(Clearance)

sgid

设置组ID

success

如果退出值大于或等于0 ,这个值为true/yes,否则为false/no 。

写规则时,用1 表示true/yes ,用0 表示false/no

suid

设置用户ID(Set User ID)

uid

用户ID(User ID)

-w

为文件系统对象 插入一个watch( 监视)。不支持匹配符

-W

移去文件系统对象

2.3.3.1规则链表的相关数据结构

结构 audit_krule 表示一条审计规则,其主要成员列出如下:

struct audit_krule {

……

u32 flags;  /*加规则到链头或链尾,如:AUDIT_FILTER_PREPEND*/

u32  listnr;   /*规则链表标识,如:AUDIT_FILTER_EXIT */

u32  action;  /*操作域,为 never 或 always,如:AUDIT_ALWAYS

u32  mask[AUDIT_BITMASK_SIZE];   /*系统调用号计算成掩码位,如:open系统调用*/

u32 buflen;    /*链表规则上分配的缓冲区长度*/

u32 field_count;  /*规则域数组的成员个数*/

char *filterkey; /*当 fields->type= AUDIT_FILTERKEY 时的过滤关键字*/

struct audit_field *fields;   /*规则域数组,定义规则的事件类型及比较运算符等*/

struct audit_field *inode_f;  /*对一个 inode 域的快速访问 */

struct audit_watch *watch;  /*用于文件系统监视的watch实例*/

struct list_head rlist;    /*用于链接使用同一个watch的规则*/

};

其中结构listnr指明是6个规则链表中的哪一个,action是审计系统对符合该规则的审计消息所采取的动作, audit_field结构存放着审计规则的规则域,规则域包括事件类型、比较运算符、比较值和 SELinux的审计规则。

结构 audit_field表示一个规则域,列出如下 :

struct audit_field {

u32type;     /* 域的类型,比如AUDIT_PID*/

u32val;      /*用于和审计消息的相关信息比较的值,如:510*/

u32op;       /*操作符号定义,如:等于*/

char*lsm_str;

void*lsm_rule;

};

内核过滤规则链表由audit_entry类型的元素组成,每个该类型的元素中封装着一条审计规则,该结构列出如下:

struct audit_entry {

struct list_head    list;

struct rcu_head     rcu;

struct audit_krule  rule;

};

audit_entry, audit_krule和规则域之间的关系如图所示:

0818b9ca8b590ca3270a3433284dd417.png

图2-11 audit_entry, audit_krule和规则域之间的关系

内核规则链表共有六种类型。如表2-2所示:

表2-2    规则链表的类型

规则链表的类型标认识

名称

用途

AUDIT_FILTER_USER

user规则链表

用于过滤用户产生的审计消息

AUDIT_FILTER_TASK

task规则链表

用于任务(进程)创建时的消息过滤

AUDIT_FILTER_ENTRY

entry规则链表

用于进入系统调用时的消息过滤

AUDIT_FILTER_WATCH

watch规则链表

用于文件系统监视的消息过滤

AUDIT_FILTER_EXIT

exit规则链表

用于系统调用结束时的消息过滤

AUDIT_FILTER_TYPE

type规则链表

专门用于audit_log_start函数的消息过滤

当应用程序auditctl设置过滤规则时,必须指明规则对应的链表。所有类型的规则链表统一存放在audit_filter_list数组当中,如下图所示:

0818b9ca8b590ca3270a3433284dd417.png

图2-12 规则链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值