vps 服务器 安全防护设置

0x00 起因

最近我自己的 vps 越来越不稳定,开始还以为是因为我自己在路由器里面添加了透明代理使用的流量大造成的,后来越来越发觉不正常,毕竟我也是用了几年 vps 的老手了,总觉的不正常。后来 iftop 发现我的 vps 即使不用的情况下也经常会有 MB/s 级别的流量通信,再用 nethogs 一看更是心惊,原来是大量的只有 0.02 KB 左右的数据流,这才想起来,这台 vps 自打买来就一直在测试使用,但是没有进行安全防护的详细设置只是进行了一些简单的设置。下面详细说说,vps 在购买之后要做哪些安全类型的设置。当然这些设置对于一般的建站之类的已经足够了,如果是明星站请使用专业的设置方法。下面说几个比较有效的常规方法。

0x01 ssh

ssh 是我们最应该去第一个设置的项目。几乎所有的 linux 服务器的使用者都会用 ssh 来进行服务器的管理,生产环境下没有几个人去使用图形界面连接,那么 ssh 的安全防护就成了第一道重要的关卡。默认 ssh 是使用 22 端口进行连接的。我们需要更改掉这个端口,因为一般的脚本首先扫描的就是 22 端口。然后还要更改掉登录的方式,默认大家的都是账号密码登录,这里我们需要更换为密钥证书登录。下面说说如何去设置,不同版本的 sshd 可能会略有不同,但是思路是一样的。改掉默认的 22 端口,改掉密码登录,这两点是内容是不变的。

1.更改默认端口

vim /etc/ssh/sshd_config 此处例子更改为29888

#Port 22
Port 29888
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

2.更改秘钥登录

2.1 生成密钥

生成密钥对,输入命令以后一路回车

ssh-keygen -t rsa

生成的公私钥对默认保存在~/.ssh/
生成两个文件 id_rsa id_rsa.pub 带 pub 的是公钥,上传给服务器公钥

2.2 传输密钥到服务器

可以使用 ssh-copy-id 来一步完成

ssh-copy-id user@serverip 

也可以全手动的当时去做

#在本机上执行此命令,上传公钥
cd .ssh
scp -P id_rsa.pub user@serverip:/tmp
#在服务器上执行此命令,追加到authorized_keys
cd /tmp && cat id_rsa.pub >> ~/.ssh/authorized_keys
#更改权限
chmod 600 ~/.ssh/authorized_keys
2.3 配置sshd开启密钥登录

vim /etc/ssh/sshd_config 以下两项更改为yes,第三项采用.ssh下面的文件认证,注释掉 password认证

RSAAuthentication  yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

# PasswordAuthentication yes

重启sshd,
service sshd restart或者systemctl restart sshd.service。sshd服务重启之后,服务器已经支持远程ssh连接了。

我个人建议是密码认证那个先不要注释掉,以防止手抖打错字母造成的问题,能够正常密钥连接以后,再注释掉不迟。

0x02 防火墙

更改了上面的默认的 ssh 登录的端口以后需要在防火墙里面添加对应的规则,只能能够访问这几个端口,其他端口全部不能访问。几乎所有的 linux 发型版本上都会装防火墙软件,常见的有 iptales 和 firewalld,下面分别介绍一下这两个防火墙的设置设置方法。关于防火墙这里不细讲,因为这两个防火墙如果要详细说都是极大的篇幅这里只说需要做哪些。详细的说明以后的博客中可能会讲。

1. iptables 设置

iptables 的原则是在上面的条目先把开放的端口列出来尤其是 ssh 因为一旦设置错误或者忘记填写ssh那么晚就无法连接了,所以ssh必须写在第一位,然后写其他开发的,最后拒绝所有。这样的原则去设置

#开放指定的端口
#-A 是在 iptables 的最后添加一条规则,-I 是在 iptables 的前面添加一条规则
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT
# 允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许访问 22 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许访问 80 端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# 允许 FTP  服务的 21 端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 允许 FTP 服务的 20 端口
iptables -A INPUT -j reject
# 禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT
# 禁止其他未允许的规则访问
屏蔽 IP
iptables -I INPUT -s 123.45.6.7 -j DROP
# 屏蔽单个 IP 的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
# 封整个段即从 123.0.0.1 到 123.255.255.254 的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
# 封 IP 段即从 123.45.0.1 到 123.45.255.254 的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP
# 封 IP 段即从 123.45.6.1 到 123.45.6.254 的命令

