这是2016年~2017年10月我所用的阿里云ECS的运维技术记录集合,主要是基于centos6.5/7.2,LAMP、LNMP与WordPress的个人维护记录集,适合新人参考。

备案与建站

在空间搭建一些常见的网站程序并不是难事,至少对WordPress和Disuz!来说是这样的,毕竟我从11年开始就一直用各种各样的免费、收费(国外或香港)的虚拟主机建站,有关这些年来网络建站空间的内容我会写在另一篇文章里。这一篇主要谈谈这次使用“服务器”建站以及域名备案的经历。

最初有这个念头的时候是因为上大学后一直想把技术小组再搞起来,恰好邮箱里收到了阿里云“云翼计划”相关的宣传,ECS服务器仅9.9元/月,就一鼓作气进行了学生认证,买了2年的专版ECS和域名,开始着手新站点的搭建。

域名备案

域名备案总体来说是较为容易的,只要按照备案系统的提示去做就行:从阿里云备案系统上传一些认证资料,该填的内容都填了,就可以直接提交管局了(内蒙这边并没有要求邮寄资料),管局审批也比较快,本站域名大概用了17天,备案就下来了。

建站

阿里云ECS服务器,虽然我个人感觉称它为vps更恰当一些,但速度和稳定性上是真的不错的,不过由于之前并没有怎么接触过Linux,对网站搭建有些难上手。加上自己也没太多时间操作,整个建站过程用了1个星期。

1.基于Ubuntu搭建lamp环境

Ubuntu搭建lamp环境相比centos简单一些,按照网上教程一步一步来就行,不过在实际操作当中MySQL的安装总是出错,网上这好像也是普遍问题,就果断换centos了。

这里给一个Ubuntu搭建lamp的教程:http://www.cnblogs.com/chenzhou851025/archive/2012/12/15/2818860.html

2.基于centos搭建lnmp环境以及安装wdcp面板

centos6.5 64位,官方有相关的搭建教程,虽然相比Ubuntu来说更麻烦一些,不过经过2次搭建也算搭建成功了。至于搭建wdcp面板也基本没什么大碍,但相对的又出现一个问题:虽然通过wdcp面板可以很简单的搭建WordPress,但要经常维护以避免一些安全问题,虽然阿里云ECS以及进行了安全设置,但安全问题主要还是由使用者造成的,所以尝试第三种方法搭建了。

官方centos搭建lnmp教程:https://help.aliyun.com/knowledge_detail/7605569.html?spm=5176.788314854.2.6.r1dc8w

3.基于阿里云镜像一站式搭建WordPress

阿里云镜像市场对于小白站长来说是很有帮助的,至少大多数所需程序的镜像都有,价格也不贵,而且提供官方售后!这一点很重要。购买WordPress镜像之后从管理控制台更换系统就OK了,之后链接ECS,用指令获取ftp、MySQL、PHPmyadmin等权限账号和密码。

官方教程:https://help.aliyun.com/document_detail/ecs/quick-start-for-linux/examples.html?spm=5176.product8314827_ecs.6.135.mK0DES

基础优化

建站之后只对程序作了优化:WordPress禁用谷歌字体,删除没用的插件,源代码优化、权限设置等等,网站cdn加速,ECS带宽扩展一类的准备以后做。关于这部分就具体问题具体分析了,网上有大量的专项教程可供参考。

ECS无法发送邮件的解决

检查sendmail服务是否运行

连接主机之后输入

1
ps aux | grep sendmail

结果显示没有,从阿里云的官方帮助文档上看这个服务要后期安装,这样基本上就好说了,毕竟自己现在也在自学Linux。输入

1
yum -y install sendmail  

安装 sendmail服务,等出现Complete!就说明安装成功了,接下来要让服务运行,输入

1
service sendmail start

成功运行会显示

1
2
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]

之后再输入

1
ps aux | grep sendmail

用于检测是否正常运行,正常运行会显示

1
2
3
root 8571 0.0 0.2 87436 2720 ? Ss 19:20 0:00 sendmail: accepting connections
smmsp 8581 0.0 0.2 78896 2140 ? Ss 19:20 0:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
root 8604 0.0 0.0 103256 832 pts/0 S+ 19:24 0:00 grep sendmail

更改主机名为0page.org

1
hostname 0page.org

发送测试邮件到我的邮箱

1
2
3
echo “testmail” | mail -s test 1073512358@qq.com

echo $?

登录邮箱发现邮件已收到,但是回到WordPress测试发送邮件仍然收不到,这时候从论坛上找到了解决方法,让sendmail服务自动运行,输入

1
ed /etc/rc.local

增加一句

1
/etc/init.d/sendmail start

之后保存,退出,即输入

1
2
3
w

q

这个时候再回到WordPress测试一下能不能发送邮件,成功发送。不过被列入垃圾邮件了,但起码能发送了,问题得以解决。

2016/5月漏洞修复

