selinuxhttp ://www.cnblogs.com/twoboy/archive/2011/08/05/2128784.html

来源:互联网 发布:中国最大数据公司 编辑:程序博客网 时间:2024/06/06 20:36
SELinux中的RBAC特性依赖并支持TE特性,我们通过将域类型和一个或多个角色进行关联,而不是直接将权限授给用户,RBAC通过在安全上下文中控制域类型、角色和用户的关联实现对TE策略更多的约束,也就是说,域转换是受用户的角色约束的,最终约束了用户的总体权限。
为了增强理解,我们还是以第2章'概念'中的例子进行说明,在图1中,我们进行了更详细的表达。这个例子描述了一个从域类型为user_t的bash shell进程转换到一个域类型为passwd_t运行密码程序的进程,注意,我们在进程的安全上下文中添加了用户和角色部分(joe:user_r和joe:user_r:passwd_t),同时,也假设策略已经包括了必要的TE规则许可域转换(这个没有在图中进行标识)。


这个例子显示了两类RBAC策略语句:一个用户声明语句(user)和两个角色声明语句(role)。这些语句在策略中创建了用户、角色和类型标识符之间的关系。在本章后面,我们将列出这些声明语句完整的语法,现在,先理解它们在域转换上所起的作用。
上图中的user语句将SELinux用户joe和角色user_r关联起来,这条语句告诉SELinux用户joe和角色user_r在安全上下文中是可以共存的,如果没有这条语句,图6-1中的用户joe和角色user_r进程安全上下文将是无效的,SELinux将会拒绝创建它们,最后拒绝进行域转换。
那两个role语句将角色user_r和域类型user_t和passwd_t关联起来,与user语句类似,要使进程安全上下文有效,role语句也是必需要有的,如果没有role语句关联类型passwd_t,即使TE策略允许,域转换也会失败。如果我们不想user_r角色运行密码程序,我们只需要将role语句移除,内核也就不会创建对应的安全上下文了,即使TE规则允许进行访问。

基本概念--主体 客体 属性 类别

主体(subject)和客体(object)是指系统中的元素,主体是访问客体的进程,客体是系统中的一类实体,在系统中定义好了30种不同的客体类别(class),每个class有定义好的许可。

在/etc/security/selinux/src/policy/flask/security_classes中有class的定义,SELinux定义了30个class,列出如下:

security process system capability filesystem file dir fd lnk_file chr_file blk_file sock_file fifo_file socket tcp_socke tudp_socket msgq semmsg shm ipcnode netif netlink_socket packet_socket
key_socket rawip_socket unix_stream_socket unix_dgram_socket passwd

每个class都定义了操作许可,如:客体file有19个操作许可,列出如下: 

ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton execute_no_trans entrypoint

安全上下文

SELinux给每个主体和客体定义了一个安全上下文(security context)。安全上下文是对主体或客体安全的描述,其格式为:user:role:type,如:root:sysadm_r:sysadm_t,其中root为用户ID(user),sysadm_r为角色ID(role),sysadm_t为类型(type)ID。安全上下文代表了SELinux的访问控制属性。安全标识符(security identifier,简称SID)是内核中激活的安全上下文的序号。

一般情况下,多个属性的组合形成类型,多个类型的组合形成角色,多个角色的组合形成用户。有的属性也可能覆盖多个类型的范围,在安全上下文中最重要的是类型。

在文件系统中的每个文件或目录、网络的端口等都指定了一个安全上下文,安全策略则给出了各个安全上下文之间作用的规则。

属性的定义

属性(Attribute)是具有相似特征的安全类型的组,它是一项工作(如:privmodule)的域类型或者系统中一类客体的所有类型(如:proc_fs),属性是从使用者角度考虑的一项特性。

属性名可在策略配置中一直使用,属性名与类型在同一个名字空间中存在。但一个属性名不能放在安全上下文的类型的位置上。属性对可选的MLS策略来说很重要,它的定义样例如下:

attribute domain;  #这个属性代表了能指定给进程的每种类型

attribute privuser; #代表能改变它的selinux用户ID

