SELinux源码分析_1.31

上传人:pu****.1 文档编号:485510100 上传时间:2023-04-17 格式:DOC 页数:96 大小:1MB
返回 下载 相关 举报
SELinux源码分析_1.31_第1页
第1页 / 共96页
SELinux源码分析_1.31_第2页
第2页 / 共96页
SELinux源码分析_1.31_第3页
第3页 / 共96页
SELinux源码分析_1.31_第4页
第4页 / 共96页
SELinux源码分析_1.31_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《SELinux源码分析_1.31》由会员分享,可在线阅读,更多相关《SELinux源码分析_1.31(96页珍藏版)》请在金锄头文库上搜索。

1、SELinux源码分析(Federa Core 8)第一章 SELinux(Security Enhance Linux,简称SELinux)简介1.1 SELinux的起源SELinux是一个面向政府和行业的产品,由NSA、Network Associates、Tresys以及其他组织设计和开发。尽管NSA将其作为一个补丁集引入,但从2.6版开始,它就被加入到Linux内核中。GUN/Linux非常安全,但它也非常动态:所做的更改会为操作系统带来新的漏洞,这些漏洞可能被攻击者利用,尽管人们都非常关心阻止授权访问,但是发生入侵后会发生什么呢?1.2访问控制方法大多数操作系统使用访问控制来判断一

2、个实体(用户或程序)是否能够访问给定资源。基于 UNIX的系统使用一种自主访问控制(Discretionary Access Control,简称DAC)的形式。此方法通常根据对象所属的分组来限制对对象的访问。例如,GNU/Linux 中的文件有一个所有者、一个分组和一个权限集。权限定义谁可以访问给定文件、谁可以读取它、谁可以向其写入,以及谁可以执行它。这些权限被划分到三个用户集中,分别表示用户(文件所有者)、分组(一个用户组的所有成员)和其他(既不是文件所有者,又不是该分组的成员的所有用户)。很多这样的访问控制都会带来一个问题,因为所利用的程序能够继承用户的访问控制。这样,该程序就可以在用户

3、的访问层进行操作。与通过这种方式定义约束相比,使用最小特权原则更安全,程序只能执行完成任务所需的操作。例如,如果一个程序用于响应 socket 请求,但不需要访问文件系统,那么该程序应该能够监听给定的socket,但是不能访问文件系统。通过这种方式,如果该程序被攻击者利用,其访问权限显然是最小的。这种控制类型称为强制访问控制(MAC)。另一种控制访问的方法是基于角色的访问控制(RBAC)。在 RBAC 中,权限是根据安全系统所授予的角色来提供的。角色的概念与传统的分组概念不同,因为一个分组代表一个或多个用户。一个角色可以代表多个用户,但它也代表一个用户集可以执行的权限。SELinux 将 MA

4、C 和 RBAC 都添加到了 GNU/Linux 操作系统中。下一节将探讨 SELinux 实现,以及如何将安全增强透明地添加到 Linux 内核中。1.3 Linux安全模块(Linux Security Module,简称LSM)Linux安全模块(LSM)提供了两类对安全钩子函数的调用:一类管理内核对象的安全域,另一类仲裁对这些内核对象的访问。对安全钩子函数的调用通过钩子来实现,钩子是全局表security_ops中的函数指针,这个全局表的类型是security_operations结构,这个结构定义在include/linux/security.h这个头文件中,这个结构中包含了按照内核

5、对象或内核子系统分组的钩子组成的子结构,以及一些用于系统操作的顶层钩子。在内核源代码中很容易找到对钩子函数的调用:其前缀是security_ops-。对钩子函数(Hooks)的详细说明留到后面。在内核引导的过程中,Linux安全模块(LSM)框架被初始化为一系列的虚拟钩子函数,以实现传统的UNIX超级用户机制。当加载一个安全模块时,必须使用register_security()(在linux/security.h中声明,security.c中定义)函数向Linux安全模块(LSM)框架注册这个安全模块:这个函数将设置全局表security_ops,使其指向这个安全模块的钩子函数指针,从而使内核

6、向这个安全模块询问访问控制决策。一旦一个安全模块被加载,就成为系统的安全策略决策中心,而不会被后面的register_security()函数覆盖,直到这个安全模块被使用unregister_security()函数向框架注销:这简单的将钩子函数替换为缺省值,即Dummy.c中的Dummy函数,系统回到UNIX超级用户机制。另外,Linux安全模块(LSM)框架还提供了函数mod_reg_security()和函数mod_unreg_security(),使其后的安全模块可以向已经第一个注册的主模块注册和注销,但其策略实现由主模块决定:是提供某种策略来实现模块堆栈从而支持模块功能合成,还是简单

