1、配置防盗链
防止有人利用网站文件上传的功能,把一些静态媒体资源放到我们的网站上,然后在他们的网站上设置这些资源的链接到我们的网站上,当他们网站用户访问这些资源时,就会跳转到我们的服务器上,导致我们的服务器带宽流量异常增大。为了防止这种情况发生,我们利用apache服务器访问控制实现防盗链功能
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
data/wwwroot/111.com> //用于定义作用于哪个目录,配置防盗链,就是定义本站点
SetEnvIfNoCase Referer "http://www.111.com" local_ref //指定referer白名单
SetEnvIfNoCase Referer "http://111.com" local_ref //指定referer白名单
SetEnvIfNoCase Referer "^$" local_ref //空的referer也能访问
"\.(txt|doc|mp3|zip|rar|jpg|gif)"> //使用文件匹配访问控制,这里的filesmatch中f 和 m 可以大写可以小写
Order Allow,Deny //访问控制顺序,先允许后拒绝。
Allow from env=local_ref //只有符合白名单上的referer才能访问111.com目录。
更改后的配置文件,并将空的Referer页面为白名单 注释掉:改为# SetEnvIfNoCase Referer "^$" local_ref
检查配置文件是否有语法错误,并重新加载配置文件
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
curl -e "http://www.aminglinux.com/123.html" 自定义referer
2、访问控制Directory
公司的内部网站可以设置访问控制,指定来源IP才能够访问
Order deny,allow
Deny from all
Allow from 127.0.0.1
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
特殊性:
将代码放在防盗链代码上面,防止冲突
data/wwwroot/111.com> // 指定需要访问控制的网站的目录
Order deny,allow //访问控制的顺序,先所有都拒绝,然后再允许指定的ip。和iptables不同,可以全部规则都执行下去。
Deny from all // 拒绝所有的来源ip
Allow from 127.0.0.1 //指定允许访问的来源ip(指定网段也可以192.168.0.0/24)
[root@aminglinux 111.com]# mkdir admin
[root@aminglinux 111.com]# cd admin/
[root@aminglinux admin]# touch index.php
[root@aminglinux admin]# echo "121212">index.php
[root@aminglinux admin]# cat index.php
121212
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
限制的原 IP:curl -x127.0.0.1:80 111.com/admin/index.php -I
[root@aminglinux admin]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Sat, 30 Jun 2018 03:30:13 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Cache-Control: max-age=0
Expires: Sat, 30 Jun 2018 03:30:13 GMT
Content-Type: text/html; charset=UTF-8
更改IP测试:
[root@aminglinux admin]# curl -x192.168.222.110:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 30 Jun 2018 03:34:11 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
3、访问控制 FilesMatch
访问控制,除了目录形式,还是文件名去匹配(或链接)
核心配置文件内容
Order deny,allow
Deny from all
Allow from 127.0.0.1
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
"admin.php(.*)"> //指定需要访问控制的页面
Order deny,allow //访问控制的顺序,先所有都拒绝,然后再允许指定的ip
Deny from all // 拒绝所有的来源ip
Allow from 127.0.0.1 //指定允许访问的来源ip(指定网段也可以192.168.0.0/24)
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
测试
这里没有对admin目录做任何限制,做的FilesMatch跟这个不匹配,没有遇到控制语句,所以访问是404
[root@aminglinux admin]# curl -x192.168.222.110:80 111.com/admin/fasdfasdf -I
HTTP/1.1 404 Not Found
Date: Sat, 30 Jun 2018 04:08:20 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
有特殊符号需要用 '单引号括起来
[root@aminglinux admin]# curl -x192.168.222.110:80 'http://111.com/admin.php?fasdfasdf' -I
HTTP/1.1 403 Forbidden
Date: Sat, 30 Jun 2018 04:09:13 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
[root@aminglinux admin]# curl -x127.0.0.1:80 'http://111.com/admin.php?fasdfasdf' -I
HTTP/1.1 404 Not Found
Date: Sat, 30 Jun 2018 04:09:28 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
总结: Directory和FilesMatch 功能是一样的,只不过有时仅仅想针对一个访问的链接去做控制,那么再去控制目录则不太合适,FilesMatch可以满足一些比较个性化的需求
4、禁止php解析
应用于对静态文件目录或可写的目录进行优化设置,通过限制解析/访问权限来避免别恶意攻击,提高安全性.
编辑虚拟主机配置文件:
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
/data/wwwroot/111.com/upload>
##把upload目录下所有的php禁止解析
php_admin_flag engine off //禁止解析php
//现在这里所有访问php都会是403
##这里的 .用\脱义
Order allow,deny //如果不做这个deny,就会直接访问到源代码,这样就不太好
Deny from all
</FilesMatch>
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@aminglinux 111.com]# mkdir upload
[root@aminglinux 111.com]# cp 123.php upload/
[root@aminglinux 111.com]# ls upload/
123.php
测试
[root@aminglinux 111.com]# curl -x127.0.0.1:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Sat, 30 Jun 2018 11:39:46 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
5、限制user_agent
user_agent可以理解为浏览器标识,限制他可以防止CC攻击(用软件或者肉鸡)
ReWriteEngin on
ReWriteCond %{HTTP_USER_AGENT} .*curl+[NC,OR]
ReWriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
ReWriteRule .* -[F]
编辑虚拟主机配置文件:
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
//使用rewrite模块
ReWriteEngin on //打开模块
ReWriteCond %{HTTP_USER_AGENT} .*curl+[NC,OR] //定义条件 [NC]忽略大小写,[OR] 两个条件或匹配
ReWriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] //定义条件
ReWriteRule .* -[F] //定义规则,[F] 是禁止。
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
验证: [root@aminglinux 111.com]# curl -A “abcde” -x127.0.0.1:80 '111.com/123.php'
curl命令
curl命令是一个利用URL规则在命令行下工作的文件传输工具
6、PHP相关配置
查看php配置文件位置
查看php配置文件的位置
[root@aminglinux 111.com]# cd /usr/local/src/php-7.1.6/
[root@aminglinux php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
[root@aminglinux php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
设置PHP文件
[root@aminglinux php-7.1.6]# vim /usr/local/php7/etc/php.ini
搜索 /disable
在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
重新加载配置文件
root@aminglinux php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
打开php配置文件
定义date.timezone时区,如果不定义,有时候会有一些告警信息 display_errors = On,(On显示,Off不显示),这个意思就会把错误的信息直接显示在浏览器上,这样就会把目录给暴露出来,所以这里更改成display_errors = Off
[root@aminglinux php-7.1.6]# vim /usr/local/php7/etc/php.ini
搜索/timezone
在date.timezone定义时区
需要删除 ; 分号
date.timezone = Asia/Shanghai
搜索/display
需要删除 ; 分号
将display_errors = On更改为display_errors = Off
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
配置错误日志
搜索/log_errors,将错误日志文件打开
log_errors = On
搜索/error_log,将错误日志文件定义到tmp目录下
需要删除 ; 分号
error_log = /tmp/php_errors.log
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@aminglinux php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php
[root@aminglinux php-7.1.6]# ls /tmp/
mysql.sock systemd-private-84395be6ac6e40bfad6b9456aa2e32d3-chronyd.service-kz6jjS
pear systemd-private-84395be6ac6e40bfad6b9456aa2e32d3-vgauthd.service-pM2iTz
php_errors.log systemd-private-84395be6ac6e40bfad6b9456aa2e32d3-vmtoolsd.service-cXzXg9
[root@aminglinux php-7.1.6]#
[root@aminglinux php-7.1.6]# ps aux |grep httpd
root 1422 0.0 1.4 257488 14356 ? Ss 6月30 0:05 /usr/local/apache2.4/bin/httpd -k start
daemon 3629 0.0 1.7 611964 17484 ? Sl 01:16 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 3630 0.0 1.3 544316 13176 ? Sl 01:16 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 3631 0.0 1.5 611964 15488 ? Sl 01:16 0:00 /usr/local/apache2.4/bin/httpd -k start
root 3725 0.0 0.0 112720 984 pts/0 S+ 01:20 0:00 grep --color=auto httpd
[root@aminglinux php-7.1.6]#
[root@aminglinux php-7.1.6]# grep error_log /usr/local/php7/etc/php.ini
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
error_log = /tmp/php_errors.log
;error_log = syslog
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@aminglinux php-7.1.6]# touch /tmp/php_errors.log ; chmod 777 /tmp/php_errors.log
- 可以先创建好/tmp/php_errors.log文件,然后赋予chmod 777权限
查看文件日志
[root@aminglinux php-7.1.6]# cat /tmp/php_errors.log //会告诉你因为安全的原因,这个函数已经被禁掉了
[30-Jun-2018 17:16:27 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /usr/local/apache2.4/htdocs/index.php on line 2
[30-Jun-2018 17:16:32 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /usr/local/apache2.4/htdocs/index.php on line 2
安全相关的参数
一台服务器上,运行了多个站点,有一台服务器假如代码有问题,结果这个站点被黑客攻击了,被黑客拿到了权限,黑客拿了权限肯定会继续往里渗透,继续往里渗透,就会有可能渗透到其他的站点,同时导致其他的站点被黑
open_basedir,它是一个安全选项,限制不能串岗
php.ini文件中的内容是针对所有虚拟主机进行的配置!!!
打开配置文件 vim /usr/local/php7/etc/php.ini
[root@aminglinux php-7.1.6]# vim /usr/local/php7/etc/php.ini
搜索/open_basedir,并上删除 ; 号
open_basedir = /data/wwwroot/111.com:/tmp
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
再来访问,会显示正常
[root@aminglinux php-7.1.6]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/" 添加open_basedir
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@aminglinux ~]# /usr/local/apache2.4/bin/apachectl graceful
7、PHP扩展模块安装
在php安装编译完成后,这时候发现缺少了一个模块,但又无法重新编译php模块,那就使用扩展模块编译
[root@aminglinux php-7.1.6]# cd /usr/local/src
[root@aminglinux src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop
--2018-07-01 01:57:20-- https://codeload.github.com/phpredis/phpredis/zip/develop
正在解析主机 codeload.github.com (codeload.github.com)... 13.229.189.0, 13.250.162.133, 54.251.140.56
正在连接 codeload.github.com (codeload.github.com)|13.229.189.0|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:未指定 [application/zip]
正在保存至: “develop”
[ <=> ] 239,183 16.8KB/s 用时 13s
2018-07-01 01:57:37 (17.9 KB/s) - “develop” 已保存 [239183]
[root@aminglinux src]#
更改包的名称
[root@aminglinux src]# mv develop phpredis-develop.zip
[root@aminglinux src]# ls
apr-1.6.3 httpd-2.4.29.tar.gz php-7.1.6
apr-1.6.3.tar.gz mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz php-7.1.6.tar.bz2
apr-util-1.6.1 mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz phpredis-develop.zip
apr-util-1.6.1.tar.bz2 php-5.6.30
httpd-2.4.29 php-5.6.30.tar.gz
解压,查看解压包
[root@aminglinux src]# unzip phpredis-develop.zip
root@aminglinux src]# ls
apr-1.6.3 httpd-2.4.29.tar.gz php-7.1.6
apr-1.6.3.tar.gz mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz php-7.1.6.tar.bz2
apr-util-1.6.1 mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz phpredis-develop
apr-util-1.6.1.tar.bz2 php-5.6.30 phpredis-develop.zip
httpd-2.4.29 php-5.6.30.tar.gz
切换到phpredis-develop包下面
[root@aminglinux src]# cd phpredis-develop/
[root@aminglinux phpredis-develop]#
编译方法有些特殊,需要先做phpize的操作,目的是为了生成configure文件——>因为编译一个源码包,必须要先有configure,否则是无法去配置的
[root@aminglinux phpredis-develop]# /usr/local/php7/bin/phpize //生成configure文件
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
[root@aminglinux phpredis-develop]# yum install -y autoconf
然后再去生成configure文件
[root@aminglinux phpredis-develop]# /usr/local/php7/bin/phpize
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
[root@aminglinux phpredis-develop]#./configure --with-php-config=/usr/local/php7/bin/php-config
[root@aminglinux phpredis-develop]#make
[root@aminglinux phpredis-develop]#make install
Installing shared extensions: /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
[root@aminglinux phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/opcache.so redis.so
[root@aminglinux phpredis-develop]# /usr/local/php7/bin/php -m |grep redis
[root@aminglinux phpredis-develop]# /usr/local/php7/bin/php -i |grep extension_dir
extension_dir => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303 => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303
sqlite3.extension_dir => no value => no value
[root@aminglinux phpredis-develop]# vim /usr/local/php7/etc/php.ini
可以将配置的一行放在文件最后面,也可以搜索/extension,放到相关的下面
extension = redis.so
查看是否有redis模块,会看到已经加载了
[root@aminglinux phpredis-develop]# /usr/local/php7/bin/php -m |grep redis
redis
另外一种方法快速安装redis.so模块 /usr/local/php7/bin/pecl install redis
[root@aminglinux phpredis-develop]# /usr/local/php7/bin/pecl install redis
关于扩展板块
[root@aminglinux phpredis-develop]# cd /usr/local/src/php-7.1.6/ext/
[root@aminglinux ext]# ls
bcmath ext_skel interbase opcache pdo_sqlite skeleton tokenizer
bz2 ext_skel_win32.php intl openssl pgsql snmp wddx
calendar fileinfo json pcntl phar soap xml
com_dotnet filter ldap pcre posix sockets xmlreader
ctype ftp libxml pdo pspell spl xmlrpc
curl gd mbstring pdo_dblib readline sqlite3 xmlwriter
date gettext mcrypt pdo_firebird recode standard xsl
dba gmp mysqli pdo_mysql reflection sysvmsg zip
dom hash mysqlnd pdo_oci session sysvsem zlib
enchant iconv oci8 pdo_odbc shmop sysvshm
exif imap
增加zip扩展模块
编译zip模块进入到zip目录下,并查看
[root@aminglinux ext]# /usr/local/php7/bin/php -m |grep zip
[root@aminglinux ext]# cd zip/
[root@aminglinux zip]# ls
config.m4 CREDITS lib php_zip.c tests zip_stream.c
config.w32 examples LICENSE_libzip php_zip.h TODO
[root@aminglinux zip]# /usr/local/php7/bin/phpize
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
[root@aminglinux zip]#./configure --with-php-config=/usr/local/php7/bin/php-config
[root@aminglinux zip]#make
[root@aminglinux zip]# make install
Installing shared extensions: /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
[root@aminglinux zip]#
再去查看会看到zip模块的出现
[root@aminglinux zip]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so redis.so zip.so