上面的 端口自己用不上的不要写进去,最小化的原则,用哪个开那个

# service iptables restart
# systemctl enable iptables.service

2. firewald 设置

查看现在已开放的端口情况

firewall-cmd --list-all

添加要开放的端口

firewall-cmd --permanent --zone=public --add-port=要开放的端口号/tcp
firewall-cmd --permanent --zone=public --add-port=要开放的端口号/udp

使新规则生效

firewall-cmd --reload

最后再检查一下有没有生效

如果要删除上面开放出来的端口用下面的命令

firewall-cmd --permanent --zone=public --remove-port=前面添加的端口号/tcp
firewall-cmd --permanent --zone=public --remove-port=前面添加的端口号/udp

0x03 fail2ban

默认的防火墙可以阻挡大量的无意义的访问,但是防火墙也有一点不智能的地方在于,一直被扫描,但是全部手动的去添加这些扫描的 ip 过于不方面,如果有智能的方式进行这项工作就好了。fail2ban就是我推荐的一个好工具去完成这个琐碎的工作。
这里推荐一个比较懒的方法,使用一键 lnmp 脚本 tools 文件夹里面的 fail2ban 脚本去自动编译安装,wget http://soft.vpser.net/lnmp/lnmp1.6beta.tar.gz下载后解压开就好了。执行tools 里面的fail2ban.sh

wget http://soft.vpser.net/lnmp/lnmp1.6beta.tar.gz
tar xf lnmp1.6beta.tar.gz
cd ./lnmp/tools
./fail2ban.sh

然后修改配置文件 /etc/fail2ban/jail.conf ,写进去这样的内容,这样会用 fail2ban 使用 firewalld 来进行 ip 的拦截。

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter  = sshd
port    = 22
action = %(action_mwl)s
logpath = /var/log/secure

0x04 ddos

fail2ban 最大的功能在于常规的 sshd 的暴力扫描破解以及 http https 等常见的协议的被暴力扫描可以起到很好的作用。但是对于全部端口的扫描以及 ddos 这样垃圾的数据攻击就没有什么效果了,所以我们还要加装一个 ddos 防护类型的工具。这里条件使用DDoS-Deflate
安装方法
下载

wget http://www.inetbase.com/scripts/ddos/install.sh

添加执行权限

chmod +x install.sh

执行安装

./install.sh

编辑配置文件修改以下内容
vim /usr/local/ddos/ddos.conf

NO_OF_CONNECTIONS = 100
APF_BAN = 0
BAN_PERIOD = 36000
  1. 超过一个 ip 超过 100 个连接就判定为恶意
  2. 使用 iptables 作为拦截的底层功能
  3. 一个 ip 被加入黑名单的时间 当然是越长越好。

0x05 检验效果

俗话说不看价格,看疗效。同理我们做了这么多是时候该查看一下防护的效果了,这里我推荐使用 iftop nethogs 以及 netstat 这 3 个工具来检验我们的防护效果。正常来说使用了这3种方法以后,即使有脚本扫描的行为也会在扫描一段时间以后得不到任何结果就会自动的放弃掉。如果有专业的团队去攻击那上面的方法就起不到特别大的效果了。

首先使用 iftop 查看一下总的实时流量的数据量有多大

                   12.5Kb              25.0Kb              37.5Kb              50.0Kb         62.5Kb
└───────────────────┴───────────────────┴───────────────────┴───────────────────┴────────────────────
ivoivo                               => xxx.xxx.26.21                          7.09Kb  5.33Kb  5.33Kb
                                     <=                                        208b    312b    312b
ivoivo                               => 8.8.8.8                               1.14Kb  1.27Kb  1.27Kb
                                     <=                                        868b   1.13Kb  1.13Kb
ivoivo                               => 8.8.4.4                                868b    722b    722b
                                     <=                                       1.13Kb   722b    722b
239.255.255.250                      => 104.223.22.46                            0b  0b  0b
                                     <=                                       1.57Kb  1.18Kb  1.18Kb
239.255.255.250                      => 104.223.12.74                            0b  0b  0b
                                     <=                                        808b    808b    808b
