0511 LAMP架构(三)
一、配置Apache防盗链

Apache防盗链定义:指不让别人盗用你网站上的资源,这个资源指的是图片、视频、歌曲、文档等,在这之前需要理解一下referer的概念,如果你通过A网站的一个页面http://a.com/a.html里面的链接去访问B网站的一个页面http://b.com/b.html,那么这个B网站页面的referer就是http://a.com/a.html。也就是说,一个referer就是一个网址。
1、进入主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
2、修改以下配置内容
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref // 定义允许访问链接的referer
SetEnvIfNoCase Referer "http://ask.apelearn.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref //把空referer设为白名单,即直接访问的地址
<FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny //白名单地址allow,其他deny
Allow from env=local_ref // 白名单为local_ref对应的地址
</FilesMatch>
</Directory>
3、检测重启
/usr/local/apache2.4/bin/apachectl -t //更改配置后,需要检查配置语法
Syntax OK
/usr/local/apache2.4/bin/apachectl graceful //重启httpd
4、使用qq.png进行测试

HTTP/1.1 403 Forbridden //定义refer为qq,此为禁止refe
HTTP/1.1 200 OK //定义refer为111.com,可以访问
二、Apache访问控制
1、访问控制Directory(目录)

(1)进入虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
(2)修改配置文件内容
<Directory /data/wwwroot/111.com/admin> //增加admin目录
Order deny,allow //按先拒绝,再允许执行
Deny from all //拒绝所有
Allow from 127.0.0.1 //允许ip
</Directory>
(3)添加测试的必要文件
ls123.php 1.jpg 1.txt ceshi.png index.php
mkdir admin //在111.com下创建admin目录
touch admin/index.php //在admin下创建index.php文件
echo "qeqe2222" >> admin/index.php
cat !$
cat admin/index.php
qeqe2222
检测并重启虚拟主机配置文件
(4)访问测试
curl -x127.0.0.1:80 111.com/admin/index.php -I //可以正常访问
HTTP/1.1 200 OK
curl -x127.0.0.1:80 111.com/admin/index.php //能够输出
qeqe2222
curl -x127.0.0.1:80 http://111.com/admin/asdsf -I
HTTP/1.1 404 Not Found //404代表允许访问,此页面没有
2、访问控制FilesMatch(文件匹配)

(1)进入虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
(2)修改配置文件内容
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com 2111.com.cn
<Directory /data/wwwroot/111.com> //在111.com目录下
<Filesmatch admin.php(.*)> //文件匹配admin.php后面跟任意的字符
Order deny,allow
Deny from all
Allow from 127.0.0.1 //只允许127.0.0.1访问
</Filesmatch>
</Directory>
(3)在满足admin.php 条件下,不同IP进行访问测试
curl -x192.168.112.136:80 'http://111.com/admin.php#aaaaaaaaaaaa' -I //满足admin.php
HTTP/1.1 403 Forbidden //因为只允许IP:127.0.0.1访问
curl -x127.0.0.1:80 'http://111.com/admin.php#aaaaaaaaaaaa' -I //加上单引号,是因为有特殊符号#
HTTP/1.1 404 Not Found //能够连接,但是无此页面
3、限定某个目录禁止解析php
情况示例:有这样一种情况,有些站点和论坛是允许上传图片到服务器,他们上传一些php文件或者js到服务器,然后被我们执行加载,从而对数据造成威胁。为了避免这种事情的发生,我们需要限制上传类型。

(1)编辑虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
(2)修改配置文件内容
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com2111.com.cn
<Directory /data/wwwroot/111.com/upload> //在111.com定义upload目录
php_admin_flag engine off //禁止php解析,所有访问都报403错误
<FilesMatch (.*)\.php(.*)> // .php 前后匹配任意字符
Order deny,allow //按禁止,允许执行
Deny from all //禁止全部
(3)创建测试文件
创建目录,并把123.php复制到upload,并重启配置
mkdir upload
ls123.php 1.jpg 1.txt admin ceshi.png index.php upload
cp 123.php upload/
/usr/local/apache2.4/bin/apachectl -t
Syntax OK
/usr/local/apache2.4/bin/apachectl graceful
(4)再进行测试,则禁止解析php
curl -x127.0.0.1:80 http://111.com/upload/123.php -I
HTTP/1.1 403 Forbidden
(5)再进行配置,在FilesMatch部分加上#号不执行
#<FilesMatch (.*)\.php(.*)> // .php 前后匹配任意字符
# Order deny,allow //按禁止,允许执行
# Deny from all //禁止全部
#</Filesmatch>
(6)重启配置测试,也无法解析php,只能输出源码
curl -x127.0.0.1:80 http://111.com/upload/123.php //不能够解析PHP,只能输出源代码
<?php
echo "123.php";
因此为了安全,我们可以设置让其根本不能访问php(匹配.php),不给其解析机会;
4、限制user_agent
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

(1)进入虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
(2)修改配置文件内容
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com 2111.com.cn
<IfModule mod_rewrite.c>
RewriteEngine on //
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //匹配curl,不区分大小写,或者
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
(3)使用curl直接访问111.com目录下的123.php
curl -x127.0.0.1:80 http://111.com/123.php -I
HTTP/1.1 403 Forbidden //禁止访问
(4)使用curl -A指定user_agent的值
curl -A "123456" -x127.0.0.1:80 http://111.com/123.php -I //指定user_agent为123456
HTTP/1.1 200 OK //可以访问
(5)调用访问日志;可以看出user_agent为"curl/7.29.0"

