zoukankan      html  css  js  c++  java
  • php-fpm搭建及加固

    php-fpm安装

    nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。 nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx。

    那什么又是cgi呢?

    CGI(Common Gateway Interface)。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。

    简单的说,就是:cgi就是专门用来和web 服务器打交道的。web服务器收到用户请求,就会把请求提交给cgi程序(php的fastcgi),cgi程序根据请求提交的参数作应处理(解析php),然后输出标准的html语句返回给web服服务器,再返回给客户端,这就是普通cgi的工作原理。

    安装

    yum安装

    yum install php php-mysql php-fpm

    安装成功。

    php-fpm配置文件路径:/etc/php-fpm.d/www.conf

    php配置文件路径:/etc/php.ini

    说明:

    php-mysql,这个是后续链接mysql需要的

     

    修改php配置

    php.ini

    将 ;cgi.fix_pathinfo=1 改为 cgi.fix_pathinfo=1 只要把前面的分号去掉就可以了;

    fix_pathinfo是用来干嘛的呢?

    为CGI提供真正的PATH_INFO / PATH_TRANSLATED支持,不打开,nginx是解析不了路径的。

    www.conf

    将 user = apache group = apache

    改为 user = nginx group = nginx

     

    nginx配置php-fpm解析php请求

    注:nginx安装参考

    /etc/nginx/conf.d目录下新增php-fpm.conf,内容配置如下

    server {
        listen  80;
        server_name 192.168.189.134;
        location ~ .php$ {
              try_files $uri =404;
              root /usr/share/nginx/html;
              fastcgi_pass 127.0.0.1:9000;
              fastcgi_index index.php;
              fastcgi_param SCRIPT_FILENAME     $document_root$fastcgi_script_name;
              include fastcgi_params;
         }
    }

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    这个配置的意思是 在浏览器中访问的.php文件,实际读取的是 $document_root(网站根目录)下的.php文件 -- 也就是说当访问127.0.0.1/index.php的时候,需要读取网站根目录下面的index.php文件,如果没有配置这一配置项时,nginx不回去网站根目录下访问.php文件,所以返回空白

    SCRIPT_FILENAME这个参数在fastcgi_params也有,默认是$fastcgi_script_name,可以看出只是添加了网站根目录

     

    启动php-fpm

    开启自启动

    sudo systemctl enable php-fpm

    测试是否设置成功

    /usr/share/nginx/html目录下新建phpinfo.php文件,内容如下:

    <?php
    echo 6666666666;
    phpinfo();
    ?>

    重启nginx

    sudo systemctl restart nginx

    访问http://192.168.189.134/phpinfo.php

    可以访问,已经成功安装了。

    加固

    php-fpm降权

    修改/etc/php-fpm.d/www.conf

    将 user = apache group = apache

    改为 user = nobody group = nobody

    php启动安全模式

    PHP 环境提供的安全模式是一个非常重要的内嵌安全机制,PHP 安全模式能有效控制一些 PHP 环境中的函数(例如system()函数,官网有个列表),对大部分的文件操作函数进行权限控制,同时不允许对某些关键文件进行修改(例如 /etc/passwd)。默认的 php.ini 配置文件并没有启用安全模式

    php5.4以前的版本修改/etc/php.ini

    safe_mode = on

    php5.4就移除安全模式了,下面是官网的说明

    下面是安全模式下的功能

    用户组安全

    当您启用安全模式后,如果safe_mode_gid选项被关闭,PHP 脚本能够对文件进行访问,且相同用户组的用户也能够对该文件进行访问。

    因此,建议您将该选项设置为关闭状态:

    safe_mode_gid = off

    安全模式下执行程序主目录

    如果启用了安全模式后,想要执行某些程序的时候,可以指定需要执行程序的主目录,例如:

    safe_mode_exec_dir = /usr/bin

    一般情况下,如果不需要执行什么程序,建议您不要指定执行系统程序的目录。您可以指定一个目录,然后把需要执行的程序拷贝到这个目录即可,例如:

    safe_mode_exec_dir = /temp/cmd

    但是,更推荐您不要执行任何程序。这种情况下,只需要将执行目录指向网页目录即可:

    safe_mode_exec_dir = /usr/www

    安全模式下包含文件

    如果您需要在安全模式下包含某些公共文件,您只需要修改以下选项即可:

    safe_mode_include_dir = /usr/www/include/

    一般情况下,PHP 脚本中包含的文件都是在程序已经写好的,可以根据您的具体需要进行设置。

     

    设置 doc_root

    修改/etc/php.ini

    doc_root = /usr/share/nginx/hml/

    上图是修改后的,访问的phpinfo.php不在这个目录下,所以不被解析并访问

    查看日志,现在不能打开这个php,起到限制php的执行目录,doc_root目录以外的php无法被解析

     

    修改为正确的路径

    doc_root = /usr/share/nginx/html/

    重启pgp-fpm

    可以被解析并访问

    控制 PHP 脚本能访问的目录

    修改/etc/php.ini

    open_basedir = /usr/share/nginx/htm/

    访问的phpinfo.php不在上面的目录下,则禁止访问

    修改为正确路径则访问成功

    关闭危险函数

    如果您启用了安全模式,那么可以不需要设置函数禁止,但为了安全考虑,还是建议您进行相关设置。例如,您不希望执行包括system()等在内的执行命令的 PHP 函数,以及能够查看 PHP 信息的phpinfo()等函数,那么您可以通过以下设置禁止这些函数:

    disable_functions=phpinfo

    上面做测试禁用了phpinfo,重启php-fpm

    phpinfo.php里面使用了这个函数,我们看下是否能执行

    没有php的信息,函数被禁用了。

    关闭 PHP 版本信息在 HTTP 头中的泄露

    暴露给黑客的信息越少,攻击成功就会越高,php版本也是一样的,不知道版本就不能针对具体版本进行研究入侵了。

    修改/etc/php.ini文件如下

    expose_php=off

    重启php-fpm

    我们验证是否设置成功了,图片可看出生效了,没有了php版本信息

    错误信息控制

    display_errors = Off

    error_reporting = E_WARNING & E_ERROR

    错误日志

    一般 PHP 环境在没有连接到数据库或者其他情况下会有错误提示信息,错误信息中可能包含 PHP 脚本当前的路径信息或者查询的 SQL 语句等信息,这类信息如果暴露给黑客是不安全的,因此建议您禁止该错误提示:

    修改/etc/php.ini

    display_errors = Off
    #如果您确实要显示错误信息,一定要设置显示错误信息的级别。例如,只显示警告以上的错误信息:
    error_reporting = E_WARNING & E_ERROR

    打开错误信息提示

     

    关闭错误信息提示

     

    对比上面的错误信息,打开状态直接暴露了phpinfo.php的路径了,给黑客很好的信息了。

    关闭注册全局变量

    在 PHP 环境中提交的变量,包括使用 POST 或者 GET 命令提交的变量,都将自动注册为全局变量,能够被直接访问。这对您的服务器是非常不安全的,因此建议您将注册全局变量的选项关闭,禁止将所提交的变量注册为全局变量。

    register_globals = off

    注意: 该选项参数在 PHP 5.3 以后的版本中已被移

    防护SQL注入攻击

    php5.4以前的版本,有一个自动将进入 PHP 脚本的数据进行转义的过程。

    当打开时,所有的 '(单引号),"(双引号),**(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。这和 addslashes() 作用完全相同。最好在编码时不要转义而在运行时根据需要而转义,被称为魔术引号(Magic Quote),不过php5.4开始就被移除了.

    php5.4以前的版本修改配置/etc/php.ini

    magic_quotes_gpc = On
     

    参考资料

    https://help.aliyun.com/knowledge_detail/50218.html

    https://www.php.net/manual/zh/security.php

    http://www.ttlsa.com/safe/php-environment-security-reinforcement-configuration/

    https://cloud.tencent.com/developer/article/1042833

     

     

     

     

     

  • 相关阅读:
    [Luogu 3794]签到题IV
    [JSOI 2015]最大公约数
    [BZOJ 5123][Lydsy1712月赛]线段树的匹配
    [BZOJ 5127][Lydsy1712月赛]数据校验
    [Codeforces Educational Round 71]Div. 2
    [NOIp 2018]all
    [BZOJ 2134]单选错位
    [hihoCoder 1384]Genius ACM
    [POJ 3233]Matrix Power Series
    [USACO 09FEB]Bullcow
  • 原文地址:https://www.cnblogs.com/alummox/p/11370941.html
Copyright © 2011-2022 走看看