news 2026/5/1 11:46:35

Linux DAC 与 SELinux/SEAndroid MAC

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux DAC 与 SELinux/SEAndroid MAC

访问控制是操作系统信息安全的核心机制,用于限制主体(进程、用户)对客体(文件、设备、端口)的访问权限。Linux 系统默认采用DAC(自主访问控制),而高安全场景(如服务器、车机、安卓设备)会叠加MAC(强制访问控制),其中最主流的实现是SELinux,其在安卓系统的移植版本为SEAndroid

一、Linux DAC 原理详解

DAC(Discretionary Access Control)是 Linux/Unix 系统的基础访问控制机制,核心是基于用户身份和文件权限位的自主管控,也是用户最常接触的权限模型。

1. 核心要素

(1)主体与客体
  • 主体:发起访问请求的实体,包括用户(User)进程(Process)进程的权限继承自启动它的用户。
  • 客体:被访问的实体,包括文件、目录、设备文件、网络端口等。
(2)用户与组的三类身份

Linux 中每个文件都关联三类身份,权限分别对应用户的访问范围:

  • 属主(Owner):文件的创建者或被指定的用户,用u表示。
  • 属组(Group):文件所属的用户组,用g表示。
  • 其他用户(Others):既不是属主也不在属组的用户,用o表示。
(3)基础权限位(rwx)

每个文件对三类身份分别定义读(r)、写(w)、执行(x)三种权限,权限位共 9 位,对应ls -l输出的权限字段(如rwxr-xr--)。