首先是5月5日,CVE-2016-3714漏洞被爆出,即ImageMagick的高危漏洞(CVE-2016-3714),引用阿里云的邮件描述是此漏洞允许攻击者通过上传恶意构造的图像文件,在目标服务器执行任意代码。黑客可利用此类漏洞盗取权限窃取数据。由于ImageMagick应用十分广泛,目前已确定Wordpress等知名应用受此漏洞影响。 所以5月6日一早花了15分钟去修复这个漏洞。
修复方法为更新到最新版即可,首先通过putty连接到Linux主机上,之后下载ImageMagick。即输入

1
wget ftp://ftp.imagemagick.org/pub/ImageMagick/linux/CentOS/x86_64/ImageMagick-7.0.1-1.x86_64.rpm

然后安装,输入

1
rpm -Uvh ImageMagick-7.0.1-1.x86_64.rpm

1
yum install ImageMagick

这样就算成功修复漏洞了,毕竟是旧版本的0day。

然而就在第二天,阿里云又紧急给我发邮件说另一个漏洞被爆出,FFmpeg 2.x远程文件读取漏洞,还是攻击者上传构造的hls切片索引文件进行攻击。我查了一下这台机子,没有发现有安装FFmpeg。

来简单分析一下这些漏洞,攻击操作都是上传!!这一点很重要。简单的说只要开放了 上传权限就可以被人利用这个漏洞进行攻击。然而,以本站为例,并不开放评论权限,更别说游客的上传权限了。那么要利用这个漏洞就只能拿下权限账号,然而这就又回到了社工类的问题。或者考虑旁注,亦或是使用这个版本WordPress的漏洞,可是在高权限限制的情况下,外加较为系统的维护,这种方法很难成功,更何况这是个小站!

那么,可以考虑一下大众化的情况,通过关键字利用搜索引擎大面积扫这种站(不一定是WordPress,只要是使用ImageMagick的都算),之后选择开放权限的,然后…这让我想起了某个论坛,使用垃圾空间,主机上200+站,自身漏洞还不少,轻松抓包改包….

当然,回归这个漏洞使用的问题,严格限制权限和积极维护好站点是完全没问题的。就像当年啊D的D盾被攻破的漏洞利用一样,必须是在获得高权限的条件下才能进行,所以安全问题,永远都是人的问题。

阿里云官方对此一直在宣传自己的新产品——云盾web防火墙,另外知道创宇等团队也在第一时间为自身产品推出了应对方法,至于低成本的一些不怎么靠谱的站长就呵呵了。

————————————————————————————————–2016.8.30更新

最新的修复方式为,将/wp-includes/media.php文件中

1
$implementations = apply_filters( ‘wp_image_editors’, array( ‘WP_Image_Editor_Imagick’ , ‘WP_Image_Editor_GD’ ) );

改为

1
$implementations = apply_filters( ‘wp_image_editors’, array( ‘WP_Image_Editor_GD’ ,’WP_Image_Editor_Imagick’ ) );

网站无法评论的解决方法

WordPress的主题,也是折腾的一个环节,除了各种页面调试,有时候也会有一些因为代码缺失或者内容冲突导致的问题。昨天一个博主Charlotte 给我发邮件说我博客的评论系统有bug,无法评论。一开始以为是后台设置有问题,结果自己重新查看,并测试了一下是评论无法计入数据库导致的。具体显示为提交评论,会显示错误:请填写必填项目(如用户名和电子邮件)…

从网上找了一下这个问题的解决方法但是居然没有相关记录..所以只能自己解决了,一般来说数据库不可能出问题,只能是主题代码的一些问题导致的,所以也没有急着用FTP查看网站文件的代码,先在后台编辑看了一下,果然发现了问题所在:编辑主题-评论(comments.php),里面<form>…</form>表单属性有缺失,问题代码为

1
<form role=”form” action=”<?php echo get_option(‘siteurl’); ?>/wp-comments-post.php” method=”post” id=”comment-form”>

很明显后面缺了 name=”” 这个内容,补上:

1
<form role=”form” action=”<?php echo get_option(‘siteurl’); ?>/wp-comments-post.php” method=”post” id=”comment-form” name=”comment-form”>

之后保存,回去重新测试,评论系统恢复正常,问题解决…然而又过了一段时间,还是有读者反应说无法评论,不过我测试成功了呀..原来是以管理员身份测试然并卵,只能重新找问题的原因了。终于,在评论页面表单的下面,有这样2句代码

1
2
3
4
5
6
<div class=”form-group”>
<input type=”text” class=”form-control” id=”comment-author” placeholder=”名字” name=”author”>
</div>
<div class=”form-group”>
<input type=”text” class=”form-control” id=”comment-email” placeholder=”Email” name=”email” >
</div>

很明显和之前那个表单一样,都没有name这一项!!(我改了表单居然没看到这里…晕),加上就好了,改为

1
2
3
4
5
6
<div class=”form-group”>
<input type=”text” class=”form-control” id=”comment-author” placeholder=”名字” name=”author”>
</div>
<div class=”form-group”>
<input type=”text” class=”form-control” id=”comment-email” placeholder=”Email” name=”email”>
</div>

