SELinux角色的用途

我们知道进程的上下文定义了进程被允许的行为。作为进程域转换的部分,上下文可以被改变。这种访问控制被称为类型强制(type enforcement),但是SELinux不仅仅是这些,包含SELinux角色…

SELinux用户域

来查看下普通linux用户的上下文:

user $id
uid=1000(swift)gid=100(users) groups=100(users),16(cron),...,995(gorg)context=user_u:user_r:user_t

上下文显示用户在user_t域,再看下root用户的上下文:

root #id -Z
root:sysadm_r:sysadm_t

可以看到,显示root用户在sysadm_t域。

SELinux策略规定普通用户域(user_t)是无特权区:不允许执行任何管理任务。即使你给它授权为root的访问权限(sudo或者su),用户也不能危害到系统。它不仅仅因为user_t域,也因为那个用户所在的SELinux角色。

上下文中的角色

我们所见的上下文,角色在第二个字段:

user_u:user_r:user_t

正如你所见的,命名约定_r结尾。然而这只是约定,不是SELinux本身要求的。

SELinux角色规定什么域(进程)可以进去,这不是说用户可以自由选择下次可以启动的域(依然存在域转换来管理这个)。这样以来,即使允许被转换,如果域和他的用户角色没有关联,转换也会失败。

转换失败后的结果将会被作为SELinux错误而记录,比如:

invalid context: user_u:user_r:portage_t

明白这点十分重要,比如一个开发者从命令行试图启动mysql守护进程(不是以守护进程模式)。即使他被允许执行mysqld_exec_t标示的文件,转换后面也将不会被运行,因为mysqld_t不是被用户角色(user_r,staff_r,sysadm_r)所运行的域。

 

显示被允许的域

使用seinfo工具,可以罗列出一个特定角色被允许的域

user $seinfo-ruser_r -x
   user_r
      Dominated Roles:
         user_r
      Types:
         chromium_renderer_t
         user_gkeyringd_t
         ...

如果你试着启动一个程序(先不考虑服务),并且启动失败。接着确定是否是应用程序(比如mozilla_tchromium_t)的域不在当前所在角色支持的域中。

 

切换角色

用户如果愿意可以切换角色。然而,当SELinux用户被允许“成为”其他角色的前提下,我们才可以角色切换。使用semanage user –l 可以查看下是否是这样情形。

root #semanage user -l
SELinuxUser    SELinux Roles
 
root            staff_r sysadm_r
staff_u         staff_r sysadm_r
sysadm_u        sysadm_r
system_u        system_r
unconfined_u    unconfined_r
user_u          user_r
 

我们后面讨论SELinux用户,目前为止,可以说SELinux用户(上面例子第一列)必须匹配用户上下文的首个进入点(使用id -Z)。

 
   
user_u:user_r:user_t

所以上面上下文的例子,我们可以看到用户只能被允许在user_r角色。换句话说,这用户无法切换角色。

 
   
root:sysadm_r:sysadm_t

这个例子,用户可以从sysadm_r角色切换到staff_r角色(反之亦然)。

使用newrole –r 切换角色,一般最普遍的是从staff_r角色切换到sysadm_r角色。

user $newrole -r sysadm_r
Password:

 

标准角色集合

以下表格给出了SELinux系统上可用的标准角色,可能在其他的系统存在更多的角色。

 

角色

描述

user_r

普通用户角色,只允许用户程序和其他非特权域

staff_r

类似于user_r角色,但是比起普通用户被允许获取更多的系统信息。这个角色用于允许用户切换到其他角色

sysadm_r

系统管理员角色,具有很高权限的角色,被允许最多的目标域,包括特权域。使用的时候需留意

system_r

系统角色,不要直接切换到它(因为它没有默认相关联的用户域-后面再讨论)

 

我们需要记住

1.        角色决定用户(或会话)被允许进入的域

2.        使用newrole来修改角色

3.        SELinux用户定义申明了用户可以进入的角色


链接  https://wiki.gentoo.org/wiki/SELinux/Tutorials/The_purpose_of_SELinux_roles

你可能感兴趣的:(SELinux,安全)