SElinux基础知识及应用
1 概念
1.1 什么是SELinux?
Security-Enhanced Linux的英文缩写,字母上的意思就是安全强化Linux的意思。
1.2 为何设计它?
避免资源的误用。
SELinux是由美国国家安全局(NSA)开发的,当初开发的原因是很多企业发现,系统出现问题的原因大部分都在于内部员工的资源误用,实际由外部发动的攻击反而没有那么严重。举例来说,如果有个系统管理员为了自己设置的方便,将网页所在目录'/var/www/html/'的权限设置为'drwxrwxrwx',这样就代表所有进程均可对该目录读写,万一你真的启动了WWW服务器软件,那么该软件所触发的进程将可以写入该目录,而该进程却是对整个Internet提供服务的。只要有心人接触到这个进程,而且该进程刚好又提供了用户进行写入的功能,那么外部的人很可能就会想你的系统写入些莫名其妙的东西。
为了管理这方面的权限与进程的问题,美国国家安全局开始着手处理操作系统这方面的管理。由于Linux是自由软件,程序代码都是公开的,因此它们便使用Linux来作为研究的目标,最后更将研究结果整合到Linux内核中,那就是SELinux。所以说,SELinux是整合到内核的一个模块。
传统的文件权限与账号主要的关系:自主访问控制(DAC)
系统的账号主要分为系统管理员(root)与一般用户,而这两种身份能否使用系统上面的文件资源则于rwx的权限设置有关。因此,当某个进程想要对文件进行读写时,系统就会根据该进程的拥有者和用户组,比对文件的权限,只有通过权限检查,才可以读写该文件。
这种读写文件系统的方式被称为:自主访问控制(DAC)。基本上,就是依据进程的拥有者于文件资源的rwx权限来决定有无读写的权限。不过这种DAC的访问控制有几个缺点,就是:
root具有最高权限:如果不小心某个进程被有心人获取,且该进程属于root权限,那么这个进程就可以在系统上执行任何资源的读写。
用户可以获取进程来修改文件资源的访问权限:如果你不小心将某个目录的权限设置为777,由于对任何人的权限都会变成rwx,因此该目录就会被任何人所任意读写。
以策略规则制定特定进程读取特定文件:强制访问控制(MAC)
现在我们知道DAC的困扰就是当用户获取进程后,它可以借由这个进程与自己默认的权限来处理它自己的文件资源。万一这个用户对Linux系统不熟,就很可能会又资源误用的问题产生。为了避免DAC容易发生的问题,SELinux引入了强制访问控制(MAC)的方法。
强制访问控制(MAC),它可以针对特定的进程与特定的文件资源来管理权限。也就是说,即使你是root,那么在使用不同的进程时,你所能获取的权限也并不一定是root,而要根据当时该进程的设置而定。如此一来,我们针对控制的【主体】变成了【进程】而不是用户。此外,这个主体进程也不能任意使用系统文件资源,因为每个文件资源也针对该主体进程设置了可使用的权限。但是整个系统进程那么多、文件那么多,一项一项的控制可就没完没了。所以SELinux也提供了一些默认策略(Policy),并在该策略内提供多个规则(rule),让你可以选择是否启用该控制规则。
1.3 SELinux的运行模式
SELinux是通过MAC的方式来管理进程的,它控制的主体是进程,而目标则是该进程能否读取的文件资源。
主体
SELinux主要管理的就是进程。
目标
主体进程能否读写的目标资源一般是文件系统。
策略
由于进程与文件数量庞大,因此SELinux会依据某些服务来制订基本的读写安全性策略,这些策略内还会有详细的规则来指定不同的服务是否开放某些资源的读写。三个主要的策略,分别是:
targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略
minimum:由target自定义而来,仅针对选择的进程来保护
mls:完整的SELinux限制,限制方面较为严格
建议使用默认的策略即可(targeted)
安全上下文(security context)
上面写了主体、目标、策略,除了策略指定之外,主体与目标的安全上下文必须一致才能够顺利的读写。这个安全上下文(security context)有点类似文件系统的rwx。安全上下文的内容与设置非常重要,如果设置错误会导致某些服务(主体进程)就无法读写文件系统(目标资源),就会出现权限不符的报错信息。
2 常用命令
1. 查看 SELinux 状态
getenforce
- 作用:显示当前 SELinux 运行模式
- 返回值:
Enforcing
:强制模式(默认)Permissive
:宽容模式(仅记录不拦截)Disabled
:已禁用
2. 临时切换 SELinux 模式
setenforce 0 # 切换为 Permissive 模式
setenforce 1 # 切换为 Enforcing 模式
- 要求:需 root 权限
- 注意:重启后失效
3. 查看文件/目录安全上下文
ls -Z /path/to/file
- 输出示例:
u:object_r:system_file:s0 /system/bin/sh
- 字段解析:
u
:用户标识object_r
:角色system_file
:类型标签s0
:安全级别
4. 查看进程安全上下文
ps -Z | grep process_name
5. 修改文件安全上下文
chcon -u new_user -r new_role -t new_type /path/to/file
- 常用场景:修复因标签错误导致的权限问题
6. 恢复默认安全上下文
restorecon -Rv /path/to/dir
-R
:递归操作-v
:显示详情
7. 检查 SELinux 拒绝日志
dmesg | grep "avc:"
- 关键字段:
scontext
:发起方上下文tcontext
:目标上下文tclass
:目标类别(如文件、套接字)
8. 策略分析工具
sepolicy-analyze /path/to/avc_log.txt
- 功能:解析拒绝日志并给出修复建议
9. 策略编译工具
checkpolicy -M -o new_policy.bin policy.conf
- 场景:自定义策略开发时使用
重要说明:
- 系统分区操作需解锁
bootloader
和刷入修改版系统- 永久禁用 SELinux 需修改内核参数 (强烈不推荐,严重降低安全性)
- 安卓 8.0+ 使用 Treble 架构后,策略文件位于
/vendor/etc/selinux