php禁止网页抓取(php-fpm子进程所使用的用户是什么?)

优采云 发布时间: 2021-09-27 13:09

  php禁止网页抓取(php-fpm子进程所使用的用户是什么?)

  核心总结:php-fpm子进程使用的用户不能是网站文件的所有者。任何违反此原则的行为都不符合最小特权原则。

  根据生产环境的不断反馈,发现php网站已经挂上了木马,大部分是权限设置不合理造成的。难免服务器软件或php程序存在漏洞。在这种情况下,如果Linux网站目录权限和php进程权限设置正确,那么网站的安全性其实是可以保证的。

  那么,是什么原因导致木马被链接到网站?

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

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

  在讨论这个问题之前,先解释一下文件和进程权限的几个概念:

  A、FTP用户对网站目录有最大修改权限,所以网站的文件所有者必须属于FTP。这是毋庸置疑的,不然怎么修改文件呢?

  B、php-fpm进程,nginx进程至少要有网站文件的读权限。比如下面的命令可以查看这两个进程使用的账号:

  ps aux|grep nginx

  ps aux|grep php

  我们可以发现nginx和php-fpm的子进程账号是nobody。

  让我们检查网站文件目录的权限:

  发现文件网站的所有者是www帐号,即:

  | nginx 和 php 对 网站 只有读访问权限,但没有写访问权限

  l 如果php程序需要对网站的部分文件有写权限,需要手动修改文件或目录权限为777

  l 因为php-fpm子进程以nobody运行,所以php-fpm生成的新文件的所有者也是nobody。这时候ftp用户是不能修改这些文件的,需要的人是需要解铃的人。php生成文件后,需要调用chmod("/somedir/somefile", 0777)修改文件权限为777,这样FTP用户也可以修改这个文件。

  l 经常被开发者要求重置php生成的文件的权限。

  l 如果php-fpm子进程以文件所有者网站的用户身份运行,说明php-fpm进程对整个网站目录具有可写权限,噩梦就开始了。

  但是我们发现很多系统管理员为了省事,违反了最小化Linux权限的原则,将php-fpm进程设置为文件所有者的账户下运行。当然,这对于php开发者来说可能方便(php-fpm进程对整个网站目录都有可写权限),但是这样会破坏Linux系统的文件系统权限原则,所有安全措施将毫无用处。可以想象,如果PHP程序存在漏洞,攻击者可以通过上传木马来修改网站的所有文件,网站的首页被黑也就不足为奇了。

  退一步说,如果我们设置更严格的权限,即使php程序存在漏洞,攻击者也只能篡改777权限的目录,其他文件无法改写。更安全吗?

  核心总结:php-fpm子进程使用的用户不能是网站文件的所有者。任何违反此原则的行为都不符合最小特权原则。

  看了网上关于nginx和php-fpm配置的文章教程和市面上的一些书籍,发现很多人被这些文章误导,直接让php-fpm子进程为网站所有者账号操作,例如张燕的《实用nginx替代apache的高性能web服务器》一书第52页,有如下设置:

  万维网

  万维网

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

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

  显然,本书的这一部分对初学者具有误导性。针对这个问题,我已经给本书作者发了邮件,希望他能在第二版中做一个重点说明,以免因为权限配置过于松散而造成一些问题。安全风险。

  官方配置文件中php-fpm子进程使用nobody用户,完全合理,不需要修改。

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

  将nginx.conf文件第一行设置为用户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

  位置~“^/缓存”{

  返回403;

  }

  位置 ~ ”\.php$” {

  fastcgi_pass 127.0.0.0:9000;

  ……………………

  }

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

  2.附件上传目录附件

  该目录的特点是需要开放访问权限,但所有文件都无法被php引擎解析(包括后缀为gif的木马文件)

  位置~“^/附件”{

  }

  位置 ~ ”\.php$” {

  fastcgi_pass 127.0.0.0:9000;

  ……………………

  }

  注意上面的附件目录的位置定义中没有声明。nginx 对正则表达式位置匹配的优先级最高。任何正则表达式定义的位置,只要匹配一次就不会匹配其他正则表达式定义的位置。

  现在,请在附件目录中创建一个 php 脚本文件,然后通过浏览器访问安装程序。我们发现浏览器提示下载,这意味着nginx将attachments目录下的文件当做静态文件处理,并没有交给php fastcgi进行处理。这样,即使可写目录被植入木马,网站也更安全,因为它无法执行。

  显然,重要的php配置文件不应该放在这样的目录中。

  3. 静态文件生成目录 public

  这些目录一般是php生成的静态页面的存放目录。显然,它们类似于附件目录。只需根据附件目录的权限设置它们。

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

  但是,只有开发者知道网站 可写目录的功能和权限。这方面需要php开发人员和系统管理员之间的积极沟通。我们采用的方法是:在项目上线前,开发者以文档的形式提供网站可写目录的角色和权限,系统管理员设置不同目录的权限。任何一方修改了网站的目录权限,但在文档中没有体现。我们认为这违反了工作流程

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线