SELinux基础知识

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的模式。

原文地址:https://www.cnblogs.com/Cqlismy/p/12143484.html