user_agent为"curl/7.29.0" 匹配配置文件,因此禁止访问;而用curl -A指定user_agent的值,则状态码为200;
三、PHP相关配置
1、php的配置文件
试验准备工作;在111.com下,编辑index.php内容
cd /data/wwwroot/111.com
ls
123.php 1.jpg 1.txt admin ceshi.png index.php upload
vim index.php
<?php
phpinfo();
此时我们在浏览器上访问index.php, 发现** Loaded Configuration File**没有加载

此时把php.ini-development文件,复制到/usr/local/php7/etc/php.ini
cp php.ini-development /usr/local/php7/etc/php.ini
重新加载后,再用浏览器上访问index.php,此时** Loaded Configuration File**已经加载

2、危险函数的禁用
(1)编辑/usr/local/php7/etc/php.ini配置文件
vim /usr/local/php7/etc/php.ini
(2)比较危险的函数示例

(3)在php.ini配置文件中搜索 disable_functions
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
(4)再次访问已被禁用,phpinfo也已被禁用

(5)虽然不能访问了,但是它却在页面上显示错误信息; 为了不让其显示错误信息,需要将配置文件vim /usr/local/php7/etc/php.ini中的display_errors = off //把on改为off
/usr/local/apache2.4/bin/apachectl graceful //重新加载

3、设置php错误日志
虽然免除了危险,但是对于我们管理员来说,这个页面不友好,无法判断此页面错误原因;此时需要设置错误日志。
(1)再次打开php.ini配置文件vim /usr/local/php7/etc/php.ini,log_errors = On //需要执行,且为on,error_log = /tmp/php_errors.log //定义错误日志目录
(2)设置error_reporting 错误级别,搜索error_reporting
error_reporting = E_ALL //默认为E_ALL,
error_reporting = E_ALL & ~E_NOTICE //在生产环境中,最常用的就是这个!有时候出现notice并不是出错,但却会记录日志。
(3)加载重启配置
curl -A "Q" -x127.0.0.1:80 http://111.com/index.php //继续访问,肯定没有输出
ls /tmp/php_errors.log //但是此时有我们设置的错误日志出现
/tmp/php_errors.log
(4)查看错误日志权限ls -l /tmp/php_errors.log
-rw-r--r-- 1 daemon daemon 1350 7月 2 11:02 /tmp/php_errors.log
(5)查看php错误日志
cat /tmp/php_errors.log
PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
4、open_basedir配置
如果有一台服务器跑了很多个站点,其中就有一个站的程序写的很烂,漏洞百出,很容易被黑,一旦该站点被黑,整个服务器就会沦陷,其它站点同样也会被黑。为了防止这样的事情发生,需要对open_basedir进行配置。
(1)在php配置文件中设置open_basedir
在php配置文件中,把111.com故意写成1111.com
vim /usr/local/php/etc/php.ini
open_basedir = /data/wwwroot/1111.com:/tmp
(2)重启配置,测试
/usr/local/apache2.4/bin/apachectl -t
Syntax OK
/usr/local/apache2.4/bin/apachectl graceful
(3)访问2.php
curl -A "Q" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error //出现500状态码
查看错误日志:php_errors.log
PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
(4)在php配置文件中,把错误的目录1111.com改为111.com
curl -A "Q" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
(5)针对不同的虚拟主机限定不同的open_basedir
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加两行配置

重新配置
/usr/local/apache2.4/bin/apachectl -t
Syntax OK
/usr/local/apache2.4/bin/apachectl graceful
重新访问成功:
curl -A "Q" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.1 200 OK
四、PHP扩展模块安装
1、下载模块包安装
cd /usr/local/src/
wget https://codeload.github.com/phpredis/phpredis/zip/develop
改名,解压包
mv develop phpredis-develop.zip //更改名称[root@ying01 src]# unzip phpredis-develop.zip //解压,
2、使其生成configure 文件
cd phpredis-develop/
/usr/local/php7/bin/phpize 提示缺少包,安装:yum install -y autoconf

安装完缺少的包以后,继续执行
/usr/local/php7/bin/phpize

3、编辑配置
./configure --with-php-config=/usr/local/php7/bin/php-config
make
make install
4、查看扩展模块存放目录
/usr/local/php7/bin/php -i |grep extension_dir
extension_dir => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303 => /usr/local/ph
sqlite3.extension_dir => no value => no value
5、目录为空,此时在php.ini加载一条扩展语句
vim /usr/local/php7/etc/php.ini
将redis.so添加至末尾

6、此时查看存放扩展模块的目录,发现有刚才配置的 redis.so模块
/usr/local/php7/bin/php -m |grep redis
redis
7、编译自带的PHP源码包
php7的源码包中,有很多自带的源码包。我们不需要再次下载,直接编译即可!在php-7.1.6/etc目录下有很多目录
cd /usr/local/src/php-7.1.6/
cd ext/
ls

(1)现在编译一个模块 zip
cd zip/ //进入zip模块
/usr/local/php7/bin/phpize

(2)配置编译安装
./configure --with-php-config=/usr/local/php7/bin/php-config
make
make install
(3)查看目录,此时已有zip.so模块
ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so redis.so zip.so
2263

被折叠的 条评论
为什么被折叠?