attribute privrole;  #代表能改变它的selinux角色ID

attribute privmodule;  #代表能运行modprobe

attribute privmem; #代表能访问内核内存设备

attribute proc_fs;   #能指定给/proc下文件的所有类型

下面说明一些非常有用的属性:
httpdcontent 属性httpdcontent将与Apache HTTP的策略相关的各种类型组合在一起。它帮助Apache HTTP的PHP脚本等使用httpd的带有content字符的类型。
file_type 属性file_type用于指定给文件的所有类型,当域访问所有的文件类型时,使用它是方便的。属性file_type包括超过170种类型
属性netif_type, port_type和node_type 这些属性与域的网络活动有关。netif_type表示与网络接口相关的类型,允许策略控制在一个接口的发送、接收和其他操作。
fs_type 属性fs_type标识指定给文件系统的所有类型,它允许大多数域获得全部文件系统的统计信息,一些特殊的域可以挂接任何文件系统。
exec_type 属性exec_type是指定给可执行条目的所有类型的集合。
属性domain用于进程的所有类型,用来识别SELinux的域,在其他类型的强制系统中,域可能与类型分开使用,在SELinux中,域是具有domain属性的基本类型。这个属性允许规则应用到所有的域。如:init发送信号到所有的进程。
属性reserved_port_type 标识任何一个保留网络商品的所有类型。保留端口的编号小于1024

类型的定义

类型在它使用之前必须定义,定义的语法如下:

type <typename> [aliases] [attributes];

类型定义的样例如下:

# httpd_config_t 是一个系统管理文件的类型

type httpd_config_t, file_type, sysadmfile;

# httpd_port_t是保留的端口,端口号小于1024

type http_port_t, port_type, reserved_port_type;

域是用于进程的类型,由它的domain属性决定类型。同一类型可以用于进程本身和与之相关的/proc文件系统中文件。通常,域用作操作的源上下文,域是操作者。域还可用作客体上下文,如:当init给一个域发送信号时,域作为客体。

域的数量和种类决定了安全策略的复杂性。更多的域意味着更好的安全控制,也意味着配置和维护的困难。

TE访问向量规则(TE Access Vector Rules)


访问向量(Access vectors,AVs)规则允许域访问各种系统客体,一个AV是一套许可。一个基本的AV规则是主体和客体的类型对,AV规则的语法如下:

<av_kind> <source_type(s)> <target_type(s)>:<class(es)> <permission(s)>

策略强制引擎认为所有的AV规则由两个类型、一个类别(class)和一个访问许可集组成。AV有以下四种规则类型,即<av_kind>在以下四种设置:

allow 表示允许主体对客体执行允许的操作。

neverallow 表示不允许主体对客体执行指定的操作。

auditallow 表示允许操作并记录访问决策信息。

dontaudit 表示不记录违反规则的决策信息,且违反规则不影响运行。

一些AV规则样例及说明列出如下:

#允许域user_t对bin_t类型客体进行类别为file的read等操作

allow user_t bin_t:file{read getattr lock execute ioctl execute_no_trans};

#允许域user_t对它自己类型的客体进行process类别的所有操作

allow user_t self: process*;

#允许域userdomain对shell_exec_t类型客体进行file类别的read等操作

allow userdomain shell_exec_t: file{ read getattr lock execute ioctl};

# 不允许域passwd_t对非bin_t等类型的客体进行file类别的execute_no_trans操作

neverallow passwd_t ~{ bin_t sbin_t ld_so_t} : file execute_no_trans;

#不允许域domain对非domain类型的客体进行process类别的类型转移操作

neverallow domain ~domain: process transition;
log消息格式

当SELinux不允许一个操作时,将产生一个给审核log的否决消息,log消息一般记录在文件/var/log/messages中。

示例:一条规则的否决消息格式

下面是一条规则的否决消息格式,显示了当用户在home目录~/public_html的网页内容没有得到访问许可时生成的AVC否决消息:

Jan 14 19:10:04 hostname kernel: audit(1105758604.519:420): /

