Linux Selinux机制
1. 简介
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,采用委任式存取控制,是在进行程序、文件等细节权限设置依据的一个核心模块,也是 Linux 的一个安全子系统。SELinux 主要是由美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的,2000年以 GNU GPL 发布。
2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。因为SELinux是内核级别的,所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效的。现在主流发现的Linux版本里面都集成了SELinux机制,CentOS/RHEL都会默认开启SELinux机制,而嵌入式Linux 系统都默认关闭了SELinux 。
2. selinux作用
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。如果一个以 root 身份运行的网络服务存在漏洞,黑客就可以利用这个漏洞,以 root 的身份在系统上进行任何操作。对于设备和系统的安全性是一个巨大的隐患。
3. 自由访问控制方式(DAC)
在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。只要访问这个资源的进程符合以上的条件就可以被访问。而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。
这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。
4. 强制访问控制(MAC)
在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。
这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。
而 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。
5. 工作模式
SELinux 有三种工作模式,分别是:
- enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到内核信息日志中。
- permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
- disabled:关闭 SELinux。与不带SELinux系统是一样的,通常情况下我们在不怎么了解SELinux时,将模式设置成disabled,这样在访问一些网络应用时就不会出问题了。
SELinux 工作模式可以在 /etc/selinux/config 中设定。如:
如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。通过 setenforce 来设置SELinux只是临时修改,当系统重启后就会失效了,所以如果要永久修改,就通过修改SELinux主配置文件。
需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文。SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。
6. 工作原理
7. 安全上下文(Security Context)
安全上下文是 SELinux 的核心。安全上下文可分为“进程安全上下文”和“文件安全上下文”。一个“进程安全上下文”一般对应多个“文件安全上下文”。只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。
SElinux环境下,每个对象有对应的安全属性(SContext)。安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0。
user | role | type | sensitivity | Category |
---|---|---|---|---|
身份识别 unconfined_u:不受限的用户或文件 system_u:受限的进程或文件 | 文件、进程、用户 object_r文件 system_r进程和用户 | 数据类型,重要 何种类型进程访问何种文件 | 安全级别 s0最低 只在msl下才有意义 | 划分的不同分类 |
使用ls -Z可以查询文件的安全属性:
使用ps -Z可以查询进程的安全属性:
8. 策略规则
有了SContext就可以对系统内的资源使用进行管理,为相关进程添加selinux策略。高通SDX12平台selinux策略相关的配置目录如下: sdx12-ap\poky\meta-qti-sepolicy\recipes-security\sepolicy
网络相关的进程相关的策略文件在sepolicy\common\device目录下,如atfwd.fc, atfwd.if, atfwd.te。
- 私有策略文件(.te):策略配置文件,这个文件包括了模块专用的声明和规则,通常,所有模块类型和属性声明都包括在.te 文件中,以及授予这些类型和属性核心访问权的规则。
- 外部接口文件(.if):定义相关接口函数,供外部模块使用,这些接口是其它模块访问这个模块的类型和属性。
- 标记策略文件(.fc):定义可执行文件的安全上下文,这个文件包括与这个模块有关的文件上下文标记语句。
在.te文件中添加访问规则,可以允许对应的的进程操作或使用某个对象。基本访问规则格式为:AV规则 主体 客体:客体类别 许可。AV规则指定访问方式,常用的AV规则有如下4个:
allow | 表示允许主体对客体执行允许的操作 |
---|---|
dontaudit | 表示不记录违反规则的决策信息,且违反规则不影响运行(允许操作且不记录) |
auditallow | 表示允许操作并记录访问决策信息(允许操作且记录) |
neverallow | 表示不允许主体对客体执行指定的操作 |
注:gen_require()宏,用它列出该接口使用的策略标识符(类型、属性、角色、布尔变量等的名字)
由于我们要消除avc:denied信息,一般使用的AV规则为allow。下面举例说明如果消除avc:denied信息:
其中,scontext的内容对应主体信息,使用其中的type域即system_app进行规则配置;
tcontext的内容对应客体信息,使用其中的type域即device进行规则配置;
tclass的内容为客体类别;denied后面{}里面的内容为被拒绝的操作类型。
针对该denied信息制定的访问策略为:allow system_app device:chr_file { read write };
由于devlog类型是在其他文件中定义的,在system_app.te文件中使用需要增加声明:
gen_require(`
type device;
')
allow system_app device:chr_file { read write };
9. 注意事项
- 不需要的东西一定要删除,否则会在install时报错
- 做好解耦,对应模块出的问题需要在对应模块te中增加规则,否则编译会报错