Linux安全模块(LSM)学习——SMACK

给自己打个广告,欢迎走过路过的关注一下我的个人主页:zhangxin00.github.io

0.概述

SMACK(Simplified Mandatory Access Control Kernel)的机制是类型增强(Type Enforcement),而没有去更贪心的实现基于角色的访问控制和多级安全,所以将其作为第二个学习的模块。

类型在SMACK中的具体体现是label,定义一个策略(规定主体可以对客体进行什么操作)的格式为
subjectlabel objectlabel access

结构体cred中的security指针会指向SMACK定义的数据结构task_smack的一个实例。


struct cred {
	atomic_t	usage;
	kuid_t		uid;		/* real UID of the task */
	kgid_t		gid;		/* real GID of the task */
	kuid_t		suid;		/* saved UID of the task */
	kgid_t		sgid;		/* saved GID of the task */
	kuid_t		euid;		/* effective UID of the task */
	kgid_t		egid;		/* effective GID of the task */
	kuid_t		fsuid;		/* UID for VFS ops */
	kgid_t		fsgid;		/* GID for VFS ops */
	unsigned	securebits;	/* SUID-less security management */
	kernel_cap_t	cap_inheritable; /* caps our children can inherit */
	kernel_cap_t	cap_permitted;	/* caps we're permitted */
	kernel_cap_t	cap_effective;	/* caps we can actually use */
	kernel_cap_t	cap_bset;	/* capability bounding set */
	kernel_cap_t	cap_ambient;	/* Ambient capability set */

------------------------------------------------
#ifdef CONFIG_SECURITY
	**void		*security;	/* subjective LSM security */**
#endif
-------------------------------------------------

struct user_struct *user;	/* real user ID subscription */
	struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */
	struct group_info *group_info;	/* supplementary groups for euid/fsgid */
	/* RCU deletion */
	union {
		int non_rcu;			/* Can we skip RCU deletion? */
		struct rcu_head	rcu;		/* RCU deletion hook */
	};
} __randomize_layout;
struct task_struct{
   ......
	/* Process credentials: */

	/* Tracer's credentials at attach: */
	const struct cred __rcu		*ptracer_cred;

	/* Objective and real subjective task credentials (COW): */
	const struct cred __rcu		*real_cred;

	/* Effective (overridable) subjective task credentials (COW): */
	const struct cred __rcu		*cred;
	......
}

在SMACK中,客体包含进程、文件、进程间通信、套接字、密钥等,文件和套接字的标签来自扩展属性,其它的都来自创建他们的进程的标签。

SMACK定义了6种操作:读(r),写(w),执行(x),追加(a),变形(t),锁(l)

变形(transmute)是SMACK独立定义的一个操作,如果安全策略允许进程对目录进行w和t操作,并且新文件或新目录所在目录有SMACK64TRANSMUTE属性(为真),则新文件或新目录的安全标签的值=目录的安全标签值。否则为当前进程的安全标签值。

1.SMACK的工作机制

类型内的操作许可

在SMACK中允许带有X标签的主体对带有Y标签的客体进行Z操作。操作有6种:读(r),写(w),执行(x),追加(a),变形(t),锁(l)。

类型转换

类型转换解决的问题是标签的初始值是什么,在什么情况下可以改变成什么值。对应到源码中,类型转换就是安全标签的赋值操作。
主体(进程)的安全标签值有三个来源:
(1)进程复制时,子进程获得父进程的安全标签值。
(2)进程执行系统调用execve时,如果被执行文件有扩展属性security.SMACK64EXEC,则执行execve后,进程安全标签为被执行文件的扩展属性security.SMACK64EXEC的值。
(3)通过伪文件接口/proc/[pid]/attr/current改变进程的安全标签,这种方法只能改变进程自己的安全标签,需要进程具备CAP_MAC_ADMIN的能力,进程的安全标签等于SMACK内部变量smack_onlycap,或smack_onlycap为空。

客体的安全标签存储在task_smack中的一些成员变量(扩展属性)中,如文件的安全标签存储在扩展属性security.SMACK64中。

2.扩展属性

SMACK过于简单的策略难以应付复杂的系统,所以引入了多个扩展属性:
(1)SMACK64:最基本的扩展属性,文件客体的安全标签来自此属性。
(2)SMACK64EXEC:当进程执行exec系统调用时,进程的新安全标签来自被执行文件的security.SMACK64EXEC属性。
(3)SMACK64TRANSMUTE:当此值为TRUE时,在此目录下新建的文件/目录的安全标签的值(SMACK64) 来自此目录的安全标签 (SMACK64) 。

参考资料

《Linux内核安全模块深入剖析》

你可能感兴趣的:(博士学习,linux,安全,运维)