239.255.255.250                      => 85.209.162.79                            0b  0b  0b
                                     <=                                       1.57Kb   804b    804b
224.0.0.252                          => 155.254.33.175                           0b  0b  0b
                                     <=                                       0.98Kb   700b    700b
antitm.info                          => 155.94.158.120.static.quadranet.com    704b    440b    440b
                                     <=                                          0b      0b      0b
239.255.255.250                      => 104.129.12.54                            0b  0b  0b
                                     <=                                        804b    402b    402b
239.255.255.250                      => 167.160.187.163                          0b  0b  0b
                                     <=                                        796b    398b    398b
antitm.info                          => 144.172.92.116                         352b    352b    352b
                                     <=                                          0b      0b      0b
antitm.info                          => 144.172.92.117                         704b    352b    352b
                                     <=                                          0b  0b  0b
155.94.140.255                       => 155.94.140.20                            0b  0b  0b
                                     <=                                        312b    312b    312b
239.255.255.250                      => 85.209.162.116                           0b  0b  0b
                                     <=                                        516b    258b    258b

─────────────────────────────────────────────────────────────────────────────────────────────────────
TX:             cum:   3.65KB   peak:   9.08Kb                       rates:   9.08Kb  7.31Kb  7.31Kb
RX:                    6.15KB           16.2Kb                                16.2Kb  12.3Kb  12.3Kb
TOTAL:                 9.80KB           25.3Kb                                25.3Kb  19.6Kb  19.6Kb

然后用 nethogs 查看具体的有没有大量的数据量 0.02 KB 做有的数据进出

  PID USER     PROGRAM                                         DEV        SENT      RECEIVED       
      ? root     144.172.92.117:22-118.89.106.252:21666                      0.000   0.346 KB/sec
      ? root     155.94.158.120:80-93.189.44.132:55733                       0.000   0.068 KB/sec
      ? root     144.172.92.116:22-58.242.83.30:64217                        0.000   0.059 KB/sec
  28174 root     sshd: root@pts/0                                eth0        0.480   0.059 KB/sec
      ? root     144.172.92.116:80-93.189.44.132:48694                       0.000   0.057 KB/sec
      ? root     144.172.92.117:80-93.189.44.132:36359                       0.000   0.045 KB/sec
      ? root     104.223.12.19:445-110.137.177.218:65167                     0.000   0.013 KB/sec
      ? root     96.44.140.222:445-78.188.152.134:55087                      0.000   0.013 KB/sec
      ? root     96.44.140.219:1500-198.108.67.59:13511                      0.000   0.011 KB/sec
      ? root     96.44.140.222:23-175.156.143.43:61938                       0.000   0.011 KB/sec
      ? root     unknown TCP                                                 0.000   0.000 KB/sec

  TOTAL                                                                      0.480       0.680 KB/sec

最后用 netstat -atu 查看一下有多少 tcp 和 udp 建立的连接

[root@ivoivo ~]# netstat -aut
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:33346           0.0.0.0:*               LISTEN     
tcp        0      0 localhost:51183         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:29009           0.0.0.0:*               LISTEN     
tcp        0      0 ivoivo:58132            yx-in-f188.1e10:hpvroom ESTABLISHED
tcp        0      0 ivoivo:33346            xxx.xxx.26.21:59290      ESTABLISHED
tcp        0      0 localhost:51183         localhost:60612         ESTABLISHED
tcp        0      0 ivoivo:29009            xxx.xxx.26.21:55960      ESTABLISHED
tcp        0      0 localhost:60612         localhost:51183         ESTABLISHED
tcp6       0      0 localhost:smtp          [::]:*                  LISTEN     
tcp6       0      0 [::]:29009              [::]:*                  LISTEN     
udp        0      0 0.0.0.0:mdns            0.0.0.0:*                          
udp        0      0 0.0.0.0:23926           0.0.0.0:*                          
udp        0      0 0.0.0.0:33346           0.0.0.0:*     

最后感谢互联网上面的先贤们,他们产出的优质的文章供我参考才有的此篇博文,下面是参考的链接

https://www.seoimo.com/wordpress-vps/
https://blog.csdn.net/koastal/article/details/72426874
https://segmentfault.com/a/1190000015362485

上一篇
下一篇