1、前言
在Linux Kernel 2.6的时代,内核引入了一个新的安全系统,用来提供访问控制安全策略的机制,这个安全系统就是SELinux,全称为Security Enhanced Linux,由NSA贡献的,它为Linux内核子系统引入了一个健壮的强制控制访问架构 。
Linux系统上传统的访问控制标准是自主访问控制(DAC),在这种形式下,一个软件或者守护进程以User ID(UID)或Set owner User ID(SUID)的身份运行,并且拥有该用户的目标(文件、套接字、以及其它进程)的权限,恶意代码很轻易运行在特定权限之下,从而取得访问的关键子系统的权限。而强制访问控制(MAC)基于保密性和完整性强制信息的隔离以限制破坏,该限制独立于传统的Linux安全机制运作。
2、SELinux的工作方式
SELinux的相关概念有:
- 主体
- 目标
- 策略
- 模式
当一个主体(例如一个程序)尝试去访问一个目标(例如一个文件),SELinux安全服务器将在内核中从策略数据库中运行一个检查,基于当前的模式,如果SELinux安全服务器授予权限,则该主体能后访问目标,如果SELinux安全服务器拒绝了权限,就会在/var/log/messages中记录一条拒绝信息。
SELinux的模式有:
- Enforcing--SELinux策略强制执行,基于SELinux策略规则授予或拒绝主体对目标的访问;
- Permissive--SELinux策略不强制执行,不实际拒绝访问,但会有拒绝信息写到日志;
- Disabled--完全禁用SELinux。
大多数系统,在默认的情况下,会将SELinux的模式设置为Enforcing,在登录的系统中,可以使用简单的命令getenforce查看,需要注意的是,永远不建议直接关闭SELinux,最佳设置模式为Enforcing和Permissive。
3、模式设置
在一些Android嵌入式设备上,使用串口登录后,出现了大量的SELinux拒绝信息的输出,如下图,该系统当前的SELinux模式为Enforcing,接下来,将简单介绍,如何去进行模式的设置:
在对SELinux的模式进行配置之前,我们先了解一下,这些SELinux输出提示大概是什么意思,使用下面的一个输出进行详细分析,输出如下:
[ 1150.705796] type=1400 audit(1578020365.526:4542): avc: denied { dac_override } for pid=186 comm="kworker/4:1" capability=1 scontext=u:r:kernel:s0 tcontext=u:r:kernel:s0 tclass=capability permissive=0
对上面这个例子分析过程如下:
缺少的权限:{ dac_override };
谁缺少了权限:scontext=u:r:kernel:s0;
对哪个文件缺少了权限:tcontext=u:r:kernel:s0;
文件的类型为:tclass=capability;
SELinux模式为:permissive=0。
接下来,则是介绍SELinux模式设置的一些方式:
(1)通过命令设置
对于SELinux的模式设置,可采用命令行的方式进行改变,例如,使用下面的命令查看当前模式,并设置模式为Permissive,命令如下:
查看当前系统的SELinux模式:
# getenforce
将模式设置为Permissive:
# setenforce 0
将模式设置为Enforcing:
# setenforce 1
在嵌入式设备下执行的命令效果如下所示:
(2)修改配置文件
修改SELinux的配置文件也可以更改SELinux的模式,可使用下面的操作进行修改:
# vim /etc/selinux/config
在需要修改的文件中,找到下面这行,然后设置成自己需要的模式:
SELINUX=permissive
(3)修改系统启动参数
通过修改系统的启动参数,也可以达到修改SELinux的模式,修改步骤如下:
进入到Android源码中,修改对应板子的编译文件:
$ cd /sdm450_9.0/device/qcom/msm8953_64 $ vim BoardConfig.mk
在编译脚本的最后添加下面这一行,将SELlinux的模式设置为permissive:
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
文件修改效果如下所示:
然后回到Android源码根目录,重新编译,并使用fastboot命令更新boot.img镜像:
$ croot $ make bootimage -j20 /* 更新boot分区 */ # adb reboot bootloader
# fastboot flash boot boot.img
# fastboot reboot
当烧写完成后,Android系统重新启动完成后,进入到终端查看系统启动参数,检查SELinux的模式是否配置成功,使用命令如下:
# cat /proc/cmdline
模式配置成功效果如下:
4、小结
本文主要简单介绍了SELinux的相关基础知识,并简单介绍了如何在嵌入式设备上修改SELinux的模式。