avc: denied { getattr } for pid=5962 exe=/usr/sbin/httpd /

path=/home/auser/public_html dev=hdb2 ino=921135 /

scontext=root:system_r:httpd_t /

tcontext=user_u:object_r:user_home_t tclass=dir

这个AVC否决消息说明如下:

时间戳为Jan 14 19:10:04,主机名为hostname,

kernel: audit(1105758604.519:420):它是内核审计log消息的指针,()中第一个数字1105758604是时间戳组成的当前时间的未格式化长整数,第二个数字519是毫秒的短整数,第三个数字420是序列数,帮助从多个消息进行审核跟踪。

avc: denied 表示操作被否决,如果一些操作用规则auditallow设置,则它们产生授权的消息。

{ getattr } 表示否决或授权的操作,{}中含有实际尝试的操作。

for pid=5962 操作的源应用程序的进程ID。

exe=/usr/sbin/httpd 表示被否决的应用程序。

path=/home/auser/public_html 操作尝试的目标文件或目录的路径。

dev=hdb2 含有这个文件系统的设备切点。否决操作的客体在这个文件系统中。

ino=921135 目标文件或目录的节点号。

scontext=root:system_r:httpd_t 源的安全上下文,即被否决访问的进程。

tcontext=user_u:object_r:user_home_t 目标上下文,即被否决的文件或目录。

tclass=dir 目标的类别,指示被阻塞的目录是/home/auser/public_html/。

TE转移规则(TE Transition Rules)

域转移运行一个文件,产生一个运行在新域的新进程,类型转移将一个新客体标识为不同于源类型的类型。

类型转移的语法如下:

type_transition <source_type(s)> <target_type(s)> :<class(es)> <new_type>

域转移语法如下:

type_transition <current_domain> <type_of_program> : process <new_domain>

类型转移规则定义了不同域文件的类型转移。如果进程显式请求一个特殊上下文,域转移默认时能被覆盖。

文件的类型转移默认时实际上从父亲继承,即新的文件从它的父目录继承上下文,除非有一个明确的规则指明它从创建者继承。例如:目录~/类型为user_home_dir_t,策略定义了在带有这个类型的目录中创建的文件用user_home_t标识。

两个域转移的规则样例列出如下:

type_transition httpd_t httpd_sys_script_exec_t:process httpd_sys_script_t;

上面的规则表示:当后台进程httpd以域httpd_t运行类型为httpd_sys_script_exec_t的文件,如:CGI脚本文件,新的进程(如:CGI脚本进程)将赋为httpd_sys_script_t域。

type_transition initrc_t squid_exec_t:process squid_t;

上面的规则表示:当域为initrc_t的init进程执行squid_exec_t类型的文件时,新进程将赋为squid_t域。

type_transition <creating_domain> <parent_object_type> : <class(es)> <new_type>

一个新客体标识样例规则列出如下:

type_transition named_t var_run_t:sock_file named_var_run_t;

上面的规则表示:当在域named_t的一个进程在类型为var_run_t的目录创建一个socket文件时,该socket文件被赋予named_var_run_t类型。

RBAC规则的描述

在target策略中,每个域运行在单个角色,target策略没有使用用户和角色,但strict策略中使用了用户和角色。
1.角色的定义

角色的定义语法如下:

role <rolename> types <domain(s)>;

角色定义样例如下:

#允许管理者角色访问域ldconfig_t

role sysadm_r types ldconfig_t;

角色能包含其他角色,继承包含的角色的权限,这种继承称为角色域化。角色域化没有用在targted策略中。角色域化的样例如下:

# master_r继承sysadm_r和user_r角色的权限

dominance {role master_r {role sysadm_r; role user_r;} }
2.角色转移

多个域组成一个角色,每个进程有一个角色,它用系统角色system_r启动。用户在注册时获得一个角色,使用su时用户在获得新的UID同时,还获得新的角色。当然,还可以保持UID不变而改变角色,这种做法较少见。一般域经常变化但角色很少变化,特别是在targeted策略中。改变角色的另一个方法是角色转移(role_transition),角色转移用得较少,当前仅用在stricter策略中管理者角色以不同的角色启动后台,角色转移样例如下:

