热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正确设置网站文件所有者防止php网站被挂木马

根据生产环境不断反馈,发现不断有php网站被挂木马,绝大部分原因是因为权限设置不合理造成。因为服务器软件,或是php程序中存在漏洞都是难免的,在这种情况下,如果能正确设置Linux网站目录权限,php进程权限,那么网站的安全性实际上是可以得到保障的。

核心总结:php-fpm/apache 进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。


根据生产环境不断反馈,发现不断有 php网站被挂木马,绝大部分原因是因为权限设置不合理造成。因为服务器软件,或是 php
程序中存在漏洞都是难免的,在这种情况下,如果能正确设置 Linux 网站目录权限, php 进程权限,那么网站的安全性实际上是可以得到保障的。


那么,造成网站被挂木马的原因是什么?


1.  ftp 连接信息被破解,对这个原因,可行的办法就是使用非常复杂的FTP 用户名(不要使用常用的用户名),如果是固定作业,可考虑使用
iptables 防火墙限制来源 IP 。但是一些情景下,可能需要使用 VPN 以便远程维护。 即网站维护者需要使用 FTP
修改网站文件时,必须先登录到IDC机房的VPN 服务器上,再进行后续的操作。


2.  网站服务器软件/ 配置 /php 程序存在漏洞,被利用。


在讨论这个问题前,先说明文件及进程权限的几个概念:


A.  FTP用户对网站目录具有最大修改权限,那么网站的文件所有者一定属于 FTP,  这是毋庸置疑的 ,  否则如何修改文件呢?


B.  php-fpm/apache/nginx 进程对网站文件至少需要有读取权限,例如,以下命令即可查看这两个进程所使用的账号:


正确设置网站文件所有者 防止php网站被挂木马


正确设置网站文件所有者 防止php网站被挂木马


通过上图,我们可以发现,nginx 和 php-fpm 子进程账号是 nobody 。


我们再查看网站文件目录的权限:


正确设置网站文件所有者 防止php网站被挂木马


发现网站文件所有者是www 账号,那说明:


◆ nginx和 php 对网站只有读取权限,无写入权限


◆ 如果php 程序需要对网站某些文件有写入权限,需要手工将文件或目录权限修改为 777


◆ 因为php-fpm 子进程是以 nobody 运行,那么 php-fpm 生成的新文件所有者也是 nobody,  这时 ftp
用户将无法修改这些文件,解铃还需系铃人,当 php 生成文件后,需要调用 chmod("/somedir/somefile", 0777) 将文件权限修改为
777 ,以便 FTP 用户也可以修改这个文件。


◆ 经常有开发人员找我请求重设php 生成的文件的权限。


◆ 如果php-fpm/apache/nginx进程以网站文件所有者用户运行,那意味着 php-fpm/apache/nginx
进程对整个网站目录具有可写权限,噩梦也就由此开始。


但是我们发现,有不少系统管理员为了省事,违背了Linux 最小化权限的原则,设置 php-fpm/apache/nginx
进程以网站文件所有者账号运行,当然这样可能会方便 php 开发人员( php-fpm 进程对整个网站目录具有可写权限),但是这样一来, Linux
体系的文件系统权限原则将被打破,所有的安全措施将形同虚设。可以想象的是,万一 php
程序中有漏洞,攻击者上传木马,便可以修改网站的所有文件,网站首页被黑,也就不足为怪了。


退一步,如果我们设置了较严格的权限,就算php 程序中存在漏洞,那么攻击者也只能篡改权限为 777
的目录,其它的文件是无法被改写的,网站不就就得更安全了吗?


核心总结:php-fpm/apache/nginx进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。


经过我参阅网上关于nginx, php-fpm 配置的文章教程和市面上的一些书籍,发现有不少人受这些文章的误导,直接让
php-fpm/apache/nginx进程以网站所有者账号运行,例如张宴的《实战 nginx  取代 apache 的高性能 Web 服务器》一书的 52
页中,存在以下设置:

  1. "user">www
  2. "group">www

而在第50 页,设置网站文件所有者也为 www 用户:

			
  1. chown -R www:www /data0/htdocs/blog

显然,此书的这部分内部,对初学者有误导,针对这个问题,我已经向本书作者发邮件,希望其能在第二版中进行强调声明,以免由于过度宽松的权限配置,造成一些安全隐患。


