查看原文
其他

你需要知道的SELinux入门学习

Reese vivo千镜 2022-11-05
如果你之前使用Linux的时候都禁用或者忽略了SELinux,那你的Linux可真是安全堪忧了,快让我们把这种新功能学起来,将自己的资源牢牢抓在自己手中吧!

01
SELinux背景概述

SELinux:是由美国NSA(国安局)和一些公司(RedHat、Tresys等)设计的一个针对Linux的安全加强系统。


NSA最初设计的安全模型叫FLASK,全称为Flux Advanced Security Kernel(由Uta大学和美国国防部开发,后来由NSA将其开源),当时这套模型针对DTOS系统。后来,NSA觉得Linux更具发展和普及前景,所以就在Linux系统上重新实现了FLASK,称之为SELinux。


2000年,SELinux项目以GPL协议的形式开源,当RedHat在其Linux发行版本中包括了SELinux之后,SELinux才逐步变得流行起来。


现在,SELinux已经被许多组织广泛使用,几乎所有的Linux内核2.6以上版本,都集成了SELinux功能。


但是,SELinux主要是红帽Red Hat在Linux以及它的衍生发行版上的一个工具,而Ubuntu 和 SUSE(以及它们的衍生发行版)使用的是 AppArmor,SELinux和AppArmor 确是有显著不同的,这个我们可以日后再慢慢讨论。


了解了这些背景知识,现在让我们来正式入门吧!



02
SELinux概念

我们都知道,传统Linux系统中,默认权限是对文件/目录所有者、所属组、还有其他人的rwx权限进行管控,这种访问控制系统称为DAC,而在SELinux中则是使用MAC,那这二者到底有什么区别呢?我们有必要详细的了解一下这两个访问控制系统各自的特点。


DAC:(Discretionary Access Control)自主访问控制---SELinux出现之前的Linux安全模型


核心思想:这种权限管理机制的主体是用户,进程理论上所拥有的权限与执行它的用户的权限相同。比如,以root用户启动Browser,那么Browser就有root用户的权限,在Linux系统上能干任何事情。

缺点:· root用户不受任何管制,权限过高,rwx权限不生效,系统上任何资源都可以无限制地访问,一旦root用户误操作就很致命。· 本身的默认权限过于简单,只有rwx不利于权限细分。· 权限分配不当会很致命,例如:系统敏感文件/目录分配777权限,敏感文件分配了SetUID权限等等。

MAC:(Mandatory Access Control)--- 强制访问控制


核心思想:任何进程想在Linux系统中干任何事情,都必须先在安全策略配置文件中赋予权限。凡是没有出现在安全策略配置文件中的权限,进程就没有该权限,这种权限管理机制的主体是进程。


一个用户想要访问一个文件,需要同时满足:权限符合rwx权限;用户的进程符合SELinux规定。


MAC又细分为了两种方式,一种叫多类别安全(MCS)模式,另一种叫多级安全(MLS)模式。


多级别安全(MLS, Multilevel security):用于处理具有不兼容分类的信息,对进程(域)实施强制控制,允许具有不同安全权限和需要访问的用户对数据进行访问,同时阻止他们访问其他未授权的信息。


多类别安全(MCS, Multi categories security):针对具有同样访问权限的进程进行更深层次的权限区分,使其相互独立。


PS:Linux中的超级root不意味着在SELinux中也是超级root,SELinux的超级root只由安全策略的指定者来决定。


03
SELinux的基本概念

之前在某站的某个文章里看到一个说法,觉得很有意思和大家分享一下:

Linux里面存在两种东西,一种是死的,一种是活的。
死的是文件,活的是进程,这么说是因为进程可以操作文件,但是文件只能被操作。

但是在SELinux中无论是活的或是死的都拥有同一种属性---Security Context安全上下文,简称Scontext,简要介绍就先到这里。让我们详细的来看看,具体SELinux中包含的元素概述,请看思维导图:



