本文主要是介绍Selinux机制简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
理解DAC各MAC
SELinux简介
标签、规则各域
标签
规则
SELinux的运行模式
SELinux Policy
TEAC
RULE_VARIANT
SOURCE_TYPES&TARGET_TYPES
Type
Attribute
PERMISSIONS
CLASSES
RBAC
role
user
constrain
MLS
Security level
mlsconstrain
Android SELinux code
目录文件
编译
添加sepolicy
如何确认是否是selinux问题
使用audit2allow
Q&A
理解DAC各MAC
Linux下默认的访问控制是DAC(Discretionary Access Control,自主访问控制),其特点是资源的拥有者可以对他进行任何操作(读、写、执行)。当一个进程准备操作资源时,Linux内核会比较进程和资源的UID和GID,如果权限允许,就可以进行相应的操作。此种方式往往会带来一些问题,如果一个进程是以root的身份运行,也就意味着他能够对系统的任何资源进行操作,而且不被限制。 假如我们的软件存在漏洞呢?这个往往是一个灾难性的问题。因此,就引出了另外的一种安全访问控制机制MAC(Mandatory Access Control,强制访问控制),Linux下的一种实现是SELinux,任何进程想在SELinux系统中干任何事情,都必须先在安全策略配置文件中赋予权限,凡是没有出现在安全策略配置文件中的权限,进程就没有该权限。
SELinux简介
Security Enhanced Linux(SELinux) 为Linux 提供了一种增强的安全机制,其本质就是回答了一个“Subject是否可以对Object做Action?”的问题,例如 Web服务可以写入到用户目录下面的文件吗?其中Web服务就是Subject而文件就是Object,写入对应的就是Action。
理解selinux的核心思想
- Subject:在SELinux里指的就是进程,也就是操作的主体。
- Object: 操作的目标对象,例如文件
- Action: 对Object做的动作,例如 读取、写入或者执行等等
- Context: Subject和Object都有属于自己的Context,也可以称作为Label。Context有几个部分组成,分别是SELinux User、SELinux Role、SELinux Type、SELinux Level
用户程序执行的系统调用(例如读取文件),都要被SELinux依据安全策略进行检查。如果安全策略允许操作,则继续,否则将会抛出错误信息给应用程序。SELinux决策的同时还需要Subject和Object的Context信息,确定所属的User、Role和Type等信息,以此查询对应的安全策略进行决策
标签、规则各域
SELinux 依靠标签来匹配操作和规则。标签用于决定允许的事项,系统中,无论是文件、进程,还是套接字等都拥有标签。SELinux 在做决定时需参照两点:
1)这些对象分配的标签
2)定义这些对象如何交互的规则
标签
在 SELinux 中,设置或分配SContext给进程或文件的工作叫Security Labeling(打标签),一般采用以下形式:
user:role:type:mls_level
其中,type 是访问决定的主要组成部分,可通过构成标签的其他组成部分进行修改。对象会映射到类,对每个类的不同访问类型由权限表示。
user
system_u:表示系统程序
user_u:代表的是一般使用者账号相关的身份
role
object_r:代表的是文件或目录等文件资源
system_r:代表的是进程
type
type:在文件资源(object)上面称为类型(type)
domain:在主体进程(subject)则称为域(domain)(可理解为进程的type)
mls_level
此字段也可以称为级别,并且仅在策略支持MCS或MLS时才显示。该条目可以包括:
- 单个安全级别,其中包含敏感级别和零个或多个类别 (例如s0,s1:c0,s7:c10.c15)
- 由两个安全级别(低和高)组成的范围,两个安全级别之间用连字符分
SEAndroid中的MLS(Multi Level Security)的sensitivity level只有一个,即s0。
举例:
1.显示进程的标签ps -Z
Tset:/ $ ps -Z LABEL USER PID PPID VSZ RSS WCHAN ADDR S NAME u:r:shell:s0 shell 10545 19205 2130828 3260 __do_sys_+ 0 S sh u:r:shell:s0 shell 10552 10545 2133284 3548 0 0 R ps |
2.显示文件的标签ls -Z
Test/vendor/etc/camera $ ls -Z |
3.chcon 命令修改文件标签(SContext)chcon CONTEXT files
举例:
#查看camxoverridesettings.txt当前的context Test:/vendor/etc/camera # ls -Z camxoverridesettings.txt u:object_r:vendor_configs_file:s0 camxoverridesettings.txt
#chcon修改 context 为vendor_file Test:/vendor/etc/camera # chcon u:object_r:vendor_file:s0 camxoverridesettings.txt
#查看修改后的context Test:/vendor/etc/camera
# ls -Z camxoverridesettings.txt u:object_r:vendor_file:s0 camxoverridesettings.txt
#restorecon 命令更改回原来的标签类型 会重新load定义它context的文件 Test:/vendor/etc/camera # restorecon ./camxoverridesettings.txt SELinux: Loaded file_contexts
#再次查看camxoverridesettings.txt文件的标签 Test:/vendor/etc/camera # ls -Z camxoverridesettings.txt u:object_r:vendor_configs_file:s0 camxoverridesettings.txt
除使用以上格式进行labeling之外,还有其他关键词。例如,
genfscon
genfs中的gen为generalized的意思,一般对/目录,proc目录,sysfs等使用genfscon关键词进行Labeling
举例:
system/sepolicy/private/genfs_contexts
# Label inodes with the fs label. genfscon rootfs / u:object_r:rootfs:s0 # proc labeling can be further refined (longest matching prefix). genfscon proc / u:object_r:proc:s0 genfscon proc /asound u:object_r:proc_asound:s0 genfscon proc /buddyinfo u:object_r:proc_buddyinfo:s0 |
规则
规则采用如下形式:
allow domains types:classes permissions;
其中:
Domain - 一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型。
Type - 一个对象(例如,文件、套接字)或一组对象的标签。
Class - 要访问的对象(例如,文件、套接字)的类型。
Permission - 要执行的操作(例如,读取、写入)。
SELinux的运行模式
SELinux 有三个运行模式,分别是disabled, permissive 和 enforcing
- Disable: 禁用SELinux,不会给任何新资源打Label,如果重新启用的话,将会给资源重新打上Lable,过程会比较缓慢。
- Permissive:如果违反安全策略,并不会真正的执行拒绝操作,但会有拒绝信息写入日志。
- Enforcing: 默认模式,SELinux的正常状态,会实际禁用违反策略的操作
使用命令行更改SELinux模式
#查看当前的运行状态 adb shell getenforce #临时改变运行状态为Permissive adb shell setenforce 0 #临时改变运行状态为 Enforcing adb shell setenforce 1
这篇关于Selinux机制简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!