之后退出登录以游客身份来提交评论,成功2333~

曲折的伪静态设置

机子是Apache2,我用putty连接主机改了httpd.conf,确认开启了伪静态模块。之后重启了Apache。.htaccess文件也加了伪静态代码并且上传到网站根目录,后台固定连接改为

1
/%category%/%post_id%.html

之后刷新,点击…呵呵!!

明明都是按步骤来的,我之后又全部重新检查一遍都没问题,还是不能伪静态,真是醉了。。。。

最后重新查,尝试性的开启了DocumentRoot的AllowOverride

.htaccess文件内改为

1
2
3
4
5
6
7
8
9
10
# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

终于成功了

主题被玩坏了之后的抢救+优化….

今天主要是来解决一下评论问题,就是之前因为添加某段代码①,导致新人第一次在本站评论会显示无法评论….当然这个主题我也是很喜欢的,毕竟用了这么久…

那么,删除了那段代码,结果就错误500了…随之开始抢救:

1.用FTP连接主机,/wp-content/themes/目录下给主题改名,随后再进来就可以正常访问了

2.到仪表盘更换主题

3.用FTP查看,发现functions.php并没有问题,但是恢复主题文件名之后,站点依然是无法访问….无奈,直接从原主题的copy了个functions.php,用FTP替换原有的,问题解决….

之后就是要优化了,主要是针对垃圾评论…(这也是之前那段代码的作用)

最后从WordPress大学找到了这段代码,应该可以用,反正我这也是小站….

1
2
3
4
5
6
7
8
9
/* refused spam */  
function refused_spam_comments( $comment_data ) {
$pattern = '/[一-龥]/u';
if(!preg_match($pattern,$comment_data['comment_content'])) {
wp_die('评论必须含中文!');
}
return( $comment_data );
}
add_filter('preprocess_comment','refused_spam_comments');

至于那段①代码,也是从NYUN那边copy的,实际效果还好啦….

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function v7v3_en($comment) {
$pattern = '/[一-龥]/u';
$cau=$comment['comment_author'] ;
$cem=$comment['comment_author_email'] ;
global $wpdb;
$ok_to_comment = $wpdb->get_var("SELECT comment_approved FROM $wpdb->comments WHERE comment_author = '$cau' AND comment_author_email = '$cem' and comment_approved = '1' LIMIT 1");
if( is_user_logged_in() || 1 == $ok_to_comment ){ return $comment; }
elseif ( !preg_match_all($pattern, $ccontent, $match) ) {
exit('
<head><meta http-equiv="Content-Type" content="text/html; charset=utf8"/></head>
初次评论不允许纯英文哦~<a href="javascript:history.go(-1);">向上一页</a>');
}
}
add_filter('preprocess_comment', 'v7v3_en');
function v7v3_comment_post( $incoming_comment ) {
$http = '/[<|KTV|ッ|の|ン|優|業|グ|貿|]/u';
if(preg_match($http, $incoming_comment['comment_content'])) {
wp_die( "
<head><meta http-equiv='Content-Type' content='text/html; charset=utf8'/></head>
您的评论包含敏感关键词,被系统判断为垃圾评论!<a href='javascript:history.go(-1);'>向上一页</a>" );
}
return( $incoming_comment );
}
add_filter('preprocess_comment', 'v7v3_comment_post');

关于FTP抽风的解决…

本来想给博客换几个图的,结果日常用的FileZilla居然无法连接到FTP!!这之前明明都好好的…
难道是我主机出问题了??但是不可能呀,于是用putty连接,上去查了一下,命令如下:

1
2
3
rpm -qa|grep vsftpd

service vsftpd status

都显示正常…于是又重启了一下FTP,可是依然无法连接…
网上说这似乎要开启FTP的主动模式…好麻烦呀(copy百度上的介绍,反正我是绝对不会用的)

主动模式的FTP工作原理:客户端从一个任意的非特权端口N连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:

  • 1、 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)
  • 2、 FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)
  • 3、 FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
  • 4、 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)

这里再说一下重新安装vsftpd…
查看vsftpd版本:

1
rpm -qa|grep vsftpd

之后卸载:

1
rpm -e vsftpd-xxxx版本

卸载时要备份原先的用户文件:

1
2
warning: /etc/vsftpd/vsftpd.conf saved as /etc/vsftpd/vsftpd.conf.rpmsave
warning: /etc/vsftpd/user_list saved as /etc/vsftpd/user_list.rpmsave

删除上面的文件

1
rm -rf /etc/vsftpd

查看vsftpd是否还在开机启动项中

1
chkconfig --list

查看vsftpd运行状态

1
service vsftpd status

若返回:vsftpd: unrecognized service 则说明卸载了vsftpd了

之后安装vsftpd,这个就不多说了,也可以自选一些版本…简单的说就是安装一下…

1
yum -y install vsftpd

关于配置vsftpd…这个不具体说了,默认的配置一般是无需再更改的,就是手动添加一下自启,以防万一