下面对一些思维导图没涵盖的内容做补充说明:

主体说白了就是进程对象(Object

被主体访问的资源,可以是文件、目录、端口、设备等等。

政策和规则(Policy & Rule--- 指导规范

政策决定了哪些进程需要管制、要怎么管制。

一套政策里面有多个规则,部分规则可以按照需求启用或禁用-----布尔型规则。

在安装新的应用程序时,应用程序可通过添加新的模块来添加规则,用户也可以手动地增减规则。

安全上下文(Security Context, SContext--- SELinux的核心


安全上下文也可以简单地分成:「进程SContext」和「文件SContext」。

一个「进程SContext」一般对应多个「文件SContext」。

只有两者的SContext对应上了,进程才能访问文件,它们的对应关系由政策中的规则决定。

文件SContext由文件创建的位置和创建文件的进程所决定,系统一般会有默认值,用户也可以重设

ps:单纯的移动文件操作并不会改变文件的SContext。



安全上下文的结构及含义:

SContext使用 : 分隔为4个字段,其实共有5个字段,只是最后一个“类别”字段是可选的,分别用 : 隔开。例如:system_u:object_r:admin_home_t:s0


对应关系如下:

system_u:object_r:httpd_sys_content_t:s0:[级别]

#身份字段:角色:类型:灵敏度:[级别]




坑:进程的域和文件的类型不匹配,所以必须要掌握如何修改类型字段

SELinux的工作模式(可以在/etc/selinux/config中设定)

SELinux有三种工作模式,分别是:

1. enforcing:强制模式,违反SELinux规则的行为将被阻止并记录到日志中

2. permissive:宽容模式,违反SELinux规则的行为只会记录到日志中(调试用)

3. disabled:SELinux关闭状态



需要注意的地方:

1. 如果想从disabled切换到enforcing/permissive的话,需要重启系统,反之过来也一样。

2. enforcing/permissive模式可以通过setenforce1|0命令快速切换。

3. 如果系统已经在disabled下运行了一段时间,在打开SELinux之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建SContext。

4. SELinux日志的记录需要借助auditd.service这个服务,请不要禁用它。

SELinux工作流程


这里引用下别人文章里面的一张图片(安全文本指的就是SContext):



关于Selinux的作用


SELinux的存在并不是为了要修补Linux系统的缺陷,而是通过最大限度地减小系统中服务进程可访问的资源,对Linux的漏洞进行监控,便于及时采取措施。


举个栗子:

Linux产生DNS系统的缓存溢出攻击之后,并没有修复,而是接入Selinux进行强制接入控制,针对黑客进行第二次攻击的时间进行监控。


04

SELinux基本命令行


通过对 SELinux 的基本介绍,我们可以这样认为,在传统 Linux 系统使用访问控制方式的基础上,附加使用 SELinux 可增强系统的安全性。那么,SELinux 到底怎么通过命令行进行基本操作呢?让我们接下来一起来看看。


查看SELinux的模式


#getenforce
Enforcing        //显示出目前的模式为Enforcing


     查看SELinux的政策(Policy)


#sestatus
//sestatus [-vb]
//-v:检查列於/etc/sestatus.conf内的文件与程序的安全性本文内容;
//-b:将目前政策的守则布林值列出,亦即某些守则(rule)是否要启动(0/1)之意;

selinux status: enabled              //是否启动selinux
selinuxfs mount: /selinux            //selinux的相关文件资料存储点
Current mode: enforcing              //目前的模式
Mode from config file: enforcing     //设定档指定的模式
Policy version: 21                         //安全版本号
Policy from config file: targeted      //目前的政策是什么


通过配置文件调整SELinux的参数


#vim /etc/selinux/config
selinux=enforcing                 //调整enforcing|disabled|permissive
selinuxTYPE=targeted            //目前仅有targeted与strict


查看SELinux状态


a) /usr/sbin/sestatus -v    //如果selinux status参数为enabled即为开启状态selinux status: enabled
b)getenforce             //也可以用这个命令检查

坑:
如果改变了政策那就需要重新开机了
如果由enforcing/permissive改成disabled,或由disabled改成enforcing/permissive,那也必须要重新开机。

这是因为SELinux是整合到核心里面去的,你只可以在SELinux运作下切换成为强制(enforcing)/宽容(permissive)模式,不能够直接关闭SELinux。而且,由SELinux关闭(disable)的状态到开启的状态也需要重新开机。



关闭SELinux: 

a)临时关闭(不用重启机器):