官方提供的配置文件中,php-fpm 子进程使用 nobody 用户,这完全是合理的,无须修改。


那么nginx 的子进程用户,如何设置合理? 我的建议是也使用 nobody (对错误日志写入等无影响),设置方法如下:


nginx.conf文件第一行设置为 user nobody; ,  再执行 nginx -s reload 即可。


php-fpm子进程用户设置方法:


编辑文件php-fpm.conf (一般位于 /usr/local/php/etc/php-fpm.conf,  视安装参数为准),找到 user 、
group 两个参数的定义,将其设置为nobody( 默认已经是 nobody) ,再重启 php-fpm 进程即可。


网站可写目录的特殊注意


这里的可写,是相对php-fpm 子进程而言。一个网站最容易出安全问题的即是可写目录,如果可写目录权限能控制严格,安全系数也将大大提高。


我们认为,一个网站可写目录主要分为以下几种:


1.  php 数据缓存目录,如 discuz 的 forumdata 目录,就存放了大量数据缓存文件。此类目录一般会禁止用户直接访问,但是 discuz
在这个目录下又存放了不少 js, css 文件,我们并不能简单地拒绝用户访问这个目录。显然,这个目录下的所有文件,不能直接交给 php
解析,我们后面会给出解决方案。


2.  附件上传目录。显然此类目录需要开启访问,但不能交由php 引擎解析(即这个目录下的所有文件均视为普通静态文件)。


3.  静态文件生成目录,这类目录下的文件全部应视为静态文件。


4.  日志目录, 一般都会拒绝用户直接访问之。


也就是说对网站开发人员而言,需要对可写目录实现动静分离,不同性能的文件,应该区别对待之,这样也就方便系统管理员,设置合理的nginx
规则,以提高安全性。


简单地去掉php 文件的执行权限,并不能阻止 php-fpm 进程解析之。


接下来,根据以上总结,系统管理员如何配置nginx 的目录规则,才更安全呢?


1、数据缓存目录 /cache/


这个目录的特点是需要777 权限,无须提供给用户访问,那么可以按以下参考配置 nginx

			
  1. location ~ "^/cache" {
  2. return 403;
  3. }
  4. location ~ "\.php$" {
  5. fastcgi_pass 127.0.0.0:9000;
  6. ....................
  7. }

这时,任何用户将无法访问/cache/ 目录内容,即使


2、附件上传目录  attachments


此目录的特点是需要开放访问权限,但所有文件不能由php 引擎解析(包括后缀名改为 gif 的木马文件)

												
  1. location ~ "^/attachments" {
  2. }
  3. location ~ "\.php$" {
  4. fastcgi_pass 127.0.0.0:9000;
  5. ....................
  6. }

注意,上面对attachments 目录的 location 定义中是没有任何语句的。 nginx 对正则表达式的 location
匹配优先级最高,任何一个用正则表达式定义的 location,  只要匹配一次,将不会再匹配其它正则表达式定义的 location 。


现在,请在attachments 目录下建立一个 php 脚本文件,再通过浏览器访问安,我们发现浏览器提示下载,这说明 nginx 把
attachments 目录下的文件当成静态文件处理,并没有交给 php fastcgi
处理。这样即使可写目录被植入木马,但因为其无法被执行,网站也就更安全了。


显然,重要的php 配置文件,请勿放在此类目录下。


3、静态文件生成目录 public


这些目录一般都是php 生成的静态页的保存目录,显然与附件目录有类似之处,按附件目录的权限设置即可。


可以预见的是,如果我们设置了较严格的权限,即使网站php 程序存在漏洞,木马脚本也只能被写入到权限为 777
的目录中去,如果配合上述严格的目录权限控制,木马也无法被触发运行,整个系统的安全性显然会有显著的提高。


但是网站可写目录的作用及权限,只有开发人员最为清楚。这方面需要php
开发人员和系统管理员积极沟通。我们使用的方式是:项目上线前,开发人员根据以文档形式提供网站可写目录的作用及权限,由系统管理员针对不同目录进行权限设置。任何一方修改了网站目录权限,但未体现到文档中,我们认为是违反工作流程的。

 


推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
author-avatar
mobiledu2502905343
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有