我们知道进程的上下文定义了进程被允许的行为。作为进程域转换的部分,上下文可以被改变。这种访问控制被称为类型强制(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_t或chromium_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 <targetrole>切换角色,一般最普遍的是从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