setenforce 0      //设置selinux成为permissive宽容模式

setenforce 1      //设置selinux成为enforcing强制模式


b)修改配置文件需要重启机器:

修改/etc/selinux/config文件

将selinux=enforcing改为selinux=disabled

重启机器即可


 坑:setenforce无法在Disabled的模式底下进行模式的切换



启动SELinux:  

如果需要启动,需要把selinux=enforcing设定好,并且指定 selinuxTYPE=targeted这一个设定,然后查看/boot/grub/menu.lst,明确下内核到底有没有关闭selinux。

#vi /boot/grub/menu.lst

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.18-92.el5)

root (hd0,0)

kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet selinux=0

initrd /initrd-2.6.18-92.el5.img

如果要启动SELinux, kernel后面不能出现selinux=0属性


坑:一般使用时,要关闭服务器的SELinux功能,常用下面两种方法

1)临时关闭

#setenforce 0

#getenforce


2)永久关闭

#cat /etc/sysconfig/selinux

SELINUX=disabled

#reboot


SELinux安全上下文查看方法


查询文件或目录的SContext
ls -Z <文件或目录>

查询进程的SContext
ps auxZ | grep -v grep | grep <进程名>


SELinux安全上下文的修改和设置

(chcon和restorecon命令)


手动修改文件或目录的SContext
chcon <选项> <文件/目录> [<文件/目录>...]
//-u  修改SContext的user字段
//-r  修改SContext的role字段
//-t  修改SContext的type字段(最常用)
//-l  修改SContext的level字段
//-reference<文件/目录>  修改为与指定目录相一致的SContext
//-R  递归操作
//-h  修改路径的SContext(不加则修改对应路径的文件)

把文件或目录的SContext恢复到默认值
restorecon [-VR] <文件/目录> [<文件或目录>...]
//-R 递归.当前目录和目录下所有的子文件同时恢复
//-V 把恢复过程显示到屏幕上


布尔类型规则操作部分


查询系统中的布尔型规则及其状态

getsebool –a     //筛选的时候可以后接grep


开关一个布尔型规则

setsebool [-P] <规则名称> <on|off>

//-P  重启仍然生效


SELinux默认安全上下文的查询和修改

(semanage命令)


查询所有的默认安全上下文
semanage fcontext –l [ | grep xxx ]

添加目录的默认SContext
semanage fcontext -a -t <文件SContext中的类型字段> "<目录(后面不加/)>
//-a  添加默认安全上下文配置。
//-d  删除指定的默认安全上下文。
//-m 修改指定的默认安全上下文。
//-t   设定默认安全上下文的类型

注:
如果提示找不到命令的话就安装policycoreutils-python软件包
目录或文件的默认SContext可以通过semanage fcontext -l命令配合grep过滤查看

修改默认安全上下文
mkdir <目录/文件>


添加某类进程允许访问的端口


semanage port -a -t <服务类型> -p <协议> <端口号>

注:
如果提示找不到命令的话就安装policycoreutils-python软件包
各种服务类型所允许的端口号可以通过semanage port -l命令配合grep过滤查看

我们这次关于SELinux的学习就先聊到这里,之后的学习我们一起共勉吧,加油!



更多精彩阅读


· 如何通过配置文件实现HTTPS证书固定

· BLE安全现状与挑战


END



长按关注  最新动态

好文!在看吗?点一下鸭!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存