Ubuntu Apache2环境下文件权限正常却存在写保护问题求助
解决Ubuntu Apache2下/var/www/foo目录文件写保护问题
这种情况我踩过好几次坑,常规权限排查没问题的话,肯定是隐藏的权限控制机制在搞事情,咱们一步步来定位解决:
检查文件扩展属性(最常见的元凶)
有些时候文件被加了i(不可修改)或a(仅可追加)的锁,常规chmod根本没用。执行命令查看:lsattr /var/www/foo如果看到输出里带
i或a,就用下面的命令去掉属性:# 去掉不可修改属性(目录和文件都要处理) chattr -i /var/www/foo /var/www/foo/* # 去掉仅追加属性(目录和文件都要处理) chattr -a /var/www/foo /var/www/foo/*排查ACL权限设置
常规的chown/chmod可能覆盖不了ACL的精细权限控制,用这个命令查看目录的ACL规则:getfacl /var/www/foo如果看到Apache运行用户(一般是
www-data)没有rw权限,就修正:setfacl -R -m u:www-data:rwx /var/www/foo如果想清除所有冗余的ACL规则,直接执行:
setfacl -R -b /var/www/foo确认Apache运行用户的权限
PHP是通过Apache进程执行的,所以得确保Apache的运行用户对目录有写入权。先查Apache的用户:ps aux | grep apache2通常输出里的用户是
www-data,然后修改目录和文件的归属与权限:chown -R www-data:www-data /var/www/foo # 目录设为755(允许用户读写执行,组和其他读执行) chmod -R 755 /var/www/foo # 文件设为644(允许用户读写,组和其他只读),如果需要组写入就用664 chmod -R 644 /var/www/foo/*检查AppArmor安全限制
Ubuntu默认启用的AppArmor可能会限制Apache的写入路径。先看AppArmor的状态:sudo aa-status如果看到
apache2的profile处于enforced状态,就去检查配置文件:sudo vi /etc/apparmor.d/usr.sbin.apache2看里面有没有允许访问
/var/www/foo的规则,如果没有,添加一行:/var/www/foo/** rw,保存后重新加载AppArmor:
sudo systemctl reload apparmor最后检查目录特殊权限
用ls -ld /var/www/foo看目录权限,如果末尾带t(粘滞位),虽然它主要是防止删除,但如果目录的w权限没给对也会有问题。如果是这种情况,去掉粘滞位:chmod -t /var/www/foo
先从扩展属性和ACL开始排查,这俩是最容易被忽略的“隐形权限”,一般解决这两个就能搞定问题。
内容的提问来源于stack exchange,提问作者Orun
相关产品推荐
相关产品推荐

