Linux Secrity Module (LSM) 源码导读
本文介绍的是linux-3.5.2,官网下载的。
一、init目录下main.c function: start_kernel
line 614: security_init();
int __init security_init(void)
{
printk(KERN_INFO "Security Framework initialized\n");
security_fixup_ops(&default_security_ops); //初始化结构体里面的函数。
security_ops = &default_security_ops; //赋值 以后的操作就是通过这个security_ops来调用各个函数的。
do_security_initcalls(); //
return 0;
}
default_security_ops的定义:
static struct security_operations default_security_ops = {
.name = "default",
};
看下面的结构体:
struct security_operations {
char name[SECURITY_NAME_MAX + 1];
int (*ptrace_access_check) (struct task_struct *child, unsigned int mode);
int (*ptrace_traceme) (struct task_struct *parent);
int (*capget) (struct task_struct *target,
kernel_cap_t *effective,
kernel_cap_t *inheritable, kernel_cap_t *permitted);
int (*capset) (struct cred *new,
......
所以:
security_fixup_ops(&default_security_ops);就是将结构体security_operations里面的函数指针进行了初始化。这里所有的函数都是return 0;都是空实现,需要自己去实现的。LSM只是提供了一个框架。
具体的实现可参看:SElinux apparmor的源码实现。后面我可能会写一些相关实现的文章。
do_security_initcalls()里面干了些什么:
static void __init do_security_initcalls(void)
{
initcall_t *call;
call = __security_initcall_start; // extern initcall_t __security_initcall_start[], __security_initcall_end[];
while (call < __security_initcall_end) {
(*call) ();
call++;
}
}
上面的函数怎么理解?
先看下面两个宏:
#define security_initcall(fn) \ static initcall_t __initcall_##fn \ __used __section(.security_initcall.init) = fn
#define SECURITY_INIT \
.security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__security_initcall_start) = .; \
*(.security_initcall.init) \
VMLINUX_SYMBOL(__security_initcall_end) = .; \
}
security_initcall(fn)函数就是把相应的fn结构放到指定的段 .security_initcall.init 里面去的。
所以这里的 do_security_initcalls ()就是将 security_initcall 函数加载到的内容 全部初始化。例如:
security_initcall(apparmor_init);就是在这里将apparmor加入LSM框架的。
综上所述:LSM就是在main.c里面初始化的一个linux security框架,然后你可以更具自己需要去完成相关函数,以实现你需要的权限控制。
ps: 第一篇文章写得不好,多多提建议。我会改进的。

浙公网安备 33010602011771号