昨天新买了一个洛杉矶的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 外多一层访问限制。
1 条评论
写的好