具体如下:

1
chkconfig --add vsftpd

开启开机启动

1
chkconfig --level 35 vsftpd on

重新查看vsftpd再启动项列表中的情况

1
chkconfig --list

结果如下:

1
vsftpd          0:off   1:off   2:off   3:on    4:off   5:on    6:off

到此,安装配置完毕,重新启动vsftpd服务

1
service vsftpd restart

设置到此结束。

、关于FTP的安装与调试,详细参考阿里云官方教程。

Apache虚拟主机设置

找到根目录下httpd.conf文件,打开并将

1
#Virtual hosts

下的

1
#Include conf/extra/httpd-vhosts.conf

前面的#去掉,开启了httpd-vhosts虚拟主机文件。
在hosts文件中增加IP 127.0.0.2 ,并且更改对应的域名..
然后….重启Apache
在httpd-vhosts.conf设置如下…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<VirtualHost 127.0.0.1:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot “目录”
ServerName 9bie.org
ServerAlias blog.9bie.org
ErrorLog “logs/dummy-host.example.com-error_log”
CustomLog “logs/dummy-host.example.com-access_log” common
</VirtualHost><VirtualHost 127.0.0.2:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot “目录”
ServerName www.0page.cn
ServerAlias 0page.cn
ErrorLog “logs/dummy-host2.example.com-error_log”
CustomLog “logs/dummy-host2.example.com-access_log” common
DirectoryIndex index.html index.php
<Directory “目录”>
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
</VirtualHost>

结果很呵呵!!!

解决方法:
2个

1
<VirtualHost></VirtualHost>

设置之间都加入下面设置,之后重启Apache即可

1
2
3
4
5
6
<Directory “目录”>
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>

2017/1月漏洞修复总结

1.mageMagick压缩TIFF图片远程代码执行漏洞(CVE-2016-8707)

解决方法是升级到ImageMagick最新版本(官方给出的是7.0.4-3版本),我以我的centos6.5为例,首先下载新版文件的rpm包

1
wget http://www.imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-7.0.4-3.x86_64.rpm

之后安装

1
yum install ImageMagick

这样漏洞就解决了23333

2.wordpress后台插件更新模块任意目录遍历导致DOS漏洞

这个漏洞文件路径为/yjdata/www/www/wp-admin/includes/ajax-actions.php

实际上WordPress4.6.1及以上版本已经解决了这个漏洞,之前我是懒得改2333…所以今天升级4.7版本就OK了。

当然也有4.5.4版本的解决方案:编辑/wp-admin/includes/ajax-actions.php

找到

1
$plugin = urldecode( $_POST['plugin'] );

在其后面添加

1
$plugin = plugin_basename( sanitize_text_field( wp_unslash( $_POST['plugin'] ) ) );

对于4.5.4以下版本的解决方案,除了上述,还要在/wp-admin/includes/ajax-actions.php中,找到

1
2
3
4
5
6
7
8
9
10
if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
$status['error'] = $wp_filesystem->errors->get_error_message();
}
wp_send_json_error( $status );
} else {
// An unhandled error occured
$status['error'] = __( 'Plugin update failed.' );
wp_send_json_error( $status );
}
}

修改为

1
2
3
4
5
6
7
8
9
10
if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
$status['error'] = $wp_filesystem->errors->get_error_message();
}
wp_send_json_error( $status );
} else {
// An unhandled error occured
$status['error'] = __( 'Plugin update failed.' );
wp_send_json_error( $status );
}
}

还要将

1
2
3
if ( $plugin_update_data === true ) {
wp_send_json_error( $status );
}

修改为

1
2
3
4
if ( $plugin_update_data === true ) {
$status['error'] = __( 'Plugin update failed.' );
wp_send_json_error( $status );
}

所以讲道理升级到最新版就OK了,何必这么费事…..

3.WordPress IP验证不当漏洞

这个漏洞搞不清它的危险性,因为我这种小站就算SSRF攻击也毫无意义啊!!这个漏洞早在8月份就有修复但是没有记录下来,这里补上…

找到wp-includes/http.php,找到这条代码

1
$same_host = strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );

修改为

1
2
3
if (isset($parsed_home['host'])) {
$same_host = (strtolower($parsed_home['host']) === strtolower($parsed_url['host']) || 'localhost' === strtolower($parsed_url['host']));} else {
$same_host = false;};

另外要看看这段代码

1
if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]

如果是这样就说明没问题,但老版本WordPress没有最后那个

1
|| 0 === $parts[0]

需要手动补上
到此,漏洞修复完毕

关于WordPress文章摘要字数与字体问题

升级了WordPress4.7,感觉和之前版本有很大不同!当然换了新版本,还是要改一下文章摘要代码的,我也习惯了这种方法:

修改formating.php,找到

1
$excerpt_length = apply_filters( 'excerpt_length', 55 );

将55改成想要的数值即可

可是我根据这种方法,利用winscp第一次修改完居然错误500了!!而且网上找不到解决方案…后来一想可能是formating.php出了问题,就拿4.5.3版本的备份文件换了一下,好了…但是却无法显示♂这样的字符!!这是什么鬼?