权限字符数值表示文件含义目录含义
r(读)4可读取文件内容可列出目录内文件(ls
w(写)2可修改 / 删除文件内容可创建 / 删除目录内文件(mkdir/rm
x(执行)1可运行程序 / 脚本可进入目录(cd

2. DAC 权限判断流程

Linux 内核判断一个进程能否访问某个文件的优先级顺序如下:

  1. 检查进程的 有效 UID 是否为文件属主 UID:如果是,应用属主权限(u段)。
  2. 若不匹配,检查进程的 有效 GID 是否在文件属组内:如果是,应用属组权限(g段)。
  3. 若都不匹配,应用其他用户权限(o段)。
  4. 只要任意一段权限满足访问需求(如读操作需要r位),则允许访问;否则拒绝

核心缺陷

  • 权限自主性过强:文件属主可随意修改权限(如chmod 777),存在误操作风险。
  • root 权限无敌:root 用户(UID=0)默认绕过所有 DAC 权限检查,一旦 root 权限泄露,系统完全失控。
  • 无细粒度管控:无法基于 “进程用途”“文件类型” 等维度限制访问(如限制某进程只能读特定日志,不能写)。

二、SELinux MAC 原理详解

SELinux(Security-Enhanced Linux)是由 NSA 开发的MAC 实现,核心是通过内核级策略强制限制主体对客体的访问,弥补 DAC 的缺陷。它与 DAC 是叠加关系:只有同时通过 DAC 和 SELinux 检查,访问才会被允许。

1. 核心设计理念

SELinux 抛弃了 DAC “基于用户身份” 的管控逻辑,转而采用TE(Type Enforcement,类型强制)作为核心机制,同时支持 MLS(Multi-Level Security,多级安全)用于高保密场景。日常使用中,TE 是 SELinux 的核心,MLS 极少涉及,本文重点讲解 TE。

2. SELinux 核心要素

(1)安全上下文(Security Context)

SELinux 为所有主体(进程)和客体(文件 / 设备)分配一个标签,称为安全上下文,这是访问控制的核心依据。安全上下文的格式为:user:role:type:level(日常使用中level可忽略,MLS 场景才会用到)。

字段含义作用
userSELinux 用户(如unconfined_u关联 Linux 用户,用于权限继承
roleSELinux 角色(如unconfined_r限制用户可执行的进程类型
type类型标签(如httpd_thttpd_sys_content_tTE 机制的核心,决定访问权限
  • 进程的安全上下文:称为domain(域),表示进程的 “身份类型”。
  • 文件的安全上下文:称为type(类型),表示文件的 “资源类型”。
(2)策略规则(Policy Rules)

SELinux 策略是一组预定义的规则,描述 “哪个 domain 的进程可以访问哪个 type 的文件,以及允许的操作(读 / 写 / 执行)”。策略规则的核心格式:

allow domain_type file_type : class permission;
  • domain_type:进程的 SELinux 域。
  • file_type:文件的 SELinux 类型。
  • class:访问的客体类别(如filedirtcp_socket)。
  • permission:允许的操作(如readwriteexecute)。

示例:允许httpd_t(Apache 进程域)读取httpd_sys_content_t(网页文件类型)的文件

allow httpd_t httpd_sys_content_t : file read;
(3)运行模式

SELinux 有 3 种运行模式,决定策略的执行强度:

模式命令查看(getenforce核心效果适用场景
Enforcing(强制模式)Enforcing严格执行策略,拒绝违规访问,并记录日志生产环境
Permissive(宽容模式)Permissive不拒绝违规访问,但记录所有违规行为策略调试、测试环境
Disabled(关闭模式)Disabled完全关闭 SELinux,不进行任何 MAC 检查仅临时排查问题,禁止长期使用
(4)AVC 审计日志

当 SELinux 拒绝访问时,会通过AVC(Access Vector Cache)记录详细日志,默认存储在/var/log/audit/audit.log(需安装auditd服务)。日志包含:

  • 主体的安全上下文(进程 domain)。
  • 客体的安全上下文(文件 type)。
  • 被拒绝的操作(如write)。
  • 客体类别(如file)。

3. SELinux 访问判断流程

当一个进程请求访问文件时,内核的判断顺序是:

  1. 先执行 DAC 检查:如果 DAC 拒绝(如用户无读权限),直接拒绝访问,不进入 SELinux 检查。
  2. 再执行 SELinux 检查
    • 提取进程的 domain 和文件的 type。
    • 查询策略规则,判断是否存在允许该domain->type对应操作的规则。
    • 若存在规则,允许访问;若不存在,强制拒绝,并记录 AVC 日志。

核心优势

  • 强制管控:策略由管理员定义,进程 / 用户无法绕过(包括 root 用户)。
  • 细粒度控制:可基于进程类型、文件类型限制访问(如限制sshd_t只能访问ssh_key_t类型的文件)。
  • 最小权限原则:每个进程只拥有完成任务所需的最小权限,降低权限泄露风险。

三、SEAndroid MAC 原理详解

SEAndroid 是SELinux 在安卓系统上的移植版本,由谷歌主导开发,从安卓 4.3 开始成为强制启用的安全机制。其核心原理与 SELinux 一致,但针对安卓的组件化架构做了定制化适配。

1. SEAndroid 与 SELinux 的核心差异

特性SELinux(Linux)SEAndroid(安卓)
管控对象进程、文件、设备、端口进程、文件、安卓组件(Activity/Service/ContentProvider)
策略架构主要基于 TE 机制1. TE 机制(核心)2. 安卓组件专用规则(如activity类权限)
权限来源系统策略文件(*.pp1. 系统策略(sepolicy)2. 应用签名权限(seapp_contexts
日志位置/var/log/audit/audit.loglogcatavc:关键字)、dmesg
管理工具semanagesetseboolchconsepolicy-injectsetenforcels -Z(需 root 权限)

2. SEAndroid 核心适配点

(1)安卓组件管控

安卓的核心组件(Activity、Service、BroadcastReceiver、ContentProvider)是应用交互的关键,SEAndroid 扩展了 SELinux 的客体类别,新增了activityservicecontent_provider等类,并通过策略规则限制组件间的调用。

示例:允许微信的wechat_app_t域调用系统telephony_service_t类型的 Service

allow wechat_app_t telephony_service_t : service call;
(2)应用安全上下文分配

安卓通过/seapp_contexts文件定义应用的 SELinux 上下文,分配规则基于:

  • 应用的签名(如系统应用、第三方应用)。
  • 应用的UID(如app_1000表示普通应用)。
  • 应用的标签(如privileged表示特权应用)。

普通第三方应用的上下文通常为:u:r:untrusted_app:s0;系统应用为:u:r:system_app:s0

(3)沙箱隔离

SEAndroid 为每个应用分配独立的 domain,不同应用的进程无法互相访问数据,即使获取 root 权限,也无法绕过 SEAndroid 策略(除非修改策略)。这是安卓 “应用沙箱” 的核心实现。

四、DAC 与 SELinux/SEAndroid MAC 核心对比

对比维度Linux DACSELinux MACSEAndroid MAC
控制类型自主访问控制强制访问控制强制访问控制(安卓定制)
核心依据用户 / 组身份 + 权限位安全上下文(domain/type) + 策略规则安全上下文 + 安卓组件规则
权限自主性属主可随意修改权限(如chmod 777权限由策略强制定义,用户 / 进程无法修改同 SELinux,应用无法自主修改
root 权限root 绕过所有权限检查root 受策略限制,无法随意访问同 SELinux,root 需策略授权
细粒度粗粒度(仅用户 / 组 / 其他三类)细粒度(基于进程 / 文件类型)极细粒度(支持安卓组件级管控)
默认状态Linux 默认启用部分系统默认关闭(如 CentOS 7 需手动开启)安卓 4.3+ 默认强制启用
管理复杂度低(chmodchown即可)高(需学习策略语法、上下文管理)极高(需适配安卓组件、应用签名)
适用场景普通桌面、非敏感服务器高安全服务器、车机、军工系统安卓设备(手机、平板、车机)
缺陷1. root 权限无敌2. 权限易误配3. 无细粒度隔离1. 策略配置复杂2. 误配会导致系统功能异常
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 9:30:44

10分钟实现中文情感分析|基于StructBERT镜像快速部署

10分钟实现中文情感分析|基于StructBERT镜像快速部署 1. 业务场景与技术痛点 在当前的互联网产品生态中,用户评论、客服对话、社交媒体内容等文本数据呈爆炸式增长。企业亟需一种高效、准确、低成本的方式对中文文本进行情绪倾向判断,以支持…

作者头像 李华
网站建设 2026/4/30 6:13:19

一句话理解pyside6的信号和槽机制

通俗的讲:pyside6 信号其实就是指发生了什么,槽就是在接收到这个信号后要做什么。 PySide6 的信号按控件类型分类,不同控件有专属的核心信号,同时也有一些通用信号适用于所有控件。 下面我会按 “通用信号 常用控件专属信号” …

作者头像 李华
网站建设 2026/5/1 8:50:37

35.轴承滚珠检测

1.根据图中绿色线条覆盖的所有滚珠中心拟合出Circle3,找到图中所有滚珠,如果滚珠的数量小于15为红色,反之为绿色 2.计算滚珠到圆1的距离,显示最大值与最小值,如果最小值小于像素80,物料NG,反之物料OK,判断Circle4的有无 3.计算各个圆的半径以及相邻两个圆的半径差,最…

作者头像 李华
网站建设 2026/5/1 2:32:24

云原生部署(AWS/Azure)

1.云原生部署(AWS/Azure) 云原生部署是指利用云计算平台的弹性、可扩展性和自动化能力,以容器化、微服务、持续交付、DevOps 和动态编排(如 Kubernetes)为核心构建和运行应用。在 AWS 和 Azure 上进行云原生部署&…

作者头像 李华
网站建设 2026/5/1 9:49:43

何时我们才能完全相信纯视觉APP自动化测试?

在APP自动化测试的赛道上,纯视觉方案一直处于“争议中心”——有人觉得它摆脱了控件依赖,适配速度快,是多端测试的利器;也有人吐槽它稳定性差、易受环境干扰,关键时刻不敢全信。作为常年和自动化测试打交道的开发者&am…

作者头像 李华