Skip to content

SELinux 排错

RHEL 系默认开着 SELinux。多数「明明权限对了却 Permission denied」都是它干的。

先确认是不是它

bash
getenforce               # Enforcing / Permissive / Disabled

临时切成 Permissive 测一下,问题消失就是 SELinux:

bash
setenforce 0
# 测完记得切回来
setenforce 1

不要图省事永久关掉,多数问题一条命令就能修。

看它拦了什么

bash
ausearch -m avc -ts recent
# 或者
grep denied /var/log/audit/audit.log | tail

最常见的两类

文件上下文不对

比如手动往 /root/.ssh/ 里放了 authorized_keys,或者从别处复制了网站文件过来,标签跟目录不匹配。

bash
ls -Z /root/.ssh/                    # 看当前标签
restorecon -Rv /root/.ssh            # 恢复成目录应有的标签
restorecon -Rv /var/www/html

restorecon 是万能第一招,改完密钥登录不上、nginx 读不到文件,先跑它。

端口没登记

nginx 要监听一个非标准端口,SELinux 会拦:

bash
semanage port -l | grep http_port_t          # 看已允许的
semanage port -a -t http_port_t -p tcp 8443  # 加一个

semanagepolicycoreutils-python-utils 包里。

布尔开关

有些行为是开关控制的,比如允许 nginx 发起对外连接(反代必需):

bash
getsebool -a | grep httpd
setsebool -P httpd_can_network_connect 1

-P 是永久。

容器

Docker 挂载目录进容器时加 :z:Z 后缀,Docker 会自动打标签:

yaml
volumes:
  - ./data:/data:z

:z 允许多个容器共享,:Z 只给这一个容器用。

个人笔记,写给未来忘事的自己。