#当一个管理者执行一个$1_exec_t类型的进程时,进程从sysadm_r转移到system_r

role_transition sysadm_r $1_exec_t system_r;

角色允许的语法如下:

allow <current_role(s)> <new_role(s)>;

角色允许的样例列出如下:

#允许角色user_r转移到新角色

allow user_r sysadm_r;
3.用户定义

SELinux用户身份不同于UNIX身份,它用于安全标签的一部分,在限定条件下可实时切换。SELinux用户身份主要不用在targeted策略中。在targeted策略中,进程与客体的身份都是system_u,Linux默认用户是user_u。当用户身份是策略的一部分时,它们通常与Linux账户名(UID)是一致的。在strict策略中,一些系统账户能运行在通用的非特权的user_u身份,其他账户在策略库中有直接的用户身份。

Linux的UID和SELinux用户身份应该匹配,因为注册或类似的应用程序将查找这种匹配,如果无法匹配将使用user_u身份。

用户定义的语法如下:

user <user_identifier> <roles>{role_list};

一个用户定义的样例如下:

user root { user_r sysadm_r } ;

一些特殊的用户说明如下:

system_u 系统进程和资源的用户,linux用户不能创建它,也不能删除它。

user_u linux普通用户,在策略中没定义,没定义的普通用户是不能登录机器的。

login, sshd, 和 crond命令运行登录时设置安全上下文,默认的安全上下文由下面文件决定:

policy/contexts/users/username (per-user defaults)

policy/contexts/default_contexts (system defaults)
3.2.4 限制规则

限制规则给操作许可提供了最终的跨层次的限制。限制规则用Boolean表达式表示。限制的定义语法为:

constrain <class_set> <perm_set> <expression>;

其中表达式<expression>列出如下:

u1 op u2 #u1和u2分别表示操作前后的用户身份

r1 role_op r2 #r1和r2分别表示操作前后的角色

t1 op t2 #t1和t2分别表示操作前后的类型

u1 op user_set # user_set表示用户身份集

u2 op user_set

r1 op role_set

r2 op role_set

t1 op type_set

t2 op type_set

表示式中的操作符有not、and、or、=、!=等,role_op还包括dominance(域化)操作符。

下面是限制的样例:

例1:限制进程域转移

下面语句限制进程域转移的能力,类型转移前后进程的角色一致,或者,进程有类型为privrole。

constrain process transition( r1 == r2 or t1 == privrole);

例2:限制标识客体

下面的语句限制标识客体的能力,即标识客体时,标识前后客体的用户身份一致或者标识前进程的域为privowner。

constrain dir_file_class_set { create relabelto relabelfrom }

( u1 == u2 or t1 == privowner );

constrain socket_class_set { create relabelto relabelfrom }

( u1 == u2 or t1 == privowner );
3.2.5 标识安全上下文
1.给SID定义上下文

语法:sid sid_identifiers ecurity_context

sid_identifier是以前申明的 SID名,security_context为 user:role:type。

一些策略库预定义的SID在policy/initial_sid_contexts中,下面列出几个例子:

sid kernel system_u: system_r: kernel_t

sid security system_u: object_r: security_t

sid unlabeled system_u: object_r: unlabeled_t
2.文件系统的标识行为

当文件系统被SELinux内核挂接(mount)上时,安全服务器决定给基于filesystem类型的文件系统里的节点合适的标识行为。一个filesystem类型的标识行为可以用fs_use配置或用genfs_contexts进行配置。如果在策略里没有给filesystem类型指定标识行为,文件系统的所有节点将用unlabeled初始化的SID的安全上下文标识。

对于有唯一且永久的节点号的传统文件系统来说,SELinux用一个永久的标识映射来决定文件系统内的节点的安全上下文和文件系统本身的安全上下文。这个行为用fs_use_psid来标明,如下面几个例子:

fs_use_psid ext2;

fs_use_psid ext3;

fs_use_psid reiserfs;

