LAMP架构(八)

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

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

一、编辑配置文件程序员

    在配置文件中加入如下内容shell

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

二、从新加载配置文件apache

    # /usr/local/apache2.4/bin/apachectl -t浏览器

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

三、测试验证服务器

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

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

    下面将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地址)那么黑客就能够逍遥法外了

一、编辑配置文件

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

<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>

二、从新加载配置文件

三、测试验证

    # 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相关配置

一、如何查看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

二、编辑修改配置文件

    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

相关文章
相关标签/搜索