内容摘要:
- 配置防盗链
- 访问控制Directory
- 访问控制FilesMatch
- 限定某个目录禁止解析php
- 限制user_agent
- php相关配置
- php扩展模块安装
- 扩展
一、配置防盗链
- 防盗链,用于防止链接被其他网站盗用导致占用服务器的流量,此时可以通过限制referer来防止链接被盗用。
- 修改httpd虚拟主机配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf ,增加以下内容:
指定网站的目录
SetEnvIfNoCase Referer "http://abc.com" local_ref 指定白名单referer
SetEnvIfNoCase Referer "http://www.abc.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref 将空referer加入白名单
定义规则(针对这些文件设置防盗链)
Order Allow,Deny order定义规则顺序,allow表示同意,deny表示拒绝。
Allow from env=local_ref
- /usr/local/apache2.4/bin/apachectl -t
- /usr/local/apache4/bin/apachectl graceful
- 使用命令curl -e参数模拟refer为http://aaa.com时拒绝方位状态码403,其中refer必须以http开头,如图:
![LAMP架构 (3)_第1张图片](http://img.e-com-net.com/image/info8/6d759c414dda49368f3616a8c399748c.png)
- 使用命令curl -e参数模拟refer为白名单中的referer时,状态码为200,可以访问,如图:
![LAMP架构 (3)_第2张图片](http://img.e-com-net.com/image/info8/20b716f263744c9ab9a9b3a3252cb236.png)
二、访问控制Directory
用于限制某些IP访问重要的目录
- 修改apache虚拟主机配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf 增加如下内容:
指定需要限制的目录
Order deny,allow Order确定执行顺序,整个语句都会执行一遍。
Deny from all 如果先deny,后allow,则会先执行deny的操作,再执行允许的动作,后面的动作会覆盖前面的操作。如果先allow,后deny all,则最后的结果会是deny。
Allow from 127.0.0.1 添加白名单IP
- usr/local/apache2.4/bin/apachectl -t
- /usr/local/apache2.4/bin/apachectl graceful
- 指向IP为127.0.0.1时显示状态码为200可以访问该目录,如图:
![LAMP架构 (3)_第3张图片](http://img.e-com-net.com/image/info8/b25ca7854625454c8765381068a6d323.png)
- 指向IP为192.168.15128时显示状态码为403,无法访问该目录如图:
![](http://img.e-com-net.com/image/info8/d304aa7807804691bd10f49517dce23b.jpg)
- 将hosts指向192.168.157.128时,使用游览器访问时,显示报错403
![LAMP架构 (3)_第4张图片](http://img.e-com-net.com/image/info8/a345b94dc97c4cc1a110db8eebe91e4e.png)
- 将hosts指向192.168.157.128时,将本地IP加入白名单,使用游览器访问显示正确。
![LAMP架构 (3)_第5张图片](http://img.e-com-net.com/image/info8/340e377b03674c07aeda8303efb9b3f5.jpg)
三、访问控制FilesMatch
针对某一个文件或者某一种文件类型来设置规则
- 修改apache虚拟主机配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf 增加如下内容:
Order deny,allow
Deny from all
Allow from 127.0.0.1
- usr/local/apache2.4/bin/apachectl -t
- /usr/local/apache2.4/bin/apachectl graceful
- 指向IP为127.0.0.1时显示状态码为404,意味可以访问只是文件没有创建不存在所以无法找到。
![LAMP架构 (3)_第6张图片](http://img.e-com-net.com/image/info8/217baf7f2095484ba788b47372598e8f.png)
- 指向IP为192.168.157.128时显示状态码为403,无法访问。
![LAMP架构 (3)_第7张图片](http://img.e-com-net.com/image/info8/1a21c18e52f34c2fb04e6166a9e05b79.png)
四、限定某个目录禁止解析php
有些目录是存放静态文件的目录,如图片目录,本身不需要允许php的解析。如果没有注意,允许了php解析,而且又开放了该目录的文件上传权限。很可能被别有用心的人利用上传木马,导致服务器被攻破。除了开发人员在程序开发过程中要注意安全的设计,也可以通过apache限制某些目录的php解析。
- 修改apache虚拟主机配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf 增加如下内容:
php_admin_flag engine off
- usr/local/apache2.4/bin/apachectl -t
- /usr/local/apache2.4/bin/apachectl graceful
- 使用命令curl测试,仅禁止解析PHP时,状态码为200,并显示源代码:
![LAMP架构 (3)_第8张图片](http://img.e-com-net.com/image/info8/2415e34ec468408993ac5bba98e96c2f.png)
- 同时禁止显示源代码,可以添加filesmatch语句,来禁止访问php文件。内容如下:
php_admin_flag engine off
添加filesmatch规则,禁止访问php的文件
Order allow,deny
Deny from all 全部拒绝
- 此时在使用命令curl测试,显示状态码403。无法解析访问php文件,不会显示源代码。如图:
![LAMP架构 (3)_第9张图片](http://img.e-com-net.com/image/info8/c92d23713f8245828dbaa06c79ac5432.png)
五、限制user_agent
有时候网站可能会遭受CC攻击,这可以通过限制user—agent来减小攻击压力
- 修改apache虚拟主机配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf 增加如下内容:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] 限制curl,baidu.com代理的访问,其中OR表示或者,NC表示忽略大小写。
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
- 需要在apache配置文件中开启rewrite模块
- 测试配置及加载配置
- usr/local/apache2.4/bin/apachectl -t
- /usr/local/apache2.4/bin/apachectl graceful
![LAMP架构 (3)_第10张图片](http://img.e-com-net.com/image/info8/70f075e9ad4a4178b0fd4cbd3d31dca6.png)
- 使用curl ,选项-A 指定user_agent为baidu.com时,也报错代码403
![LAMP架构 (3)_第11张图片](http://img.e-com-net.com/image/info8/dc659860deaf45919c288fb52ce2cf7a.png)
- 使用curl ,选项-A 指定user_agent为aming,访问正确
![LAMP架构 (3)_第12张图片](http://img.e-com-net.com/image/info8/a641f4fda62c4a15a7d16833a25e64ec.jpg)
![](http://img.e-com-net.com/image/info8/82c2ce905db846549393dd7ea250210d.jpg)
六、PHP相关配置
修改php配置文件后,都要使用apachectl测试并重新加载配置文件
- 使用命令的方式查看php配置文件(不太准确):/usr/local/php/bin/php -i|grep -i "loaded configuration file"
- 建立一个phpinfo()函数的页面来查看(最准确)
- 编辑abc.com下的index.php文件,输入以下内容:
phpinfo();
?>
- 通过游览器访问abc.com
![](http://img.e-com-net.com/image/info8/9f55784fc0264b59b5fbcef4014101a9.jpg)
- 进入对应PHP版本的源码包目录下,复制配置文件到phpinfo()指定的目录中
- 复制配置文件:cp php.ini-development /usr/local/php7/etc/php.ini
- 其中该目录下有两个php-ini的配置文件,development(开发)和production(生产)。
- 重新加载apache配置文件,后再次打开游览器访问,显示如图:
![](http://img.e-com-net.com/image/info8/7bee6231a752467bb15dfcb21554bf00.jpg)
- 修改php配置文件/usr/local/php7/etc/php.ini 在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函数后,通过游览器访问效果如下:
![](http://img.e-com-net.com/image/info8/f8fe2797b197454f90f4e976ab9fcf56.jpg)
- 在date.timezone处设置时区放置报错,如图:date.timezone =Asia/Shanghai
![](http://img.e-com-net.com/image/info8/acb370d7a5fa4f71b0fcf9587ee907d4.png)
- 不在网页上显示phpinfo等函数的报错信息(当禁止这些函数时):display_errors = Off (设置为On时显示报错):
![LAMP架构 (3)_第13张图片](http://img.e-com-net.com/image/info8/22eb60344e674248af7d3ecff6852f4e.jpg)
- 当display_errors设置为Off不在显示报错信息,所以此时需要配置一些相关的错误日志
- 开启错误日志和相关设置
- 修改php配置文件开启错误日志:log_errors = On (默认开启状态)
- 修改php配置文件设置错误日志路径:error_log =/tmp/php7_errors.log
- 修改php配置文件,定义记录日志的错误级别:error_reporting = E_ALL & ~E_NOTICE (生产环境中使用该错误等级,默认为E_ALL会记录所有的错误,但是不会记录通知和一般性的警告。)
![](http://img.e-com-net.com/image/info8/a340ac1f9e9148adb4abe506cbe3bbdd.jpg)
- 在php.ini下配置open_basedir隔离虚拟主机目录全局生效,不能细分化单独配置
- 修改php.ini文件:open_basedir= /data/wwwroot/abdc.com:/tmp 将访问限制在abdc.com和tmp目录下
- 使用curl访问测试abc.com/index.php,状态码500:
![LAMP架构 (3)_第14张图片](http://img.e-com-net.com/image/info8/c36fe0a056fe456d88de0b354f65cabd.png)
- 在apache配置文件下配置open_basedir,针对不同的虚拟主机配置,更加灵活
- 修改apache虚拟主机配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf 增加如下内容:php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp/"
- 使用curl访问测试abc.com/index.php,状态码200访问正确:
![LAMP架构 (3)_第15张图片](http://img.e-com-net.com/image/info8/35e42ad47fdc4335a65d21973e4e5de5.png)
七、PHP扩展模块安装
有时候php安装编译完成后,这时候发现缺少了一个模块,但又不想重新编译php模块,可以使用扩展模块编译。
- 查看php模块:/usr/local/php/bin/php -m
- 安装一个redis的模块:
- 移动到src目录下:cd /usr/local/src
- 下载源码包:wget https://codeload.github.com/phpredis/phpredis/zip/develop
- 变更文件名称:mv develop phpredis-develop.zip
- 解压文件:unzip phpredis-develop.zip
- 进入解压后的目录:cd phpredis-develop
- 生成configure文件:/usr/local/php/bin/phpize (可能会提示报错,缺少autoconf,使用yum安装即可)
- 生成安装目录和配置:./configure --with-php-config=/usr/local/php7/bin/php-config
- 安装编译:make && make install
- 查看扩展模块存放目录,我们可以在php.ini中去自定义该路径 :/usr/local/php7/bin/php -i |grep extension_dir
- 在php.ini配置文件中添加一行配置:extension = redis.so
- 查看模块是否加载成功:/usr/local/php7/bin/php -m | grep redis
![](http://img.e-com-net.com/image/info8/212c70f405f14b7b822f57d77003ba4d.jpg)
- 在PHP源码包ext目录下有很多的模块源码包,直接进入需要安装的模块源码包根据上面的安装方式安装即可。
八、扩展
- 使用php自带的pecl工具快速安装PHP扩展模块: /usr/local/php7/bin/pecl install redis
- Apache访问控制相关:https://coding.net/u/aminglinux/p/apache/git/blob/master/access.md?tdsourcetag=s_pcqq_aiomsgapache options参数 http://www.365mini.com/page/apache-options-directive.htm
- apache rewrite教程 http://coffeelet.blog.163.com/blog/static/13515745320115842755199或http://www.cnblogs.com/top5/archive/2009/08/12/1544098.htmlphp.ini详解 http://legolas.blog.51cto.com/2682485/493917