Selinux -篇1 selinux简述

1、简述

相较于传统的自主访问控制策略,基于用户组管理实现。文件和进程基于用户组管理。

selinux为强制访问控制策略。基于对进程(app、bin)和其访问的文件(文件、服务、网络等)做的精准匹配。

抽象为进程域和对应的资源文件的访问策略。

以下文章重点讲述,android下的selinux实现策略。

      1. 一般性错误检查,例如访问的对象是否存在、访问参数是否正确等。

      2. DAC检查,即基于Linux UID/GID的安全检查。

      3. SELinux检查,即基于安全上下文和安全策略的安全检查。MAC 强制访问策略。

2 两个概念 安全上下文和安全策略。

安全策略是建立在对象的安全上下文的基础上的。

安全上下文实际上就是一个附加在对象上的标签(Tag)。这个标签由四部分内容组成,分别是SELinux用户、SELinux角色、类型、安全级别。

每一个部分都通过一个冒号来分隔,格式为“user:role:type:sensitivity”。

这里所说的对象分为两种类型,

一种称主体(Subject)         行为主体

一种称为客体(Object)       资源客体

主体通常就是指进程,而客体就是指进程所要访问的资源,例如文件、系统属性等。

以下两个实例:一个对进程操作ps -Z

 安全上下文:包含用户、 角色、级别、类型

对文件执行ls -Z 

图1中最左边的那一列是进程的SContext,以第一个进程/system/bin/logwrapper的SContext为例,其值为u:r:init:s0,其中:

  • u为user的意思。SEAndroid中定义了一个SELinux用户,值为u。
  • r为role的意思。role是角色之意,它是SELinux中一种比较高层次,更方便的权限管理思路,即Role Based Access Control(基于角色的访问控制,简称为RBAC)。简单点说,一个u可以属于多个role,不同的role具有不同的权限。RBAC我们到最后再讨论。
  • init,代表该进程所属的Domain为init。MAC的基础管理思路其实不是针对上面的RBAC,而是所谓的Type Enforcement Accesc Control(简称TEAC,一般用TE表示)。对进程来说,Type就是Domain。比如init这个Domain有什么权限,都需要通过[例子1]中allow语句来说明。
  • S0和SELinux为了满足军用和教育行业而设计的Multi-Level Security(MLS)机制有关。简单点说,MLS将系统的进程和文件进行了分级,不同级别的资源需要对应级别的进程才能访问。后文还将详细介绍MLS。

图2  u:object_r:rootfs:s0:

  • u:同样是user之意,它代表创建这个文件的SELinux user。
  • object_r:文件是死的东西,它没法扮演角色,所以在SELinux中,死的东西都用object_r来表示它的role。所有文件都如此,可以不用关注。
  • rootfs:死的东西的Type,和进程的Domain其实是一个意思。它表示root目录对应的Type是rootfs。
  • s0:MLS的级别。可以不用关注。

SELinux中我一般讨论的就是进程和文件的处理。

一般情况只需要关注角色和类型。

对于进程来说,SELinux用户和SELinux角色只是用来限制进程可以标注的类型。

而对于文件来说,SELinux用户和SELinux角色就可以完全忽略不计。

为了完整地描述一个文件的安全上下文,通常将它的SELinux角色固定为object_r,而将它的SELinux用户设置为创建它的进程的SELinux用户。

在SEAndroid中,只定义了一个SELinux用户u。所以以上可以忽略。

user u roles { r } level s0 range s0 - mls_systemhigh;

声明一个用户u 可用角色为r 默认安全级别 0

role r;

role r types domain;

第一个语句声明了一个SELinux角色r;第二个语句允许SELinux角色r与类型domain关联。

对进程来说:

external/sepolicy/users和external/sepolicy/roles文件内容为例,

如果没有出现其它的user或者role声明,

那么就意味着只有u、r和domain可以组合在一起形成一个合法的安全上下文,

而其它形式的安全上下文定义均是非法的。

其他:通过te文件进行控制

external/sepolicy/init.te如下

type init, domain;

由于init具有属性domain,因此它就可以像domain一样,可以和SELinux用户u和SELinux角色组合在一起形成合法的安全上下文。一般情况定义每个进程域都会 进行类似声明。

安全级别:一般场景下不需要关注,个别情况通过日志发现部分进程域级别不一致问题,可以再回看此条目

安全级别是由敏感性(Sensitivity)和类别(Category)两部分内容组成的,格式为“sensitivity[:category_set]”,其中,category_set是可选的。

例如,假设我们定义有s0、s1两个Sensitivity,

以c0、c1、c2三个Category,

那么“s0:c0,c1”表示的就是Sensitivity为s0、Category为c0和c1的一个安全级别。

重点:安全上下文

将用来标注文件的安全上下文中的类型称为file_type

标注进程的安全上下文的类型称为domain

并且每一个用来描述文件安全上下文的类型都将file_type设置为其属性,每一个用来进程安全上下文的类型都将domain设置为其属性。

将一个类型设置为另一个类型的属性可以通过type语句实现,

文件external/sepolicy/file.te,可以看到App数据文件的类型声明:

type app_data_file, file_type, data_file_type;

上述语句表明类型app_data_file具有属性file_type,

即它是用来描述文件的安全上下文的。

举例:一个app的te文件 对角色的声明

type xxxxx_app, domain, coredomain, osplatform_domain; 

标明这是个进程。

一个文件的te文件  对角色的声明

type xxxx_app_data_file_app_data_file, file_type, data_file_type;

这是一个app的创建的资源文件声明。

同时存在中间态:即一个bin文件,本身兼具进程+文件双重属性。

type  xxx, domain, coredomain, osproc_domain, osplatform_domain;
type xxx_exec, exec_type, file_type;

声明这个文件具有进程属性、可执行属性、文件属性。

客体的四个分类:针对Android

  • app进程
  • app数据
  • 系统文件
  • 系统属性 

1、mac_permissions.xml;

2、seapp_contexts

1、2 组成对app进程和数据的安全上下文描述

3、file_contexts 用来描述文件的安全上下文,

###########################################

# Root

/      u:object_r:rootfs:s0

# Data files

/adb_keys    u:object_r:rootfs:s0

/default.prop    u:object_r:rootfs:s0

/fstab\..*   u:object_r:rootfs:s0

/init\..*    u:object_r:rootfs:s0

/res(/.*)?   u:object_r:rootfs:s0

/ueventd\..*    u:object_r:rootfs:s0

# Executables

/charger    u:object_r:rootfs:s0

/init      u:object_r:rootfs:s0

/sbin(/.*)?   u:object_r:rootfs:s0

......

#############################

# System files

#

/system(/.*)?    u:object_r:system_file:s0

/system/bin/ash   u:object_r:shell_exec:s0

/system/bin/mksh  u:object_r:shell_exec:s0

4、property_contexts

##########################

# property service keys

net.rmnet0       u:object_r:radio_prop:s0

net.gprs         u:object_r:radio_prop:s0

net.ppp          u:object_r:radio_prop:s0

net.qmi          u:object_r:radio_prop:s0

net.lte          u:object_r:radio_prop:s0

net.cdma         u:object_r:radio_prop:s0

gsm.           u:object_r:radio_prop:s0

persist.radio     u:object_r:radio_prop:s0

net.dns          u:object_r:radio_prop:s0

sys.usb.config  u:object_r:radio_prop:s0

......

属性的安全上下文与文件的安全上下文是类似的,它们的SELinux用户、SELinux角色和安全级别均定义为u、object_r和s0。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值