LAMP架构(八)

一 限定某个目录禁止解析php

对于使用PHP语言编写的网站,有一些目录是有需求上传文件的,比如服务器可以上传图片,并且没有做防盗链,所以就会被人家当成了一个图片存储服务器,并且盗用带宽流量。如果网站代码有漏洞,让黑客上传了一个用PHP代码写的木马,由于网站可以执行PHP程序,最终会让黑客拿到服务器权限,为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析PHP代码(不用担心会影响网站访问,若这种目录也需要解析PHP,那说明程序员不合格)

1、编辑配置文件

    在配置文件中加入以下内容

    <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off   //关闭php解析功能
        <filesmatch (.*)\.php(.*)>     //filesmatch这四行限定了禁止访问.php后缀名的文件
            Order allow,deny
            deny from all
        </filesmatch>
    </Directory>

2、重新加载配置文件

    # /usr/local/apache2.4/bin/apachectl -t

    # /usr/local/apache2.4/bin/apachectl graceful

3、测试验证

    # curl -x127.0.0.1:80 'http://111.com/upload/123.php' -I

结果表明http://111.com/upload/123.php被禁止访问,状态码403

    下面将filesmatch四行注释后

    我们再来测试

    # curl -x127.0.0.1:80 'http://111.com/upload/123.php'

可以看出返回的结果是源代码,也不能解析

二 限制user_agent

    需求背景:有时候,网站会受到一种攻击,叫做cc攻击,cc攻击的原理是攻击者通过软件、肉鸡等手段组织成千上万台服务器来同时访问同一个网站,由于网站带宽不支持、数据库承受不了等原因导致网站崩溃,这种访问看起来是正常的,但他们有一个规律的特点,就是user_agent是一致的,且频率很快,可能1秒钟访问几次,同时访问的地址也是一致的;面对这种情况,我们可以做一个限制,限制这个user_agent的访问为403

肉鸡: 黑客=A  被黑客控制的机器=B  黑客通过B最终黑了的机器=C  B就是肉鸡(不是“肉机”)  为什么要通过B来黑C(肉鸡)呢?因为这样C就以为是B黑的他,(因为C只能知道B的IP地址)那么黑客就可以逍遥法外了

1、编辑配置文件

    在配置文件中加入以下代码:

<IfModule mod_rewrite.c>  //此处用到了rewrite模块

    RewriteEngine on

    RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]  //此处的OR表示这一行的条件跟下一行的条件是或的关系,如果不加OR,则默认二者为与的关系

    RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]  //NC表示忽略大小写

    RewriteRule .* - [F]  //F表示forbbiden的意思

</IfModule>

2、重新加载配置文件

3、测试验证

    # curl -x127.0.0.1:80 'http://111.com/upload/123.php'  结果提示403禁止访问

上面两次的访问日志如下

我们自定义一个user_agent进一步测试

    # curl -A "lijie" -x127.0.0.1:80 'http://111.com/index.php' -I

或# curl -A "lijie" -x127.0.0.1:80 'http://111.com/index.php'   //其中-A “lijie”表示指定user_agent为lijie

我们再来查看访问日志

三 php相关配置

1、如何查看php配置文件的位置

    # /usr/local/php/bin/php -i |grep -i "loaded configuration file"  //使用这个命令可能存在部分情况下查询结果不准确

    为此,我们可以在网站目录下写一个查看phpinfo()的页面,然后再浏览器输入这个页面的地址来查看php配置文件的路径,查看结果如下:

    上图我们可以看到php的配置文件在路径/usr/local/php/etc下,但并没有加载,因此我们需要做一些操作:

    1)从模板配置文件拷贝一份到生产环境配置文件路径下

            #  cp /usr/local/src/php-5.6.30/php.ini-production /usr/local/php/etc/php.ini
    2)重新加载apache配置文件

            # /usr/local/apache2.4/bin/apachectl graceful

    3)刷新111.com/index.php页面

    上述两种方式查找到php配置文件所在的路径为/usr/local/php/etc/php.ini

2、编辑修改配置文件

    1)disable_functions

        禁用安全函数,相关的有:

        eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close;phpinfo

    编辑以禁用跟安全有关的函数,修改前:

        修改后:

其中phpinfo也需要禁用

重新加载配置文件后,刷新之前的页面,出现如下提示:

    上图说明phpinfo被成功禁用

    2)date.timezone

        时区,配置文件中需要定义这个时区,有时候不定义时区会出现告警信息

    修改前:

修改后:

也可以将时区的值设置为Asia/Shanghai

    3)php日志相关配置

    display_errors: 表示是否呈现错误信息,将其值由off修改为on后,访问111.com就会提示错误信息

    但这样有一个缺点是暴露了项目的目录,因此一般默认设置为off关闭错误信息显示功能,而一旦将display_errors设置为off的话,就还需要定义几个错误日志:

    log_errors:定义错误日志是否开启

    error_log:定义错误日志的位置

    修改前:

    修改后:

error_reporting:定义错误日志的级别

修改前:

其中:

E_ALL (Show all errors, warnings and notices including coding standards.)最不严谨

生产环境中一般使用E_ALL & ~E_NOTICE  (Show all errors, except for notices),表示显示所有错误,除了警告

修改后:

保存配置并重新加载后,我们尝试访问111.com/index.php,然后查看错误日志的目录,可以看到已经生产错误日志文件php_errors.log

再来查看这个文件的所属主和所属组,对比下面两图发现,httpd和php_errors.log的所属主和所属组是一样的,实际上这个错误日志文件是以httpd这个进程的身份去生成的

如果一直没有生成错误日志的文件,需要去查看一下错误日志的目录是否写了权限,如果有权限,我们可以先手动创建好这个错误日志的文件,并修改权限为777

下面我们模拟错误并查看错误日志,写一个带有错误的文件2.php并访问

再来查看错误日志,出现下面提示:

另外还有几个安全相关的选项:

open_basedir :打开这个选项后,可以将服务器的各个网站单独隔离出来,以防其中某个网站被黑后,其他网站或服务器的其他目录被黑客获取到权限从而遭受攻击

修改前:

修改后:

如果我们先将open_basedir的值放一个错误的目录,再来访问111.com下的目录时会报500错误代码,下图中的2.php内容已经修改正确

查看错误日志有如下提示:

现在我们来将open_basedir的值修改正确,访问就正常了

上面的实验中是将open_basedir限定在/data/wwwroot/目录下的,但是我们现在网站代码都是在这个目录下,达不到隔离网站的目的,因此我们需要针对网站的单独的一个站点来做open_basedir ,但是在php.ini是针对所有的站点的,此时我们只能在虚拟主机配置文件httpd_vhost.conf中来限定了.

php_admin_value这个参数可以定义php.ini里面的一些参数,比如error_log 、error_reporting,我们可以在虚拟主机配置文件中对单个虚拟主机使用这个参数来定义上面的open_basedir

    php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"  

    php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"

上图命令中不限制/tmp/目录的原因是如果上传图片的话,是会先放在/tmp/这个临时文件夹下的,如果把/tmp/给限制为不能访问,就不能上传图片了。

推荐链接

apache开启压缩 http://ask.apelearn.com/question/5528

apache2.2到2.4配置文件变更 http://ask.apelearn.com/question/7292

apache options参数 http://ask.apelearn.com/question/1051

apache禁止trace或track防止xss http://ask.apelearn.com/question/1045

apache 配置https 支持ssl http://ask.apelearn.com/question/1029

猜你喜欢

转载自my.oschina.net/u/3746774/blog/1630618