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: 第一篇文章写得不好,多多提建议。我会改进的。

posted @ 2015-03-13 21:24  JustRelax  阅读(1017)  评论(0)    收藏  举报