Update from Sync Service

This commit is contained in:
FNS Service
2026-04-21 20:36:03 +08:00
parent ed5ec2f47e
commit fa23e00cad

View File

@@ -1,148 +1,214 @@
## 一、前言 # CentOS7 SELinux 配置
## 安全增强型 LinuxSecurity-Enhanced Linux简称 SELinux它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。
## SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。 > 安全增强型 Linux (Security-Enhanced Linux)
## SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。
## 如果可以熟练掌握 SELinux 并正确运用,我觉得整个系统基本上可以到达"坚不可摧"的地步了(请永远记住没有绝对的安全)。 ---
## 掌握 SELinux 的基本概念以及简单的配置方法是每个 Linux 系统管理员的必修课。
## 本文均在 CentOS 7.4.1708 系统中操作。 ## 简介
## 本文纯属个人学习经验分享交流,出错再所难免,仅供参考!如果发现错误的地方,可以的话麻烦指点下,特别感谢!
## 二、SELinux 的作用及权限管理机制 SELinux 是 Linux 内核的安全模块,实现**最小权限原则**。
## 2.1 SELinux 的作用
## SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。 - 即使程序以 root 运行,也受 SELinux 策略限制
## 设想一下,如果一个以 root 身份运行的网络服务存在 0day 漏洞,黑客就可以利用这个漏洞,以 root 的身份在您的服务器上为所欲为了。是不是很可怕? - 限制进程只能访问其需要的资源
## SELinux 就是来解决这个问题的。 - 防止漏洞被利用后"为所欲为"
## 2.2 DAC
## 在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。 ---
## 只要访问这个资源的进程符合以上的条件就可以被访问。
## 而最致命问题是root 用户不受任何管制,系统上任何资源都可以无限制地访问。 ## 工作模式
## 这种权限管理机制的主体是用户也称为自主访问控制DAC
## 2.3 MAC | 模式 | 说明 |
## 在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。 |------|------|
## 这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。 | **Enforcing** | 强制模式,违规行为被阻止并记录 |
## 即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。 | **Permissive** | 宽容模式,违规行为仅记录 |
## 这种权限管理机制的主体是进程也称为强制访问控制MAC | **Disabled** | 关闭 SELinux |
## 而 MAC 又细分为了两种方式一种叫类别安全MCS模式另一种叫多级安全MLS模式。
## 下文中的操作均为 MCS 模式。 ---
## 2.4 DAC 和 MAC 的对比
## 这里引用一张图片来说明。 ## 查看状态
## 可以看到,在 DAC 模式下,只要相应目录有相应用户的权限,就可以被访问。而在 MAC 模式下,还要受进程允许访问目录范围的限制。
## 三、SELinux 基本概念 ```bash
## 3.1 主体Subject # 查看当前模式
## 可以完全等同于进程。 getenforce
## 注:为了方便理解,如无特别说明,以下均把进程视为主体。
## 3.2 对象Object # 详细状态
## 被主体访问的资源。可以是文件、目录、端口、设备等。 sestatus
## 注:为了方便理解,如无特别说明,以下均把文件或者目录视为对象。
## 3.3 政策和规则Policy & Rule # 查看版本
## 系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。 selinuxenabled && echo "Enabled" || echo "Disabled"
## 而哪些进程需要管制、要怎么管制是由政策决定的。 ```
## 一套政策里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。
## 规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。 ---
## 在 CentOS 7 系统中,有三套政策,分别是:
## 1. targeted对大部分网络服务进程进行管制。这是系统默认使用的政策下文均使用此政策 ## 临时切换模式
## 2. minimum以 targeted 为基础,仅对选定的网络服务进程进行管制。一般不用。
## 3. mls多级安全保护。对所有的进程进行管制。这是最严格的政策配置难度非常大。一般不用除非对安全性有极高的要求。 ```bash
## 政策可以在 /etc/selinux/config 中设定。 # 切换到强制模式
## 3.4 安全上下文Security Context sudo setenforce 1
## 安全上下文是 SELinux 的核心。
## 安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。 # 切换到宽容模式
## 一个「进程安全上下文」一般对应多个「文件安全上下文」。 sudo setenforce 0
## 只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。 ```
## 文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。
## 需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。 > ⚠️ 需要安装 `setroubleshoot` 并启用 `auditd` 服务
## 安全上下文的结构及含义
## 安全上下文有四个字段分别用冒号隔开。形如system_u:object_r:admin_home_t:s0。 ---
## 3.5 SELinux 的工作模式
## SELinux 有三种工作模式,分别是: ## 永久配置
## 1. enforcing强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
## 2. permissive宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。 编辑 `/etc/selinux/config`
## 3. disabled关闭 SELinux。
## SELinux 工作模式可以在 /etc/selinux/config 中设定。 ```bash
## 如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。 sudo vim /etc/selinux/config
## enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。 ```
## 需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约 10 分钟,还以为是死机了……)。
## SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。 ```ini
## 3.6 SELinux 工作流程 SELINUX=enforcing # 强制模式
## 这里引用一张图片,不必过多解释。 # SELINUX=permissive # 宽容模式
## 注:上面的安全文本指的就是安全上下文。 # SELINUX=disabled # 关闭
## 四、SELinux 基本操作
## 4.1 查询文件或目录的安全上下文 SELINUXTYPE=targeted # 目标策略
## 命令基本用法 ```
## 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
## 用法举例 ```bash
## 查询 Nginx 相关进程的安全上下文。 # 查看文件/目录上下文
## ps auxZ | grep -v grep | grep nginx ls -Z /etc/hosts
## 执行结果
## 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 ps auxZ | grep nginx
## 4.3 手动修改文件或目录的安全上下文
## 命令基本用法 # 查看用户的上下文
## chcon [...] id -Z
## 选项功能-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 把文件或目录的安全上下文恢复到默认值 ```
## 命令基本用法 user:role:type:级别
## restorecon [选项] [...] ```
## 选项功能-v打印操作过程-R递归操作
## 用法举例 ### 修改安全上下文
## 添加一些网页文件到 Nginx 服务器的目录之后,为这些新文件设置正确的安全上下文。
## restorecon -R /usr/share/nginx/html/ ```bash
## 4.5 查询系统中的布尔型规则及其状态 # 修改文件上下文
## 命令基本用法 sudo chcon -t httpd_sys_content_t /var/www/html
## getsebool -a
## 由于该命令要么查询所有规则,要么只查询一个规则,所以一般都是先查询所有规则然后用 grep 筛选。 # 恢复默认上下文
## 用法举例 sudo restorecon -Rv /var/www/html
## 查询与 httpd 有关的布尔型规则。
## getsebool -a | grep httpd # 查看默认上下文规则
## 执行结果 semanage fcontext -l | grep /var/www
## httpd_anon_write --> off ```
## httpd_builtin_scripting --> on
## httpd_can_check_spam --> off ---
## httpd_can_connect_ftp --> off
## #以下省略 ## 常用管理命令
## 4.6 开关一个布尔型规则
## 命令基本用法 ```bash
## setsebool [选项] # 安装管理工具
## 选项功能-P重启依然生效 sudo yum install setroubleshoot setools
## 用法举例
## 开启 httpd_anon_write 规则。 # 查看 SELinux 布尔值
## setsebool -P httpd_anon_write on getsebool -a
## 4.7 添加目录的默认安全上下文
## 命令基本用法 # 查看特定布尔值
## semanage fcontext -a -t "(/.*)?" getsebool httpd_enable_homedirs
## 注:目录或文件的默认安全上下文可以通过 semanage fcontext -l 命令配合 grep过滤查看。
## 用法举例 # 开启布尔值
## 为 Nginx 新增一个网站目录 /usr/share/nginx/html2 之后,需要为其设置与原目录相同的默认安全上下文。 sudo setsebool -P httpd_enable_homedirs on
## semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"
## 4.8 添加某类进程允许访问的端口 # 查看端口上下文
## 命令基本用法 semanage port -l | grep http
## semanage port -a -t -p
## 注:各种服务类型所允许的端口号可以通过 semanage port -l 命令配合 grep 过滤查看。 # 添加端口到上下文
## 用法举例 sudo semanage port -a -t http_port_t -p tcp 8888
## 为 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 中。 ### 问题1Apache/Nginx 无法访问目录
## /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 ```bash
## 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' # 查看日志
## ... sudo tail -f /var/log/audit/audit.log | grep denied
## 该文件的内容很多,而且混有很多与 SELinux 错误无关的系统审计日志。我们要借助 sealert 这个实用工具来帮忙分析(如果提示找不到命令的话请安装 setroubleshoot 软件包)。
## 5.2 使用sealert分析错误 # 临时修复:关闭 SELinux
## 命令基本用法 sudo setenforce 0
## sealert -a /var/log/audit/audit.log
## 执行完命令之后,系统需要花一段时间去分析日志中的违规行为并给出分析报告。分析报告的结构讲解请看下图: # 永久修复:设置正确上下文
> 来自 <[https://blog.csdn.net/yanjun821126/article/details/80828908](https://blog.csdn.net/yanjun821126/article/details/80828908)> sudo chcon -R -t httpd_sys_content_t /var/www/html
sudo chcon -R -t httpd_sys_rw_content_t /var/www/html/uploads
```
### 问题2FTP 无法访问文件
```bash
# 开启 FTP 上下文
sudo setsebool -P ftpd_full_access on
```
### 问题3MySQL 无法访问自定义目录
```bash
# 添加 MySQL 目录上下文
sudo chcon -R -t mysqld_db_t /data/mysql
```
### 问题4SSH 密钥无法使用
```bash
# 设置 SSH 密钥上下文
sudo chcon -R -t ssh_key_t ~/.ssh
```
---
## 查看日志
```bash
# 实时查看拒绝日志
sudo tail -f /var/log/audit/audit.log | grep denied
# 查看 SELinux 消息
sudo dmesg | grep selinux
# 查看 setroubleshoot 日志
cat /var/log/messages | grep setroubleshoot
```
---
## 快速参考
```bash
# 查看状态
sestatus
# 临时关闭
sudo setenforce 0
# 查看文件上下文
ls -Z filename
# 修改上下文
sudo chcon -t httpd_sys_content_t /path
# 查看布尔值
getsebool -a | grep keyword
# 开启布尔值
sudo setsebool -P boolean_name on
```
---
> 💡 **建议**:学习使用 SELinux它能让系统更安全。但如果暂时搞不懂先用宽容模式(permissive),等需要时再深入研究。