百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

做人做事,安全第一!——SELinux 入门

nanshan 2024-10-04 18:06 28 浏览 0 评论

一、前言

安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux 主要由美国国家安全局开发,2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。如果大家可以熟练掌握 SELinux 并正确运用,我觉得整个系统基本上可以到达“坚不可摧”的地步了(请永远记住没有绝对的安全)。掌握 SELinux 的基本概念以及简单的配置方法是每个 Linux 系统管理员的必修课。

这里把学习经验与大家分享交流,出错再所难免,仅供参考!如果发现错误的地方,可以的话麻烦指点下,特别感谢!本文的测试环境均在 CentOS 7.4.1708 系统中操作。

二、SELinux 的作用及权限管理机制

2.1 SELinux 的作用:

SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。

设想一下,如果一个以 root 身份运行的网络服务存在 0day 漏洞,黑客就可以利用这个漏洞,以 root 的身份在您的服务器上为所欲为了。是不是很可怕?

SELinux 就是来解决这个问题的。

2.2 DAC:

在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)

只要访问这个资源的进程符合以上的条件就可以被访问。

而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。

这种权限管理机制的主体是用户,也称为自主访问控制(DAC)

2.3 MAC:

在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限

这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。

这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。而 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。下文中的操作在没有特殊说明的情况下均为MCS模式。在 DAC 模式下,只要相应目录有相应用户的权限,就可以被访问。而在 MAC 模式下,还要受进程允许访问目录范围的限制。

三、SELinux 基本概念

SELinux决策过程

3.1 主体(Subject):可以完全等同于进程注:为了方便理解,如无特别说明,以下均把进程视为主体。

3.2 对象(Object):被主体访问的资源。可以是文件、目录、端口、设备等。注:为了方便理解,如无特别说明,以下均把文件或者目录视为对象。

3.3 策略和规则(Policy & Rule):系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。而哪些进程需要管制、要怎么管制是由策略决定的。一套策略里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。

在 CentOS 7 系统中,有三套策略,分别是:

  1. targeted:对大部分网络服务进程进行管制。这是系统默认使用的策略(下文均使用此策略)。

  2. minimum:以targeted为基础,仅对选定的网络服务进程进行管制。一般不用。

  3. mls:多级安全保护。对所有的进程进行管制。这是最严格的策略,配置难度非常大。一般不用,除非对安全性有极高的要求。

策略可以在/etc/selinux/config中设定。

3.4 安全上下文(Security Context)

安全上下文是 SELinux 的核心。安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。

一个「进程安全上下文」一般对应多个「文件安全上下文」。只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由策略中的规则决定。

文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。

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

安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0


用户(User)角色(Role)类型(Type)级别(Level)
进程安全上下文? 主要分两类。

?system_u
为系统服务进程,受到管制。

?unconfined_u
为不管制进程,通常都是用户自己开启的,如 bash。

? 主要分两类。

?system_r

为系统服务进程,受到管制。

?unconfined_r

为不管制进程,通常都是用户自己开启的,如 bash。

? 在targeted模式下

唯一一个需要关注的字段

? 在targeted模式下,只有两者的类型对应上了(不代表相同),进程才能访问文件。

? MLS 安全级别。仅在 MLS 模式下才有意义。
文件安全上下文? 主要分两类。

?system_u
为系统服务创建的文件。

?unconfined_u
为用户自己创建的文件。

? 均为object_r,表示一个文件。

? 在targeted模式

唯一一个需要关注的字段

? 在targeted模式下,只有两者的类型对应上了(不代表相同),进程才能访问文件。

? MLS 安全级别。仅在 MLS 模式下才有意义。

3.5 SELinux 的工作模式

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

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

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

  3. disabled:关闭 SELinux。

SELinux 工作模式可以在/etc/selinux/config中设定。

如果想从disabled切换到enforcing或者permissive的话,需要重启系统。反过来也一样。enforcingpermissive模式可以通过setenforce 1|0命令快速切换。

需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约 10 分钟,还以为是死机了……)。

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

四、SELinux 基本操作

4.1 查询文件或目录的安全上下文

  • 命令基本用法

ls -Z <文件或目录>
  • 用法举例

查询/etc/hosts的安全上下文。ls -Z /etc/hosts

  • 执行结果

-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts

4.2 查询进程的安全上下文

  • 命令基本用法

ps auxZ | grep -v grep | grep <进程名>
  • 用法举例

查询 Nginx 相关进程的安全上下文。

ps auxZ | grep -v grep | grep nginx
  • 执行结果

