网站安全细节记录

网站安全记录之抵御DDoS攻击:

2018-08-18  by  Beyond

分布式拒绝服务(DDoS:  Distributed Denial of Service)

2018-08-17 凌晨03:00,  发现网站未闻花名被人DDoS攻击后,

先后出现了下面各种从来没见过的错误:

500 Internal Server Error /nginx 1.14.0,

建立数据库连接时出错,

无法登录MySQL服务器,mysqli_real_connect():(HY000/2002):No Such File or directory

如图所示:

网站被DDoS攻击之后,冒出许多莫名奇妙的错误
网站被DDoS攻击之后,冒出许多莫名奇妙的错误

找出真凶: 

1.  ssh 登录之后, 使用 命令  netstat 查看当前所有的连接

或者 将结果保存到文件  netstat > /root/sg_log

发现有一个ip建立了350多个连接,

经查询,该ip来源是: 美国   107.149.184.144

受到这个IP: 107.149.184.144的攻击,同时建立了350个http连接
受到这个IP: 107.149.184.144的攻击,同时建立了350个http连接

 


反击策略:

知道IP地址后, 现在就需要从3个层面,将这个IP封掉

1. index.php 文件中 从PHP层封禁

2.从Nginx层封禁

3.从Linux层封禁

 

先在发现的第一时间,停掉Nginx服务

命令如下:

cd /usr/local/nginx/sbin/

./nginx -s stop    (此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。)

等封禁该IP之后, 再开启服务

./nginx

./nginx -s reload


下面就先从PHP层封禁

打开WordPress根目录

vi index.php

然后, 把里面的代码替换成:

<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */

//获取用户IP地址
        if(!empty($_SERVER["HTTP_CLIENT_IP"]))
        {
            $cip = $_SERVER["HTTP_CLIENT_IP"];
        }
        else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        {
            $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        }
        else if(!empty($_SERVER["REMOTE_ADDR"]))
        {
            $cip = $_SERVER["REMOTE_ADDR"];
        }
        else
        {
            $cip = '';
        }
        preg_match("/[\d\.]{7,15}/", $cip, $cips);
        $cip = isset($cips[0]) ? $cips[0] : 'unknown';
        unset($cips);

if($cip == '107.149.184.144') {
	return;
}else{
	 define('WP_USE_THEMES', true);
	/** Loads the WordPress Environment and Template */
	 require( dirname( __FILE__ ) . '/wp-blog-header.php' );
}



从Nginx层面进行防护

默认情况下, Nginx服务器是可以 直接通过服务器的ip 进行访问WordPress网站的

现在要禁止用户  直接通过地址输入ip  的形式访问网站


操作如下:

cd 到nginx配置目录

cp  vhost_vwhm_net.conf    vhost_default.conf   复制一个子配置文件

vi vhost_default.conf  打开刚才新复制的这个子配置文件

 

将里面的代码改成:

注意:  最核心就是这两行(其他的都注释了)

listen 80 default ;

return 500 ; ​

server {
        listen 80 default;
        return 500;

        #server_name ;
        root some/path/to/default_wwwroot;
        index index.html index.htm index.php;

        location / {
                # wordPress url rewrite
                #       try_files $uri $uri/ /index.php?$args;
        }

        #       rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        #php module

        #location ~ \.php$ {
         #   root           html/default_wwwroot;
          #  fastcgi_pass   127.0.0.1:9000;
           # fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  some/path/to/default_wwwroot$fastcgi_script_name;
           # include        fastcgi_params;
        #}

}

这样, 设置好了默认的 80 请求,

如果用户使用ip地址访问时, 就会来到这个配置, 并且直接返回500错误!

 

最后, 别忘记更新一下总的配置文件​

vi nginx.conf  打开主配置文件, 在http节点导入刚才的那个vhost_default.conf子配置文件

即:  include vhost_default.conf

 

修改配置文件, 不要忘记重启Nginx

cd /usr/local/nginx/sbin/
./nginx -s reload


从Nginx层,将该IP地址加入黑名单,禁止其访问

cd 到nginx配置目录

vi  deny_ip.conf

在里面输入

deny 107.149.184.144;

最后,在nginx.conf主配置文件的http节点

include deny_ip.conf

修改配置文件之后, 记得重启一下:

cd /usr/local/nginx/sbin/
./nginx -s reload

 

这些事情做完之后, 再通过命令netstat,发现显示该IP的http连接数目已经从原来的350个连接暴跌至几十个了

 

(或者建议 登录阿里云服务器控制台, 重启服务器实例,这样更加彻底)


从Linux防火墙,禁止该IP的访问

这个就比较底层了,暂时还不会 –  -!!

 

 

 

 


网站安全记录之简单隐藏WordPress登录后台地址:

2018-08-18  by  Beyond

大家都知道, 默认的后台登录地址是

vwhm.net/wp-admin

现在需要在主题的functions.php中,使用一个wp钩子,进行更多一步验证

// 主题下的functions.php

// 简单隐藏后台登录地址
add_action('login_enqueue_scripts','vwhm_net_login_address');
function vwhm_net_login_address(){
    if($_GET['username'] != 'some one') header('Location: http://vwhm.net/');  
}

​以后,就使用新的登录地址:

http://vwhm.net/wp-login.php?username=some one like you~

 


网站安全记录之修改root密码:

2018-08-18  by  Beyond

先用旧的root帐号ssh登陆

然后输入命令 passwd

接着输入新密码即可


网站安全记录之修改mysql密码:

2018-08-18  by  Beyond

先用ssh登陆

然后,使用旧密码登录 mysql -uroot -p

接下来执行3行命令:

use mysql;

UPDATE user SET password=PASSWORD(“new password”) WHERE user=’user name’;

FLUSH PRIVILEGES;

quit;


 

 

 

 

未完待续,下一章节,つづく