7、的返回错误值以忽略其后的安全模块。(需要主模块进行调用)这些函数都提供在内核源代码文件security/security.c中。这种方式的设计主要为了实现模块的叠加,实现多种模块对系统的安全进行检查。目前该功能主要是实现,capability和SELinux的叠加。 Linux内核现在对POSIX.1e capabilities的一个子集(提供一部分钩子函数)提供支持。Linux安全模块(LSM)设计的一个需求就是把这个功能移植为一个可选的安全模块。POSIX.1e capabilities提供了划分传统超级用户特权并赋给特定的进程的功能,即传统超级用户不允许的权限,可以通过POSIX.1e

8、capabilities授予,大大提高了系统安全的灵活性。Linux安全模块(LSM)保留了用来在内核中执行capability检查的现存的capable()接口,但把capable()函数简化为一个Linux安全模块(LSM)钩子函数的包装(secondary_ops),从而允许在安全模块中实现任何需要的逻辑。Linux安全模块(LSM)还保留了task_struck结构中的进程capability集(一个简单的位向量),而并没有把它移到安全域中去。Linux内核对capabilities的支持还包括两个系统调用:capset()和capget()。Linux安全模块(LSM)同样保留了这些

9、系统调用但将其替换为对钩子函数的调用,使其基本上可以通过security()系统调用来重新实现。Linux安全模块(LSM)已经开发并且移植了相当部分的capabilities逻辑到一个capabilities安全模块中,但内核中仍然保留了很多原有capabilities的残余。这些实现方法都最大程度的减少了对Linux内核的修改影响,并且最大程度保留了对原有使用capabilities的应用程序的支持,同时满足了设计的功能需求。以后要使capabilities模块完全独立,剩下要做的主要步骤是:把位向量移到task_struct结构中合适的安全域中,以及重新定位系统调用接口。目前的操作系统中

10、还没有在这方面做改进,为了减少LSM架构对原内核的影响,这部分暂且不懂。1.4接口说明:给内核开发人员和安全研究人员使用的钩子Linux安全模块(LSM)对于内核开发人员和安全研究人员的价值就在于:可以使用其提供的接口将现存的安全增强系统移植到这一框架上,从而能够以可加载内核模块的形式提供给用户使用;或者甚至可以直接编写适合自己需要的安全模块。Linux安全模块(LSM)提供的接口就是钩子,其初始化时所指向的虚拟函数实现了缺省的传统UNIX超级用户机制,模块编写者必须重新实现这些钩子函数来满足自己的安全策略。下面简要介绍Linux安全模块(LSM)提供的钩子,详细情况请参考源代码,特别是inc

11、lude/linux/security.h头文件中security_operations结构的定义。至于具体如何根据自己需要的安全策略编写安全模块,可以参考SELinux,DTE,LIDS等系统的安全模块实现。 首先是任务钩子,Linux安全模块(LSM)提供了一系列的任务钩子使得安全模块可以管理进程的安全信息并且控制进程的操作。模块可以使用task_struct结构中的安全域来维护进程安全信息;任务钩子提供了控制进程间通信的钩子,例如kill();还提供了控制对当前进程进行特权操作的钩子,例如setuid();还提供了对资源管理操作进行细粒度控制的钩子,例如setrlimit()和nice(

12、)。 int (*task_create) (unsigned long clone_flags);int (*task_alloc_security) (struct task_struct * p);void (*task_free_security) (struct task_struct * p);int (*task_setuid) (uid_t id0, uid_t id1, uid_t id2, int flags);/特权操作的Hookint (*task_post_setuid) (uid_t old_ruid /* or fsuid */ , uid_t old_euid,

13、 uid_t old_suid, int flags);int (*task_setgid) (gid_t id0, gid_t id1, gid_t id2, int flags);int (*task_setpgid) (struct task_struct * p, pid_t pgid);int (*task_getpgid) (struct task_struct * p);int (*task_getsid) (struct task_struct * p);void (*task_getsecid) (struct task_struct * p, u32 * secid);in

14、t (*task_setgroups) (struct group_info *group_info);int (*task_setnice) (struct task_struct * p, int nice);/资源管理的Hookint (*task_setioprio) (struct task_struct * p, int ioprio);int (*task_getioprio) (struct task_struct * p);int (*task_setrlimit) (unsigned int resource, struct rlimit * new_rlim);/资源管理

15、的Hookint (*task_setscheduler) (struct task_struct * p, int policy, struct sched_param * lp);int (*task_getscheduler) (struct task_struct * p);int (*task_movememory) (struct task_struct * p);int (*task_kill) (struct task_struct * p, struct siginfo * info, int sig, u32 secid);/控制进程间通信的Hookint (*task_w

16、ait) (struct task_struct * p);int (*task_prctl) (int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);void (*task_reparent_to_init) (struct task_struct * p);void (*task_to_inode)(struct task_struct *p, struct inode *inode);图1.1 任务钩子其次是程序装载钩子。很多安全模块,包括Linux capabilities,SELinux,DTE都需要有在一个新程序执行时改变特权的能力。因此Lin

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号