这里我检查了一下,发现应该下载下来编辑的formating.php并没有找到,也就是说最初winscp传输并不成功,导致文件缺失….

可是依然没有找到解决方法,所以重新换了文件,这下可以正常显示了…重新操作修改数值,发现数值更改之后依然不能显示♂这样的字符,也许是新版本在这方面改动较大…考虑到之前的情况,准备换一种方法

修改主题functions.php文件

加入

1
2
3
4
5
function chinese_excerpt($text, $lenth=100) {
$text = mb_substr($text,0, $lenth);
return $text;
}
add_filter('the_excerpt', ' chinese_excerpt ');

但是显示依然有问题…原来是这个要安装服务器打开php mb_string扩展,操作如下:

找到php.ini文件,将;extension=mbstring.so 前的;去掉即可,并重启服务器(Apache)

但是有的并不是这样,可以参考这篇文章进行设置linux系统下php安装mbstring扩展的二种方法

这样就OK了,但是♂依然是怎么说呢,图片….但是后来查了一下WordPress4.6版本开始使用原生字体,中文Windows系统下,Segoe UI字体将会退回到微软雅黑或者宋体…所以这就不足为奇了

所以要恢复的字符的话,应该去看看字体…

centos6.5+Apache的ssl配置

使用阿里云的免费证书,系统自动生成。由于我的网站一整套服务都是从阿里云购买的,域名备案之后使用云解析,在记录证书的时候可以自己记录,所以这一部分就跳过了。直接进入设置部分,我的是centos6.5+Apache。

申请到证书之后自动做了txt记录,所以下载证书,之后创建一个cert目录于Apache安装目录之下,把下载下来的证书文件都放上去,然后开始做配置,这个配置是对于Apache安装目录中httpd-ssl.conf做的。

添加 SSL 协议支持协议,去掉不安全的协议,并修改加密套件(注意这个SSLCipherSuite一共有2个)

证书公钥配置,就是放证书对应的那个文件的路径。其他配置也同理,注意把前面#删了

证书私钥配置和证书链配置,也是放路径….

然后就是站点的信息配置了,网站目录和域名。
接下来,配置httpd.conf文件,把下面2个的#去掉

1
2
#LoadModule ssl_module modules/mod_ssl.so (如果找不到请确认是否编译过 openssl 插件)
#Include conf/extra/httpd-ssl.conf

以上,配置完保存之后,重启Apache….
但是我又遇到了这个问题,即在没有配置httpd-ssl.conf文件中站点目录时,访问是可以的

而换成网站目录之后,就这样了…但是我的网站目录已经给了777权限了,而且和Apache一样都是root下的,
问了很多大佬改了很多次依然没有解决…

即SSL安装和配置是没问题的,关于这方面也许是WordPress的原因,要改一下.htaccess文件…网上给的方案是在该文件中添加以下代码:

1
2
SecFilterEngine Off
SecFilterScanPOST Off

但是添加之后会变成错误500,所以这根本不是.htaccess文件的问题…

或者后台强制开https,即在wp-config文件中这一句

1
require_once(ABSPATH . ‘wp-settings.php’);

下面加入

1
2
3
define(‘FORCE_SSL_LOGIN’, true);

define(‘FORCE_SSL_ADMIN’, true);

但是也失败了orz!本来就是个全站开启https的代码,我这样https访问都还没实现就这样搞肯定失败,但这也说明问题不在这里….
请求老师给看了一下,似乎是PHP那边的问题,即不能指向index.php,但是由于站点伪静态,其他页面都是可以在https下访问的!又检查了PHP设置,Apache自身设置等,都没有问题!但由于时间关系没有解决….我自己刚才又重新对比httpd.conf和httpd-ssl.conf文件,发现前者多出来一句…于是在httpd-ssl.conf文件的<VirtualHost>下添加这句代码

1
DirectoryIndex index.php

重启Apache就可以https访问了

当然我没有开启全站https,因为懒,也免得让大家改友链了

但是!我这里不得不吐槽!之前我去找老师的时候,那一句就有,就是说当时httpd-ssl.conf文件在一段时间内的设置是和现在完全相同的,不过那个时候还是无法https访问,后来检查也是没毛病,也不知道为什么刚才再这样设置反而成功了orz….虽然不能说完全成功,用火狐浏览器要刷新多次才能https访问(小绿锁=403,小黄锁=可以访问)毕竟没有开启全站https,混用应该会有点bug的

最后还是建议不管在是否有装过配置环境,下次再配置ssl之前还是强制重新来装一次环境吧,免得忽略了什么,即这2条指令

1
2
yum install openssl
yum install mod_ssl

直到最后才证明是ssl证书生效问题….还有浏览器是否自动阻止不被认可的ssl证书的问题,总之安装不难,但能不能用还是要看证书质量。

对恶心爬虫YisouSpider的屏蔽

