Selinux机制简介

本文深入介绍了SELinux(Security Enhanced Linux)机制,重点讲解了其在Android系统中的应用。内容涵盖SELinux的基本概念,如DAC、MAC、标签、规则和域,以及SELinux的运行模式。文章详细阐述了SELinux Policy的组成部分,如TEAC、RBAC、MLS,并通过实例解析了规则的编写和应用。此外,还讨论了Android特有的MLS安全级别和mlsconstrain,以及如何在Android中处理SELinux问题和使用audit2allow工具生成策略。最后,探讨了SELinux中user、role和type的概念及其关系,以及class、attribute和context在策略定义中的作用。
摘要由CSDN通过智能技术生成

目录

理解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
u:object_r:vendor_configs_file:s0 cache
u:object_r:vendor_configs_file:s0 camxoverridesettings.txt
u:object_r:vendor_configs_file:s0 camxoverridesettingsOfPro.txt
u:object_r:vendor_configs_file:s0 com.xxxx.dcal.wt.golden
u:object_r:vendor_configs_file:s0 com.xxxx.dcal.wt.pro.golden
u:object_r:vendor_configs_file:s0 com.xxxx.dcal.wu.golden
u:object_r:vendor_configs_file:s0 com.xxxx.dcal.wu.pro.golden

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塞外totem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值