标签:
1.强制类型的安全上下文# ls -Z /etc/shadow-r---- root root system_u:object_r:shadow_t shadow
# ps -aZjoe:user_r:passwd_t 16532 pts/0 00:00:00 passwd
①setuid传统Linux中,我们可以通过给passwd赋一个setuid的值,使其具有root权限。在传统Linux系统中,使用下面命令来查看passwd文件信息:
# ls -l /usr/bin/passwd-r-sxx 1 root root 19336 Sep 7 04:11 /usr/bin/passwd
从上面的信息中我们可以看到,第一个在所有者权限的x位置变成了s,这里的s指的就i时setuid位了,意思是任何执行这个文件的进程,它的uid都将编程文件的所有者。当前我们看到文件的所有者为root用户,那么当Joe用户登陆运行该文件时,实际上此时shell进程的uid就编程了root用户的uid了。如下图:
图4从上图我们可以看到setuid在传统Linux中是一个非常强大的特性,但也同时暴漏出传统Linux的主要弱点,即passwd需要以root身份运行访问shadow文件,然而当以root身份运行时,passwd可以访问所有的系统资源,而我们最初的目的仅仅是需要passwd操作shadow文件而已,这不仅违背了我们的初衷,也违背了最小权限原则。②te从图2中我们知道allow规则可确保passwd_t域的passwd进程可以访问shadow密码文件,那么是如何实现user_t到passwd_t的域转变呢,看下图:
图5从上图中我们可以看到有四个类型分别为:user_t(shell)、shadow_t(shadow)、passwd_t(passwd),passwd_exec_t(passwd)。passwd的安全上下文如下:
# ls -Z /usr/bin/passwd-r-sxx root root system_u:object_r:passwd_exec_t /usr/bin/passwd
从上面的信息我们可以来创建TE策略规则是passwd_t域运行,首先第一条规则:
allow user_t passwd_exec_t : file {getattr execute};//允许域为usert_(这里指shell进程),在passwd可执行文件(passwd_exec_t)启动execve()系统调用。实际上也就是说允许shell进程调用execve()来执行passwd。
第二条规则:
allow passwd_t passwd_exec_t : file entrypoint;//提供passwd_t域的入口访问权,entrypoint许可在SELinxu中是一个许可权限,它的作用就是定义哪个可执行文件(如passwd)可以以某个特定的域(passwd_t)来运行,这就是所谓的域转变。那么例子中的passwd可执行文件被标识为passwd_exec_t,并且passwd_t类型有entrypoint权限访问passwd_exec_t,那么passwd就具备了在passwd_t域类型中运行的条件。
第三条规则:
allow user_t passwd_t : process transition;//这条规则中没有提供对客体的访问,因为此时客体是process,意味着此时的客体代表进程。如果系统资源都被封装为客体的话,那么进程也可以理解为系统资源,这里进程作为客体并不矛盾。在这个规则中,许可是transition,这个许可的含义就是允许修改进程的安全上下文中的类型。那么这条规则的含义指的就是:允许user_t域转变为passwd_t域。
那么至此我们了解了域转变的流程,也就是说一次成功的域转变,这三条规则必须保证同时存在,且当这三个许可在一个TE策略中同时通过才能完成域的转变。总结如下:
- 进程的新域(passwd_t)对可执行文件(passwd)具有entrypoint许可
- 进程当前域(usr_t)具有对入口文件(passwd_exec_t)具有execute许可
- 进程当前域(usr_t)对新的域(passwd_t)具有transition许可
type_transition user_t passwd_exec_t : process passwd_t;//将主体user_t域转变为主体passwd_t域
role user_r type passwd_t;//role语句声明角色标识符以及声明的角色有关的类型。这里声明角色user_r以及相关联的类型passwd_t,这个关联意味着passwd_t类型在安全上下文中与角色user_r共存,如果没有此role语句,就无法创建新的安全上下文joe:user_r:passwd_t,且execve()函数调用也会失败,及时TE策略允许Joe的类型(user_t)有所有的访问权。
user:role:type:sensitivity[:category,...][-sensitivity[:category,...]]
①.Permissive(许可)模式SELinux可以运行在permissive模式,在这个模式中,只存在访问检查但不会拒绝不允许的访问。检查SELinux当前的工作模式最简单的方法就是运行getenforce命令。设置系统SELinux工作模式,可使用setenforce 0设置为permissive模式,使用setenforce 1修改为强制模式,但是如果从permissive模式修改为强制模式需要以root登录后再操作。②passwd示例为了帮助我们更好的理解域转换,我们来通过下面的流程来验证域转换:
- 启动第一个终端,运行passwd命令:
$ passwdChanging password for user joe.Changing password for joe(current) UNIX password:
- 启动第二个终端,su到root用户,然后使用下面的怕死命令:
$ su
Password:
Your default context is root:sysadm_r:sysadm_t.
Do you want to choose a different one? [n]
# ps axZ|grep passwd
user_u:user_r:passwd_t 4299 pts/1 S+ 0:00 passwd
此时我们看到passwd进程的域为passwd_t。
③策略分析工具apol这是一个检查策略内容非常实用的一个工具,由Tresys科技公司开发,随SELinux工具包一起发布,成为SeTools。SeTools软件包包含在大多数SELinux发行包中,运行apol命令确定这个工具是否已经安装到系统中,若没有安装apol(analyze policy)是一个成熟的SELinux策略分析工具,本系列文章中也会经常使用SELinux策略。如果我们想要使用它来检查策略文件,运行apol然后打开strict策略文件,在Query>Policy Summary下就可以看到策略相关的摘要信息。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/huangyabin001/article/details/47404495