system_u:system_r:httpd_t:s0 root 7997 0.0 0.0 122784 2156 ? Ss 14:31 0:00 nginx: master process /usr/sbin/nginx
system_u:system_r:httpd_t:s0 nginx 7998 0.0 0.0 125332 7560 ? S 14:31 0:00 nginx: worker process

4.3 手动修改文件或目录的安全上下文

  • 命令基本用法

chcon <选项> <文件或目录 1> [<文件或目录 2>...]
选项功能
-u <值>修改安全上下文的用户字段
-r <值>修改安全上下文的角色字段
-t <值>修改安全上下文的类型字段
-l <值>修改安全上下文的级别字段
--reference <文件或目录>修改与指定文件或目录相一致的安全上下文
-R递归操作
-h修改软链接的安全上下文(不加此选项则修改软链接对应文件)
  • 用法举例

修改test的安全上下文为aaa_u:bbb_r:ccc_t:s0

chcon -u aaa_u -r bbb_r -t ccc_t test

4.4 把文件或目录的安全上下文恢复到默认值

  • 命令基本用法

restorecon [选项] <文件或目录 1> [<文件或目录 2>...]
  • 用法举例

添加一些网页文件到 Nginx 服务器的目录之后,为这些新文件设置正确的安全上下文。

restorecon -R /usr/share/nginx/html/

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

  • 命令基本用法

getsebool -a

由于该命令要么查询所有规则,要么只查询一个规则,所以一般都是先查询所有规则然后用grep筛选。

  • 用法举例

查询与httpd有关的布尔型规则。

getsebool -a | grep httpd
  • 执行结果

httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
#以下省略

4.6 开关一个布尔型规则

  • 命令基本用法

setsebool [选项] <规则名称> <on|off>
  • 用法举例

开启httpd_anon_write规则。

setsebool -P httpd_anon_write on

4.7 添加目录的默认安全上下文

  • 命令基本用法

semanage fcontext -a -t <文件安全上下文中的类型字段> "<目录(后面不加斜杠)>(/.*)?"

注:目录或文件的默认安全上下文可以通过semanage fcontext -l命令配合grep过滤查看。

  • 用法举例

为 Nginx 新增一个网站目录/usr/share/nginx/html2之后,需要为其设置与原目录相同的默认安全上下文。

semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"

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

  • 命令基本用法

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

注:各种服务类型所允许的端口号可以通过semanage port -l命令配合grep过滤查看。

  • 用法举例

为 Nginx 需要使用10080的端口用于 HTTP 服务。

semanage port -a -t http_port_t -p tcp 10080

五、SELinux 错误分析和解决

5.1 认识 SELinux 日志

当开启了 SELinux 之后,很多服务的一些正常行为都会被视为违规行为(标题及下文中的错误均指违规行为)。

这时候我们就需要借助 SELinux 违规日志来分析解决。

SELinux 违规日志保存在/var/log/audit/audit.log中。/var/log/audit/audit.log的内容大概是这样的。

type=LOGIN msg=audit(1507898701.391:515): 
pid=8523 uid=0 subj=system_u:system_r:crond_t:
s0-s0:c0.c1023 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=25 res=1
type=USER_START msg=audit(1507898701.421:516): 
pid=8523 uid=0 auid=0 ses=25 subj=system_u:system_r:
crond_t:s0-s0:c0.c1023 msg='op=PAM:session_open 
grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd 
acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
...

该文件的内容很多,而且混有很多与 SELinux 错误无关的系统审计日志。我们要借助sealert这个实用工具来帮忙分析(如果提示找不到命令的话请安装setroubleshoot软件包)。

5.2 使用sealert分析错误

  • 命令基本用法

sealert -a /var/log/audit/audit.log

执行完命令之后,系统需要花一段时间去分析日志中的违规行为并给出分析报告。

5.3 个人解决 SELinux 错误的思路

当发现一个服务出现错误的时候,请先检查一下sealert的分析报告里面是否有该服务进程名称的关键字。如果没有,说明不是 SELinux 造成的错误,请往其他方面排查。

接下来就是阅读sealert的分析报告了。

首先需要了解的就是违规原因。如果违规原因里面出现了该服务不该访问的文件或资源,那就要小心了。有可能是服务的配置有问题或者服务本身存在漏洞,请优先排查服务的配置文件。

在分析报告中,对于一个违规行为,通常会有 2~3 个解决方案。请优先选择修改布尔值、设置默认安全上下文之类操作简单、容易理解的解决方案。

如果没有这种操作简单、容易理解的解决方案,请先去搜索引擎搜索一下有没有其他更好的解决方案。

