6.【SELinux学习笔记】角色和用户

一、SELinux中基于角色的访问控制
    SELinux中的访问权不是直接授予用户或角色的,而是通过TE allow规则授权给类型的。而角色是类型强制的中的一个特性。SELinxu中的RBAC(Role-Based Access Control 基于角色的访问控制)在TE的基础上做了更多的限制,但RBAC没有授权的权利,因为在SELinxu中,所有的允许访问权都是有TE提供的。

1.RBAC概述
    首先我们来看前面提到的一个域类型转换的案例,即一个从域类型为 user_t 的 bash shell 进程转换到一个域类型为 passwd_t 运行密码程序的进程,注意,我们在进程的安全上下文中添加了用户和角色部分(joe:user_r 和 joe:user_r:passwd_t),同时,也假设策略已经包括了必要的 TE 规则许可域转换。
6.【SELinux学习笔记】角色和用户_第1张图片
图1

    上图中为我们表述了两种RBAC策略语句:一个用户声明语句(user①)和两个角色声明语句(role②③)。首先user①语句将SELinux用户joe和角色user_r关联起来,也就是说,在一条安全上下文规则中用户和角色是可以共存的。而且如果没有没有user①语句,那么安全上下文④⑤语句是无效的,SELinxu会拒绝创建它们,且最后也会拒绝执行域转换。
    而两个role语句将角色user_r和域类型user_t和passwd_t关联起来,且要使进程安全上下文有效,role语句是必需的。

2.使用角色管理用户权限
    一般来说,我们并不会将域类型和用户关联起来,而是将域类型与角色进行关联,然后再将角色与SELinxu用户关联起来。这种效果可以理解为数据库中的数据冗余,大大简化了管理所有策略的复杂度。想想看,系统可能有三四个角色,却又成千上万个用户和域类型。直接将域类型与用户关联起来是一个非常庞大的关系,管理起来也会很困难。而如果将域类型分配给角色,并使用角色对用户进行分类,管理起来相对容易一些。
    在SELinxu中,对于任何进程同一时间只有一个角色是活动的。而且由于域类型和角色进行关联的,域转换也会受到它关联的角色的限制。
    在SELinxu中允许用户关联多个角色,但不可以同时使用所关联所有角色的访问权。例如我们将一个用户与系统管理角色关联,同时该用户又与普通用户角色进行关联,那么在常规的使用过程中普通用户角色将被激活,只有在必须执行系统管理任务时才会激活管理角色(即域转换),类似于Linxu使用普通账户切换到root账户一样。
    角色可以理解为一套域类型的集合,可以方便地与用户建立联系,但这并不是SELinxu中独立的访问控制机制。

3.客体安全上下文中用户和角色
    客体安全上下文中的用户字段支持审核,而角色并没有什么用。如下客体安全上下文:
# ls --scontext /usr/bin/passwd /etc/shadow
system_u:object_r:shadow_t                  /etc/shadow
system_u:object_r:passwd_exec_t          /usr/bin/passwd
    如上两个客体的角色为object_r,object_r可以理解为保留字,是直接硬编码进SELinux的,不需要进行声明。

二、角色、角色语句
    SELinux中只有object_r为内置的角色,如果需要定义其他角色就需要在策略中进行声明,下面简单介绍下角色相关的策略语句:角色声明语句、角色allow规则、角色转换规则、角色控制语句。

1.角色声明语句
role user_r types user_t;//为user_t类型声明user_r角色
role user_r types passwd_t;//为passwd_t类型声明user_r角色

2.角色allow规则
    成功改变角色需要我们为新的角色进行授权,那么相应的我们使用allow规则来对角色的改变进行授权,如下:
allow staff_r sysadm_r;
3.角色转换规则
    由于在执行过程中,程序角色可能会发生变化,那么我们可以使用角色转换规则role_transition,角色转换规则与类型转换规则比较类似,如下:
role_transition sysadm_r http_exec_t system_r;//角色为sysadm_r的进程执行http_exec_t的文件时,SELinux会尝试转换为角色system_r。
4.角色控制语句
    角色控制语句(dominance)可以帮助我们按照其他角色声明一个角色,我们可以使用控制语句创建一个角色之间的层次关系,如下:
dominance { role super_r {role sysadm_r; role secadm_r;}//声明一个角色super_r,sysadm_r,secadm_r,并使其同时具有sysadm_r和secadm_r角色的内容。


三、用户和用户语句
    Linxu与SELinux用户表示符不相同,也没有什么关联。

1.声明用户及其关联的角色
    使用用户声明语句(user)声明用户以及与之关联的角色。
user joe roles {user_r};//声明用户joe并与角色user_r进行关联。

2.将Linux用户映射到SELinux用户
    登录程序(如login、sshd等)负责映射Linux用户到SELinux用户,在登录时如果SELinux中用户恰好与Linux用户完全相同,则对应的SELinxu用户就成为初始shell进程安全上下文的用户。策略中有一个特殊的用户标识符user_u,即普通用户,所有Linux用户在策略中如果没有匹配想就会被映射到suer_u上。
    如下,假设策略中有下面user语句:
user user_u roles {user_r};//定义普通用户user_u并授予角色user_r。如果SELinux策略中没有定义用户joe,那么当Linux用户joe登录时,在初始shell进程安全上下文的用户表示符将是user_u。
    如果普通用户user_u没有定义在策略中,任何没有明确在SELinux策略中的Linux将无法正常登录。因为在登录过程中,初始
shell 进程必须要有一个有效的安全上下文,包括用户标识符,如果策略中既没有定义user_u,也没有定义 Linux 用户标识符,登陆进程就不能创建有效的安全上下文(因为没有用户标识符可用)。

你可能感兴趣的:(6.【SELinux学习笔记】角色和用户)