RedHat7 httpd环境下,SELinux强制模式允许PHP读写文件的方法
解决RedHat 7下httpd+PHP读取/写入文件的SELinux权限问题
问题背景
在RedHat 7的httpd环境中,PHP调用file_get_contents读取指定JSON文件、file_put_contents创建文件时触发"Permission denied"错误,但将SELinux设为宽容模式后操作恢复正常,说明是SELinux强制访问控制限制了进程的文件操作。以下是不关闭SELinux强制模式的解决方法:
一、让file_get_contents能读取/target/file/here/file.json
调整普通文件权限
确保目标文件及所在目录对httpd运行用户(默认是apache)具备读权限:# 给目标目录设置读、执行权限 chmod 755 /target/file/here/ # 给JSON文件设置读权限 chmod 644 /target/file/here/file.json # 可选:将文件所有者改为apache(只要其他用户有读权限也可跳过此步) chown apache:apache /target/file/here/file.json配置SELinux上下文标签
httpd默认仅允许读取带有httpd_sys_content_t标签的文件,需给目标目录及文件添加该标签:# 添加永久生效的SELinux上下文规则 semanage fcontext -a -t httpd_sys_content_t "/target/file/here(/.*)?" # 将规则应用到目录及所有子内容 restorecon -Rv /target/file/here/可通过
ls -Z /target/file/here/file.json命令验证标签是否设置成功。
二、让file_put_contents能创建new_file.json
代码中使用相对路径时,文件默认会创建在PHP脚本的当前工作目录(通常是httpd文档根目录,如/var/www/html/),需按以下步骤配置:
调整目录普通权限
确保目标目录对apache用户具备写权限:# 给目标目录添加写权限(示例目录为/var/www/html/,替换为你的实际目录) chmod 775 /var/www/html/ # 可选:将目录所有者改为apache chown apache:apache /var/www/html/配置SELinux可写上下文标签
httpd写入文件需要httpd_sys_rw_content_t标签,给目标目录添加该标签:# 添加永久生效的SELinux可写上下文规则 semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?" # 将规则应用到目录及所有子内容 restorecon -Rv /var/www/html/若你是指定绝对路径创建文件,将上述命令中的目录路径替换为对应路径即可。
额外排查步骤
- 确认SELinux处于强制模式:执行
getenforce,输出应为Enforcing - 若仍有问题,可查看SELinux审计日志定位具体限制:
tail -f /var/log/audit/audit.log | grep httpd
内容的提问来源于stack exchange,提问作者HASSANI Hamza
相关产品推荐
相关产品推荐