前几天七牛云的流量似乎被刷,于是就去查记录了,结果发现了奇怪的IP,基本上都是这一个IP在刷,ping过之后发现是阿里云的,通过访问测试,确定是一台专门用来跑程序的服务器。所以接下来确定是什么人在跑什么程序就好,通过日志来看是在爬本站的图片外链,应该是个蜘蛛什么的…之后我在后台统计发现了这个
YisouSpider…所以不用说了,接下来就是去屏蔽这些了,我最先采用的办法就是在.htaccess文件中添加屏蔽IP的语句,即

1
Deny from 140.205.31.90

但是之后过了一天查看统计记录,还是有YisouSpider的访问记录,毕竟对于这种恶心程序,一定是分布式服务器集群扫描,所以禁了一个ip,就会换个ip继续扫。因此,尝试另一种简单方法,即在robots.txt加入屏蔽语句,也就是

1
2
User-agent: YisouSpider
Disallow: /

将robots.txt文件放入网站根目录即可,可是从网上的一些反馈看,似乎YisouSpider会无视robots.txt的规则….似乎Nginx设置里直接禁掉的方法比较多,但我是Apache2333。
后来从http://cnzhx.net/blog/ban-some-bad-spiders/
这里找到了一个解决方法,即使用Apache的mod_rewrite和mod_setenvif组件来屏蔽这个爬虫。虽然官方文档说这可以在Apache的配置文件中配置,但查看了一下.htaccess文件还是放到这里了,毕竟这里的mod_rewrite组件是一直被使用的(废话)。

为了多重保险,在mod_rewrite组件中加入

1
2
3
4
5
6
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteCond %{REQUEST_URI} !^/error\.html$
RewriteCond %{HTTP_USER_AGENT} EasouSpider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} YisouSpider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Sogou\ web\ spider [NC]
RewriteRule ^.*$ – [F,L]

在mod_setenvif(这个实际上是后来整体加的)写入屏蔽代码即可,鉴于在.htaccess文件中加入<Location/></Location>标签会导致全站错误500,我更改代码并添加部分应该屏蔽的恶心UA,测试成功为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<IfModule mod_setenvif.c>
SetEnvIfNoCase User-Agent “EasouSpider” bad_bot
SetEnvIfNoCase User-Agent “YisouSpider” bad_bot
SetEnvIfNoCase User-Agent “LinksCrawler” bad_bot
SetEnvIfNoCase User-Agent “EtaoSpider” bad_bot
SetEnvIfNoCase User-Agent “LinksCrawler” bad_bot
SetEnvIfNoCase User-Agent “linkdex.com” bad_bot
SetEnvIfNoCase User-Agent “rogerbot” bad_bot
SetEnvIfNoCase User-Agent “AskTbPTV” bad_bot
SetEnvIfNoCase User-Agent “brandwatch” bad_bot
SetEnvIfNoCase User-Agent “FeedDemon” bad_bot
SetEnvIfNoCase User-Agent “BOT/0.1 (BOT for JCE)” bad_bot
SetEnvIfNoCase User-Agent “Java” bad_bot
SetEnvIfNoCase User-Agent “Jullo” bad_bot
SetEnvIfNoCase User-Agent “ApacheBench” bad_bot
SetEnvIfNoCase User-Agent “Swiftbot” bad_bot
SetEnvIfNoCase User-Agent “WinHttp” bad_bot
SetEnvIfNoCase User-Agent “HttpClient” bad_bot
SetEnvIfNoCase User-Agent “jaunty” bad_bot
SetEnvIfNoCase User-Agent “Microsoft URL Control” bad_bot
SetEnvIfNoCase User-Agent “Python-urllib” bad_bot

<IfModule !mod_authz_core.c>
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</IfModule>
</IfModule>

这一段代码引用如上,这里不多做解释。另外从https://zhangge.net/4458.html也找到了类似的解决方法,其设置原理同上虽然增加了对httpd.conf的设置,但这一步就不用了,这里引用并修改它的PHP代码,放到网站入口文index.php中的第一个 <?php 之后即可(我并没有用,这里仅做代码修改与发布)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//获取UA信息
$ua = $_SERVER[‘HTTP_USER_AGENT’];
//将恶意USER_AGENT存入数组
$now_ua = array(‘FeedDemon ‘,’BOT/0.1 (BOT for JCE)’,’CrawlDaddy ‘,’Java’,’Feedly’,’UniversalFeedParser’,’linkdex.com’,’rogerbot’,’LinksCrawler’,’ApacheBench’,’Swiftbot’,’ZmEu’,’Indy Library’,’oBot’,’jaunty’,’YandexBot’,’AhrefsBot’,’MJ12bot’,’WinHttp’,’EasouSpider’,’HttpClient’,’Microsoft URL Control’,’YYSpider’,’jaunty’,’YisouSpider’,’Python-urllib’,’AskTbPTV’,’lightDeckReports Bot’);
//禁止空USER_AGENT,dedecms等主流采集程序都是空USER_AGENT,部分sql注入工具也是空USER_AGENT
if(!$ua) {
header(“Content-type: text/html; charset=utf-8”);
die(‘请勿采集本站,因为采集的站长木有小JJ!’);
}else{
foreach($now_ua as $value )
//判断是否是数组中存在的UA
if(eregi($value,$ua)) {
header(“Content-type: text/html; charset=utf-8”);
die(‘请勿采集本站,因为采集的站长木有小JJ!’);
}
}

