linux中的selinux到底是什么,本篇文章彻底明白

2023-11-17

原文链接https://www.phpyuan.com/235739.html,本文加以修改,若有侵权,请联系删除

一、前言

安全增强型 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 模式。

2.4 DAC 和 MAC 的对比

这里引用一张图片来说明。

在这里插入图片描述

可以看到,在 DAC 模式下,只要相应目录有相应用户的权限,就可以被访问。而在 MAC 模式下,还要受进程允许访问目录范围的限制。

三、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。

在这里插入图片描述

3.5 SELinux 的工作模式

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

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

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

  3. disabled:关闭 SELinux。

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

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

enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。

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

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

3.6 SELinux 工作流程

这里引用一张图片,不必过多解释。

在这里插入图片描述

注:上面的安全文本指的就是安全上下文。

四、SELinux 基本操作

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

命令基本用法

ls -Z <文件或目录>
例如:查询 /etc/hosts 的安全上下文。

[root@localhost ~]# 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 相关进程的安全上下文。(有时查不到需先开启nginx服务)

[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# ps auxZ|grep -v grep|grep nginx
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 11440 0.0  0.0 46104 1160 ? Ss 16:48   0:00 nginx: master process /usr/local/nginx/sbin/nginx
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 www 11442 0.0  0.0 48656 2008 ? S 16:48   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。

[root@localhost ~]#chcon -u aaa_u -r bbb_r -t ccc_t test

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

命令基本用法

restorecon [选项] <文件或目录 1> [<文件或目录 2>…]

选项参数
 -v打印操作过程
 -R递归操作

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

[root@localhost ~]#restorecon -R /usr/share/nginx/html/

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

命令基本用法

getsebool -a

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

用法举例

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

[root@localhost ~]getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
...(省略)

4.6 开关一个布尔型规则

命令基本用法

setsebool [选项] <规则名称> <on|off>

    -P重启依然生效

例如:开启 httpd_anon_write 规则。

root@localhost ~]setsebool -P httpd_anon_write on

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

命令基本用法

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

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

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

root@localhost ~]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 服务。

root@localhost ~]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 的内容很多,每一行一个内容,选取前两个:

[root@localhost ~]# head -2 /var/log/audit/audit.log 
type=LOGIN msg=audit(1606911601.598:244): pid=10313 uid=0 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=11 res=1
type=USER_START msg=audit(1606911601.631:245): pid=10313 uid=0 auid=0 ses=11 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

执行完命令之后,系统需要花一段时间去分析日志中的违规行为并给出分析报告。分析报告的结构讲解请看下图:
(可能会有多个错误进行信息叠加)
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux中的selinux到底是什么,本篇文章彻底明白 的相关文章