对于代表管道和socket对象的伪文件系统,SE Linux常指定创建进程的上下文给代表对象的节点。这个行为用fs_use_task来声明。如下面几个例子:

fs_use_task pipefs system_u:object_r:fs_t;

fs_use_task sockfs system:object_r:fs_t;

其中安全上下文是文件系统本身用到的。pipefs和sockfs是指哪一种文件系统。

对于代表伪终端和共享内存对象的伪文件系统,SE Linux常指定从创建进程的上下文和与文件系统类型相关的上下文中派生出上下文。派生出的上下文由配置中的类型转移来决定。行为由fs_use_trans来声明。如下面几个例子:

fs_use_trans devpts system_u:object_r;devpts_t;

fs_use_trans tmpfs system_u:object_r:temfs_t;
3.指定文件系统上下文

对于不支持永久标识映射的文件系统,或不能用一个固定的由fs_use定义的标识的文件系统,genfscon配置可用来指定文件系统或文件路径或文件的安全上下文。文件系统对象上下文与文件系统的根目录一致。在policy/genfs_contexts中有使用genfscon的例子。

genfscon的语法是:

genfscon fs_type pathprefix [-file_type] context

其中,pathprefix是对象名字的部分路径名,file_type是可选的文件类型定义b, c, d, p, l, s, 或 –(看shell命令“ls”的选项)。

下面列出几个例子:

genfscon proc / system_u:object_r:proc_t

genfscon proc /kmsg system_u:object_r;proc_kmsg-t;

genfscon /kcore system_u:object-r:proc_kcore_t;

这几个例子给proc文件系统中几个目录中的文件指定不同的上下文。但/proc/PID目录和/proc/sys树不用这个配置。

例:

genfscon devfs / system_u:object_r;devfs_t;

genfscon devfs /null system_u:object_r:null_device_t

genfscon devfs /scsi –c system_u:object_r:fixed_disk_device_t

genfscon devfs /scsi –b system_u:object_r:fixed_disk_device_t
4.网络对象上下文

网络对象上下文配置允许为端口、接口和节点定义安全上下文。其中网络接口有两个相关的安全上下文:接口的上下文和接口上接收到的没标识包的默认上下文。下面是几个例子。

例1:定义端口的上下文

portcon tcp 80 system_u:object_r:http_port_t

portcon tcp 8080 system_u:object_r:http_port_t

例2:定义网络接口的上下文:

netifcon eth0 system_u:object_r:netif_eth0_t system_u:object_r:netmsg_eth0_t

例3:定义节点的上下文

nodecon 10.33.10.66 255.255.255.255 system_u:object_r:node_zeus_t;

nodecon 10.33.10.0 255.255.255.0 system_u:object_r:node_any_t
5.文件上下文配置

文件上下文配置位于policy/file_contexts目录下,用来做永久的标识映射,可以在policy目录运行make relabel可更新或创建标识映射。下面是几个文件上下文定义的例子,定义中用到了正则表达式。

/bin(|/.*) system_u:object_r:bin_t

/bin/login system_u:object_r:login_exec_t

/bin/bash system_u:object_r:shell_exec_t

/dev/[^/]*tty[^/]* system_u:object_r:tty_device_t

.*/lost/+found(|/.*) system_u:object_r:lost_found_t
3.2.6 boolean及条件描述语句

1.booleans是策略中声明的参数,值是true或false,在运行时可以改变的。

语法:bool name default_value;

例:bool user_ping false;

2.条件描述语句:

if (conditional expression) {

#有效的策略描述

} else {

#有效的策略描述

}

例:允许用户使用ping

bool user_ping false;

if (user_ping) {

domain_auto_trans(unpriv_userdomain, ping_exec_t, ping_t)

# allow access to the terminal

allow ping_t { ttyfileptyfile} : chr_file rw_file_perms;

}

3.查看和设置boolean

通过selinuxfs文件系统在/selinux/booleans和 /selinux/commit_pending_bools中人工设置。

用show_bools命令显示策略boolean的当前值。

用set_bools命令设置boolean的值。
原创粉丝点击