昨天新买了一个洛杉矶的VPS,今天早上再用Xshell连接的时候提示自从上次成功登录后总共有3262次失败的ssh登录尝试,着实吓了一跳。这里顺便介绍一个命令lastb,系统的每一次成功或失败的登录尝试其实都会记录在某些文件中,有关登陆失败的日志都记录在/var/log/btmp中,而命令lastb就是读取这个文件并按照时间由近及远将登陆失败的信息打印出来。

可以看到,平均每分钟都有超过五个失败的登录记录,非常可怕。

那么,应对方法就是修改SSH的端口号,毕竟这种暴力破解的脚本都是针对的SSH默认22端口。

1. 修改SSH的端口号

$ vi /etc/ssh/sshd_config

取消#Port 22的注释,在下一行添加你需要的新SSH端口号Port 12345。(这里不删除 22 端口是为了防止修改后新端口无法访问,造成无法用 SSH 连接服务器。)

保存修改后重启sshd服务。

$ systemctl restart sshd

2. 修改SELinux规则

SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)

首先可以使用下面的命令查看SELinux是否开启:

$ sestatus

假如输出 disabled 则表示 SELinux 没有开启,则不需要管这一步,否则请接着向下看。

对于SSH,SELinux 默认只允许 22 端口,我们可以用 SELinux 管理配置工具 semanage,来修改 SSH 可访问的端口。

安装semanage工具

$ yum provides semanage
$ yum -y install policycoreutils-python

为SSH打开12345端口

# 为 ssh 添加新的允许端口
$ semanage port -a -t ssh_port_t -p tcp 12345
# 查看当前 SELinux 允许的端口
$ semanage port -l | grep ssh
ssh_port_t                     tcp      12345, 22  

最后再次重启sshd服务:

$ systemctl restart sshd

3. 配置防火墙放行新端口

首先查看防火墙是否启动:

$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-12-30 12:00:04 CST; 2h 12min ago
     Docs: man:firewalld(1)
 Main PID: 1742 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─1742 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

Dec 30 12:00:02 server1 systemd[1]: Starting firewalld - dynamic firewall daemon...
Dec 30 12:00:04 server1 systemd[1]: Started firewalld - dynamic firewall daemon.

如果显示active,则永久开放12345端口:

$ firewall-cmd --permanent --add-port=12345/tcp
success
# 重载防火墙
$ firewall-cmd --reload
# 查看暴露端口规则
$ firewall-cmd --permanent --list-port
443/tcp 80/tcp 22/tcp 12345/tcp  

至此工作就基本完成了,现在可以尝试用新端口登录VPS尝试一下。

$ ssh -p 12345 root@example.com

4. 禁用22端口

删除ssh允许端口

$ vi /etc/ssh/sshd_config

注释掉Port 22,然后重启sshd

$ systemctl restart sshd

看看现在是否只监听新的端口:

$ netstat -anp | grep ssh
tcp        0      0 0.0.0.0:12345            0.0.0.0:*               LISTEN      6240/sshd

防火墙移除22端口

$ firewall-cmd --permanent --remove-port=22/tcp
success  
$ firewall-cmd --reload
$ firewall-cmd --permanent --list-port
443/tcp 80/tcp 12345/tcp  

ssh 取消监听 22 端口,就已经配置好了,防火墙只不过是在 ssh 外多一层访问限制。

Last modification:March 6th, 2020 at 08:13 pm