需要注意的是,可信度只是一个参考值,并不代表使用可信度最高的解决方案就一定可以解决问题。我个人感觉使用可信度越高的解决方案对系统的改动就越小

不过请记住,在执行解决方案之前,一定要先搞清楚解决方案中的命令是干什么的

最后,请谨慎使用audit2allow这个命令。这个命令的作用非常简单粗暴,就是强制允许所遇到的错误然后封装成一个 SELinux 模块,接着让 SELinux 加载这个模块来达到消除错误的目的。不是万不得已建议不要随便使用audit2allow

相关推荐

服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下

Raid5数据恢复算法原理:分布式奇偶校验的独立磁盘结构(被称之为raid5)的数据恢复有一个“奇偶校验”的概念。可以简单的理解为二进制运算中的“异或运算”,通常使用的标识是xor。运算规则:若二者值...

服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复

服务器数据恢复环境&故障:由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windowsserver操作系统,没有配置ups。因为服务器异常断电重启后,rai...

服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例

服务器数据恢复环境:P740+AIX+Sybase+V7000存储,存储阵列柜上共12块SAS机械硬盘(其中一块为热备盘)。服务器故障:存储阵列柜中有磁盘出现故障,工作人员发现后更换磁盘,新更换的磁盘...

「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复

服务器数据恢复环境:DellPowerVault系列磁盘柜;用RAID卡创建的一组RAID5;分配一个LUN。服务器故障:在Linux系统层面对LUN进行分区,划分sdc1和sdc2两个分区。将sd...

服务器数据恢复-ESXi虚拟机被误删的数据恢复案例

服务器数据恢复环境:一台服务器安装的ESXi虚拟化系统,该虚拟化系统连接了多个LUN,其中一个LUN上运行了数台虚拟机,虚拟机安装WindowsServer操作系统。服务器故障&分析:管理员因误操作...

「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例

服务器数据恢复环境:HPStorageWorks某型号存储;虚拟化平台为vmwareexsi;10块磁盘组成raid5(有1块热备盘)。服务器故障:raid5阵列中两块硬盘指示灯变黄掉线,无法读取...

服务器数据恢复—基于oracle数据库的SAP数据恢复案例

服务器存储数据恢复环境:某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列,其中有1块硬盘作为热备盘使用。上层划分若干lun,存放Oracle数据库数据。服务器存储故障&分析:该RAID5阵...

「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例

服务器虚拟化数据恢复环境:Dell某型号服务器;数块STAT硬盘通过raid卡组建的RAID10;XenServer服务器虚拟化系统;故障虚拟机操作系统:WindowsServer,部署Web服务...

服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例

服务器数据恢复环境:某品牌服务器中有一组由4块SAS磁盘做的RAID5磁盘阵列。该服务器操作系统为windowsserver,运行了一个单节点Oracle,数据存储为文件系统,无归档。该oracle...

服务器数据恢复—服务器磁盘阵列常见故障表现&amp;解决方案

RAID(磁盘阵列)是一种将多块物理硬盘整合成一个虚拟存储的技术,raid模块相当于一个存储管理的中间层,上层接收并执行操作系统及文件系统的数据读写指令,下层管理数据在各个物理硬盘上的存储及读写。相对...

「服务器数据恢复」IBM某型号服务器RAID5磁盘阵列数据恢复案例

服务器数据恢复环境:IBM某型号服务器;5块SAS硬盘组成RAID5磁盘阵列;存储划分为1个LUN和3个分区:第一个分区存放windowsserver系统,第二个分区存放SQLServer数据库,...

服务器数据恢复—Zfs文件系统下误删除文件如何恢复数据?

服务器故障:一台zfs文件系统服务器,管理员误操作删除服务器上的数据。服务器数据恢复过程:1、将故障服务器所有磁盘编号后取出,硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做...

服务器数据恢复—Linux+raid5服务器数据恢复案例

服务器数据恢复环境:某品牌linux操作系统服务器,服务器中有4块SAS接口硬盘组建一组raid5阵列。服务器中存放的数据有数据库、办公文档、代码文件等。服务器故障&检测:服务器在运行过程中突然瘫痪,...

服务器数据恢复—Sql Server数据库数据恢复案例

服务器数据恢复环境:一台安装windowsserver操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。在windows服务器内装有SqlServer数据库。存储空间LU...

服务器数据恢复—阿里云ECS网站服务器数据恢复案例

云服务器数据恢复环境:阿里云ECS网站服务器,linux操作系统+mysql数据库。云服务器故障:在执行数据库版本更新测试时,在生产库误执行了本来应该在测试库执行的sql脚本,导致生产库部分表被tru...

取消回复欢迎 发表评论: