把文件的权限改为“与其它文件相同”
chcon -v system_u:object_r:systemd_unit_file_t:s0 xxx.service
安装 semanage 等管理工具
dnf install policycoreutils-python-utils. # CentOS 8 yum install policycoreutils-python # CentOS 7
查看 SELinux 的工作状态
sestatus getenforce setenforce 0 # 临时禁用(重启自动恢复)
恢复被服务商禁用的 SELinux
vim /etc/sysconfig/selinux SELINUX=enforcing # 要先使用 `setenforce 1` 保证能通过 ssh 登录系统再重启以启用配置; # 如果重启了而「更改的新 ssh 端口不被 selinux 允许」那就不能远程进系统了(默认的 21 通常已被 SELinux 允许);
查看 sshd 使用的端口
semanage port -l | grep ssh # ssh_port_t tcp 2222, 22
为 sshd 添加一个 2222 端口
semanage port -a -t ssh_port_t -p tcp 2222 # 如需删除把 -a 换成 -d 。如果端口已经分配到其它地方,可以把 -a 换成 -m
查看最近的 AVC 拒绝日志(有无被阻止)
ausearch -m avc -ts recent
为 Web 项目配置权限
执行这2行后即使你不懂 SELinux 也不用关闭 SELinux 了,如果是 Tomcat 把 httpd_sys_content_t 换成 tomcat_var_lib_t
# 假设 Web 项目在 /data/web/ 中
semanage fcontext -a -t httpd_sys_content_t '/data/web(/.*)?'
restorecon -RvvF /data/web
# 如果不是 httpd_sys_content_t 可通过 ls -lZ /usr/share/nginx/html 查找
# 查看(确认)目录的 SELinux 权限用下边这行:
semanage fcontext -l | grep /data/web
# 启用 file_get_contents('https://...') 功能
setsebool -P httpd_can_network_connect on
# 其它
sestatus -b | grep httpd_can_network_connect
sestatus -b | grep httpd_unified
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_unified 1
为 MySQL 配置权限
# 假设 mysql 的 datadir=/data/mysql semanage fcontext -a -t mysqld_db_t '/data/mysql(/.*)?' restorecon -RvvF /data/mysql # 如果不是 mysqld_db_t 可通过 ls -lZ /var/lib/mysql 查找
变更权限
# 临时: chcon -t tomcat_var_lib_t -R /data # 永久为(下边两条): semanage fcontext -a -t tomcat_var_lib_t "/data(/.*)?" restorecon -Rv /data/
查看 7100 端口的用途
semanage port -l | grep 7100 # xfs_port_t tcp 7100
把 7100 端口也给 shhd 用
semanage port -m -t ssh_port_t -p tcp 7100 # $ semanage port -l | grep 7100 # ssh_port_t tcp 7100, 2222, 22 # xfs_port_t tcp 7100 # 原来使用 7100 的 _t 并不会删除这个端口
查看整理过的 SELinux 日志
yum install setroubleshoot sealert -a /var/log/audit/audit.log > ~/selinux.log
查看安全上下文
ls -Z fileOrFolder # 查看文件的安全上下文 ps -eZ # 查看进程的安全上下文
根据日志生成例外规则
audit2allow -a -c systemd-sysctl -M systemd_sysctl_cap # 仅提取 systemd-sysctl 相关的审计日志生成规则 semodule -i systemd_sysctl_cap.pp # 加载模块(永久生效) # .te 纯文本策略源码(由 audit2allow 生成) --> .mod 中间字节码 --> .pp 策略包,可加载的模块 checkmodule -M -m -o systemd_sysctl_cap.mod systemd_sysctl_cap.te semodule_package -o systemd_sysctl_cap.pp -m systemd_sysctl_cap.mod
解决装了宝塔面板后 SELinux 无法 enforcing 的问题
用 # 注释掉以下文件中的 setenforce 0,每个文件都只有1处:
/www/server/panel/class/firewalls.py public.ExecShell('setenforce 0')
/www/server/panel/class/firewall_new.py public.ExecShell('setenforce 0');
/www/server/panel/class/safeModel/sshModel.py public.ExecShell('setenforce 0')
/usr/lib/systemd/system/monitor.service ExecStartPre=-/usr/sbin/setenforce 0
# monitor.service --> Baota Site Monitor Service
# 最后:删除编译后的 pyc 文件(避免面板加载旧缓存)
rm -f /www/server/panel/class/__pycache__/firewalls.cpython-37.pyc
排查开机就想关 SELinux 的脚本
# 1. 检查 rc.local(系统启动最后执行的脚本) cat /etc/rc.d/rc.local | grep -i "setenforce" grep -r "setenforce 0" /etc/rc.d/ /etc/init.d/ # 搜索所有启动脚本 # 2. 检查面板启动脚本(以宝塔为例) grep -r "setenforce 0" /www/server/panel/ /etc/init.d/bt # 宝塔相关脚本 grep -r "setenforce 0" /usr/lib/systemd/system/ # 系统服务单元文件 # 3. 检查 cron 启动任务(罕见,但可能存在) crontab -l | grep -i "setenforce" grep -r "setenforce 0" /etc/cron.d/ /etc/cron.hourly/ # 4. auditd 是 SELinux 日志审计服务,若启动失败,可能导致 SELinux 模式加载异常 systemctl status auditd
若找不到原因,创建 SELinux 模式锁定文件强制系统启动时使用 enforcing 模式(该文件会让 SELinux 无视 setenforce 的临时切换优先使用配置的强制模式):
# 1. 锁定 SELinux 为 enforcing 模式(创建模式文件) echo "enforcing" > /etc/selinux/enforce # 2. 确保文件权限正确 chmod 644 /etc/selinux/enforce chown root:root /etc/selinux/enforce # 3. 验证文件内容 cat /etc/selinux/enforce # 输出 enforcing
重置 SELinux 到初始状态
# 1. 重新安装 SELinux 核心组件 yum reinstall -y selinux-policy selinux-policy-targeted policycoreutils openssh-server # 2. 重置 SELinux 上下文和策略 fixfiles -F relabel # 重新标记所有文件(耗时很长) # 3. 重启 reboot