Linux文件系统只读挂载但文件仍被修改_排查_解决方法_运维笔记
Linux的文件权限系统是网站安全防护的重要手段,但很多站长对权限的理解停留在chmod命令层面,以为设置了444就万无一失。实际上,root用户可以修改任何文件,chattr属性可以被root解除,文件系统可以被重新挂载为可写,进程可以通过文件描述符修改已经打开的文件。了解这些绕过方式,才能有针对性地加固防护。
第四种原因是通过已打开的文件描述符修改。Linux中,文件权限检查是在open()系统调用时进行的,如果一个进程在文件还是可写的时候打开了它,获得了可写的文件描述符,之后即使文件被设置为只读,这个进程仍然可以通过已有的文件描述符写入数据。这种情况常见于Web服务器进程,它在启动时打开了日志文件或缓存文件,之后文件被设置为只读,但进程仍然可以写入。解决方法是设置文件只读之后重启相关进程,让进程重新打开文件时权限检查生效。
第一种常见原因是root用户或具有同等权限的进程修改了文件。Linux的权限检查对root用户无效,root可以读写任何文件,无论权限设置为多少。如果攻击者通过漏洞获取了root权限,或者网站运行在root用户下(这是非常危险的配置),那么只读权限形同虚设。解决方法是确保网站运行在普通用户下,不要使用root启动Web服务,同时严格限制root登录方式,使用密钥登录并禁用密码登录。
排查只读文件被修改的第一步是确认修改方式。使用stat命令查看文件的修改时间(mtime)、属性改变时间(ctime)、访问时间(atime)。如果ctime发生了变化,说明文件的权限或属性被修改过,可能是chmod或chattr操作。使用lsattr查看文件的扩展属性,确认i属性是否还在。使用auditctl配置文件审计规则,记录对该文件的所有操作,包括打开、修改、属性变更,这样下次被修改时就能知道是哪个进程、哪个用户做的。
第二步是检查系统是否被入侵。查看最近的登录记录(last命令),检查是否有陌生IP登录。查看secure或auth.log日志,搜索Accepted password或Accepted publickey,确认是否有异常登录。查看crontab定时任务,是否有可疑的定时任务。查看进程列表(ps aux),是否有陌生进程在运行。查看网络连接(netstat -anp或ss -tlnp),是否有异常的出站连接。这些检查可以帮助判断服务器是否已经被完全控制。
彻底解决只读文件被修改的问题,需要从多个层面加固。第一,用户权限隔离:Web服务运行在普通用户下,网站文件所有者与Web运行用户不同,Web用户只有读取权限,只有upload和cache目录有写入权限。这样即使网站被入侵,攻击者也只能在有限的目录内操作,无法修改程序文件。
真实经历:有个服务器的文件设置了只读,但日志显示文件每小时被修改一次,排查后发现是一个定时任务在运行,这个任务在文件可写时打开了文件描述符,之后文件设为只读但任务仍能写入。杀掉这个进程并重启后问题解决。这个案例说明只读权限不是即时生效的,已打开的文件描述符不受影响。
安全提示:如果发现只读文件被修改,很可能服务器已经被入侵且攻击者获得了较高权限。这时候不要只修改文件权限就完事,需要全面排查系统安全,清除后门。如果不确定是否清除干净,最稳妥的方案是备份数据后重装系统,从干净的环境重新部署。

更新时间:2026-09-02 15:24:30
上一篇:网站CDN回源502 Bad Gateway_常见错误配置纠正_性能优化与预防_实用教程