随机推荐

  • 使用ffmpeg将mp4转为m3u8并播放

    ffmpeg 下载地址 https ffmpeg zeranoe com builds 这个是我自己的ffmpeg 有积分的大佬可以任性下载 ffmpeg压缩包 下载解压之后需要将ffmpeg添加到环境变量中 cmd中输入 ffmpeg v
  • R语言与数据分析实战4-变量的创建与修改

    第1关 创建新变量 在进行实际的数据分析时 我们会经常需要创建新变量或者为当前存在的变量变换新的取值 这就好比你是一个厨师 现在你要创新菜式 需要做一些新的厨房模具或者是改良当前已有的厨具来进行烹饪 对于创建新变量 其实原理非常简单 大家只
  • shell-2-文本处理工具

    主题 文本处理工具 一 grep grep 全局搜索正则表达式 固定字符表示通用匹配 whatis grep man grep 查看grep用法 正则表达式分为两种 传统 扩展正则表达式 对应的 有两个命令 grep 传统 和 egrep
  • nginx应用指南

    一 nginx基本简述 最新更新 请点击这个里1 概念 nginx是一个开源且高性能 可靠的HTTP中间件 代理服务 开源 直接获取源代码 高性能 支持海量并发 2 nginx应用场景 静态处理 反向代理 负载均衡 资源缓存 安全防护 访问
  • Gson解析JSON数据中动态未知字段key的方法

    有时在解析json数据中的字段key是动态可变的时候 由于Gson是使用静态注解的方式来设置实体对象的 因此我们很难直接对返回的类型来判断 但Gson在解析过程中如果不知道解析的字段 就会将所有变量存储在一个Map中 我们只要实例化这个ma
  • 严格模式和非严格模式区别

    严格模式和非严格模式有什么区别 严格模式对正常的 JavaScript语义做了一些更改 首先 严格模式通过抛出错误来消除了一些原有静默错误 其次 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷 有时候 相同的代码 严格模
  • mutex 互斥

    文章目录 互斥 mutex 类 要求 公共方法 注意 lock unlock try lock 相关参考 互斥 互斥算法避免多个线程同时访问共享资源 这会避免数据竞争 并提供线程间的同步支持 mutex 类 mutex 类是能用于保护共享数
  • 【程序开发】手把手教你写一个Python爬虫

    经常听音乐的的人有一个苦恼 很多自己喜欢的歌曲 因为各种原因无法进行免费下载 很多人没办法 只能咬咬牙开个会员 都是自己辛苦挣的人民币啊 幸好 我们还有爬虫 通过爬虫 我们可以很轻易 很快速的获取互联网上的资源 不管是音乐视频 还是工作和商
  • PPPoE协议详解

    PPPoE协议详解 PPPoE协议的工作流程包含发现和会话两个阶段 发现阶段是无状态的 目的是获得PPPoE终结端 在局端的ADSL设备上 的以太网MAC地址 并建立一个惟一的PPPoESESSION ID 发现阶段结束后 就进入标准的PP
  • 非系统盘安装linux,Windows10 Linux子系统安装/迁移到非系统盘(示例代码)

    oboth DESKTOP BUFOEB1 mnt c Users luoz mnt d LxRunOffline exe 一 通过wsl命令迁移 备份Linux分发 操作步骤 wsl exe 命令用法 wsl h 命令行选项无效 h 版权
  • 子串和子序列问题-动态规划向

    1 子串子序列问题概述 有关于子序列和子串的问题是字符串或者数组经常会遇到的问题 一般我们经常使用多指针 滑动窗口 回溯 动态规划的方式去解决 而本篇重点关注能用动态规划解决或者说明显使用动态规划解决的子串问题和子序列问题 1 1 子串 子
  • <string>库和<cstring>库常用函数

    库和库常用函数 void memcpy void p1 const void p2 size t n void memset void p int v size t n char strcpy char p1 char p2 char st
  • canvas arcTo()用法详解

    arcTo x1 y1 x2 y2 radius arcTo 方法将利用当前端点 端点1 x1 y1 和端点2 x2 y2 这三个点所形成的夹角 然后绘制一段与夹角的两边相切并且半径为radius的圆上的弧线 弧线的起点就是当前端点所在边与
  • c语言经典代码实现0-100的和

    include
  • 【C++】-- STL之list详解

    目录 list类 1 list类对象构造 2 迭代器 3 empty 4 size 5 front 6 back 7 push front 8 pop front 9 push back 10 pop back 11 insert 12 e
  • 基类与派生类对象的关系 派生类的构造函数

    博主主页 一怀明月 专栏系列 线性代数 C初学者入门训练 题解C C的使用文章 初学 C 座右铭 不要等到什么都没有了 才下定决心去做 大家觉不错的话 就恳求大家点点关注 点点小爱心 指点指点 目录 基类与派生类对象的关系 派生类的构造函数
  • linux三剑客实战nginx日志

    nginx日志的格式 统计日志中出现404 500 502 400错误的次数 grep 404 500 nginx log wc l awk 9 404 500 nginx log wx l 表示包含 表示不包含 awk BEGIN num
  • java.lang.NoClassDefFoundError:could not initial class xxxxxxxxx

    转载 http www voidcn com blog wangjun5159 article p 6223131 html API 当出现这个异常时 我的第一反应是 它跟ClassNotFoundException有什么不同 为了找到确切
  • 爬虫入门_3:数据解析及案例实战

    聚焦爬取 爬取页面中指定的页面内容 编码流程 指定url 发起请求 获取响应数据 数据解析 持久化存储 数据解析分类 正则 re M 多行匹配 re S 单行匹配 bs4 xpath 数据解析原理概述 解析的局部的文本内容都会在标签之间或者
  • linux中的selinux到底是什么,本篇文章彻底明白

    原文链接https www phpyuan com 235739 html 本文加以修改 若有侵权 请联系删除 一 前言 安全增强型 Linux Security Enhanced Linux 简称 SELinux 它是一个 Linux 内