# CentOS7 SELinux 配置 > 安全增强型 Linux (Security-Enhanced Linux) --- ## 简介 SELinux 是 Linux 内核的安全模块,实现**最小权限原则**。 - 即使程序以 root 运行,也受 SELinux 策略限制 - 限制进程只能访问其需要的资源 - 防止漏洞被利用后"为所欲为" --- ## 工作模式 | 模式 | 说明 | |------|------| | **Enforcing** | 强制模式,违规行为被阻止并记录 | | **Permissive** | 宽容模式,违规行为仅记录 | | **Disabled** | 关闭 SELinux | --- ## 查看状态 ```bash # 查看当前模式 getenforce # 详细状态 sestatus # 查看版本 selinuxenabled && echo "Enabled" || echo "Disabled" ``` --- ## 临时切换模式 ```bash # 切换到强制模式 sudo setenforce 1 # 切换到宽容模式 sudo setenforce 0 ``` > ⚠️ 需要安装 `setroubleshoot` 并启用 `auditd` 服务 --- ## 永久配置 编辑 `/etc/selinux/config`: ```bash sudo vim /etc/selinux/config ``` ```ini SELINUX=enforcing # 强制模式 # SELINUX=permissive # 宽容模式 # SELINUX=disabled # 关闭 SELINUXTYPE=targeted # 目标策略 ``` 修改后需要重启系统。 --- ## 安全上下文 ### 查看安全上下文 ```bash # 查看文件/目录上下文 ls -Z /etc/hosts # 查看进程上下文 ps auxZ | grep nginx # 查看用户的上下文 id -Z ``` ### 安全上下文格式 ``` user:role:type:级别 ``` ### 修改安全上下文 ```bash # 修改文件上下文 sudo chcon -t httpd_sys_content_t /var/www/html # 恢复默认上下文 sudo restorecon -Rv /var/www/html # 查看默认上下文规则 semanage fcontext -l | grep /var/www ``` --- ## 常用管理命令 ```bash # 安装管理工具 sudo yum install setroubleshoot setools # 查看 SELinux 布尔值 getsebool -a # 查看特定布尔值 getsebool httpd_enable_homedirs # 开启布尔值 sudo setsebool -P httpd_enable_homedirs on # 查看端口上下文 semanage port -l | grep http # 添加端口到上下文 sudo semanage port -a -t http_port_t -p tcp 8888 ``` --- ## 常见问题处理 ### 问题1:Apache/Nginx 无法访问目录 ```bash # 查看日志 sudo tail -f /var/log/audit/audit.log | grep denied # 临时修复:关闭 SELinux sudo setenforce 0 # 永久修复:设置正确上下文 sudo chcon -R -t httpd_sys_content_t /var/www/html sudo chcon -R -t httpd_sys_rw_content_t /var/www/html/uploads ``` ### 问题2:FTP 无法访问文件 ```bash # 开启 FTP 上下文 sudo setsebool -P ftpd_full_access on ``` ### 问题3:MySQL 无法访问自定义目录 ```bash # 添加 MySQL 目录上下文 sudo chcon -R -t mysqld_db_t /data/mysql ``` ### 问题4:SSH 密钥无法使用 ```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),等需要时再深入研究。