Nginx配置虚拟主机

重装系统之后换成了Nginx。由于使用的lnmp包是第三方的,所以设置起来比较蛋疼(实际上参考之前Apache这样的设置,关键点还是在于配置文件的合理位置,只要找到位置就好说了)….为什么要这样做?因为9bie.org这个域名要从我这里跳转啊….

关于配置虚拟主机是为了实现多站点部署,推荐在vhosts目录下添加配置文件来做,具体配置方法如下:

1.在www目录下创建站点目录

2.到Nginx的目录下,配置nginx.conf文件开启虚拟主机设置(把include前面的#去掉即可),这里要注意一下vhosts目录路径

1
include /usr/local/nginx/vhosts/*.conf;

如上所示,在nginx目录下新建一个vhosts目录(如果原本没有此目录的话)

3.在vhosts目录下新建一个.conf的配置文件,文件名以方便记忆为准,之后写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
server {

listen 80;

server_name 域名 (带和不带www);
location / {

root 站点目录;

index index.php index.html index.htm;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root /usr/share/nginx/html;

}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

location ~ .php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME 站点目录$fastcgi_script_name;

include fastcgi_params;

}

location ~ /.ht {

deny all;

}

4.根据自己的情况写入配置就好,之后重启nginx:

1
2
3
cd /usr/local/nginx/sbin/

./nginx -s reload

5.在站点目录下放个index.html测试一下

关于其他配置方法也有很多,如直接在nginx.conf文件中进行配置…但对于第三方包来说比较折腾…上述方法在CSDN上可以找到更详细具体的配置说明与实例。写这篇文章仅仅是低端水文章罢了……

关于网站被黑及相关处理

某文章被改,而且查记录还被挂上了黑页….拜访一下邻居,夏娜酱似乎也遇到了同样的状况。
首先分析一下,我使用的WordPress版本是4.7,上个月就有收到阿里云的短信提示,说待修复漏洞(Wordpress >=4.7 wp-json User Enumeration Exploit和wordpress SQL Injection)….查了一下似乎有更严重的问题,即影响WordPres4.7和WordPress4.7.1的0day,相关报道:

http://www.msnzz.com/msn_58332_1_1.html

http://bingodu.com/news/494267.html

接下来我用(lang)了(fei)一个下午的时间来检查代码,并没有发现后门什么的,按照描述的情况,应该可以确定是哪个0day了…下载WordPress4.7.2,手动更新,基本上就解决了漏洞问题。

之后,连接服务器,看看有没有什么异样,从一般的命令查询结果上看是没什么问题的
但是某记录似乎是被扫描器扫了,查ip还是阿里云(肉鸡?)…而且居然2w多条记录…这就有趣了。

进一步检查服务器,并没有发现有成功被入侵,为了以防万一,从ssh等设置到蜜罐搭建…关于服务器的安全设置,还是喜欢第三方的软件,另外别作死用winscp乱改,不然会和我一样出事故(编码格式是个玄学问题!!)。因此对于相关文章也是作为参考就好,仅仅是作为参考(毕竟我也是小白,隔行如隔山)

centos 安全设置

http://www.dzbfsj.com/forum.php?mod=viewthread&tid=3476

CentOS6.7搭建蜜罐dionaea

http://www.cnblogs.com/xkops/p/5672810.html

另外千万千万别拿winscp乱玩!!该用vim操作的就别从本地搞…..

灵梦&魔理沙のBlog萌化

把博客的背景换成了主角组的壁纸(也是我和cp的头像..),所以突发奇想想在此之上,给灵梦添加一只Q版魔理沙,魔理沙添加一只Q版灵梦,并点击之后可以自动播放自己的角色曲(bgm?)所以这个设置是分2步走的,第一步是找到素材并安放;第二部是使其具有播放bgm的能力。

首先在此之前要先找素材,我就自己抠图了…

对于第一步,这里直接引用泽泽菊苣的坑,更换一下素材地址就行。

传送门:https://qqdie.com/archives/left-right-rem-rahm-top-to-bottom-source.html

对于第二步,点击之后让其播放自己的bgm…这一点我根本不会,因为没学过jq,后来在@政府机构的帮助下解决了这个问题。

在泽泽这个文档中有一个js(ud.js)是负责回应被点击之后的事件,所以只要在这里对应的地方补充绑定的事件就好。先建立新的audio,

1
2
3
4
var mp4 = new Audio(“http://www.0page.org/wp-content/uploads/2017/04/Anno-Satori-少女綺想曲-~-Dream-Battle.mp3”);
mp4.preload = “auto”;
var mp3 = new Audio (‘http://www.0page.org/wp-content/uploads/2017/04/Anno-Satori-恋色マスタースパーク.mp3’);
mp3.preload = “auto”;

之后在对应的事件绑定的地方写入对应代码就行,一定要写到return前面!!!!

魔理沙的:

1
if (mp3.paused){mp3.play();}else{mp3.pause();};

灵梦的:

1
if (mp4.paused){mp4.play();}else{mp4.pause();};

然而经过测测试,似乎判断语句完全没用…即点几下,音乐就同时开始几次…然而是单次播放…我分析是因为没用指定具体的图片所以才导致一直播放…于是乎,把代码原封不动的复制到DW里然后重新保存一个同名js文件,上传,再测试,好了….

毕竟这种玄学问题经常遇到也见怪不怪了….

Linux内核漏洞修复与吐槽

爆出了Linux内核漏洞,然呢坑爹的阿里云却没有公告提醒!!!这一点真比不上腾讯。

腾讯公告:http://bbs.qcloud.com/thread-33227-1-1.html

所以就按着上述解决方法来了

1
2
# uname -a
Linux 3.10.0-514.6.2.el7.x86_64 #1 SMP Thu Feb 23 03:04:39 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

发现内核的确是受漏洞影响的,更新软件源、更新内核

1
2
3
# yum clean all && yum makecache

# yum update kernel -y

重启之后查看内核版本,已经是最新版的安全版本了

1
2
# uname -r
3.10.0-514.26.2.el7.x86_64

这里必须要吐槽的是如果不是某博友提示,或许还真不知道这个漏洞,因为阿里云根本就没有安全公告,并且搞不懂为什么阿里云要把漏洞公告全部整合到云盾态势感知的行业新闻里???查看之后发现近期(以阿里云漏洞信息发布日期为准)类似漏洞也不少,比如“Phoenix Talon” Linux内核漏洞等。。。。
而阿里云官方对于此类漏洞的建议就是使用 yum update kernel 或sudo apt-get update && sudo apt-get upgrade升级内核,毕竟其中的大多数,官方都已经有修复了。。。。

当然最近又爆了Apache httpd多个安全漏洞,解决方法也是升级,幸好我的apache一直是最新版。总之不得不说阿里云现在的服务真心不如腾讯云。

重建站点

….主要是php5.4用起来太蛋疼了!而且centos7.x版本我还没有体验过,正好被centos6.5 的yum源坑了之后我就果断重装系统了,换成了centos7.2+PHP5.6,之后重新搭建博客导入数据库,用起来的确好多了!!当然也遇到了以下几个问题,但都解决了:

0.导入数据库大小限制

实际上博客媒体库的上传限制也是同一原因,找到php.ini并配置即可。重点在于post_max_size所限制的大小,它的数值决定你可上传/导入最大文件大小的数值

1.后台安装插件无法定位到wp-content

从网上查了很多文章似乎都让在wp-config.php文件中加入某段代码,但测试之后发现根本没用反而造成错误。

因此只能土办法解决了:从WordPress.org下载插件,上传到插件目录手动安装

2.媒体库上传没有写入权限

给uploads文件夹777权限,并且勾选循环设定组、拥有者和权限

3.伪静态

要重新检查一下Apache的配置文件,确定LoadModule rewrite_module modules/mod_rewrite.so没用被注释掉即可。注意部分lamp包当中,modules部分是由另外的.conf文件分开管理的,不一定都在httpd.conf当中

之后给在站点目录下创建 .htaccess,写入如下代码并重启httpd服务,之后在WordPress后台配置固定连接

1
2
3
4
5
6
7
8
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

4.ssl

参照:之前ssl配置

另外关于ssl要提醒一下很多免费ssl(赛门铁克等)已经被谷歌和火狐ban了,原因众所周知。所以我打算之后找个合适的ssl证书再开启https。

5.ban掉恶心的爬虫

参照:之前ban掉爬虫

ECS漏洞修复

对于阿里云我只想说草泥马!!!现在漏洞咨询都扔在开发者论坛了,控制版面看都看不到!!!

说一下今天具体的情况,早上8点多阿里云给短信通知说有漏洞,一开始没注意,因为那时在图书馆并且直到下午才回来,而回来之后想着修复漏洞,登录一看卧槽!!全是内核/组件漏洞,EXM???我不是升级过一次吗??

具体为:

  • 漏洞: RHSA-2017:1615: kernel security and bug fix update (Important)

  • 漏洞: RHSA-2017:1100: nss and nss-util security update (Critical)

  • 漏洞: RHSA-2017:1095: bind security update (Important)

  • 漏洞: RHSA-2016:0459: bind security update (Important)

  • 漏洞: RHSA-2015:1635: sqlite security update (Moderate)

分析:使用uname -a查看内核,应该是没问题的,所以可能是组件过低导致的漏洞

解决:

1
yum update

大概花了10分钟

重启之后用uname -r查内核,但是发现内核没变,再试一次提示已经是没有升级版本了。

总之阿里云的体验越来越差了!!!!