晚上登陆 linode 主机之后,发现有 4k + ssh 失败的登录记录。嚯,我这是被盯上了呀。

统计一下多少暴力破解 root 密码的

$ sudo grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

# 结果如下
4578 112.85.42.77
2071 218.92.1.168
436 62.210.129.108
73 212.64.0.80
73 106.12.87.178
27 211.181.197.181
20 58.218.205.248
20 139.59.15.122
14 185.148.38.112
12 221.138.138.38
10 158.69.53.42

统计一下有多少尝试各种用户名的

$ sudo grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr | more

# 结果如下
1670 62.210.129.108
184 139.59.15.122
45 158.69.53.42
16 185.148.38.112
15 209.141.62.36
15 209.141.33.72
15 199.19.226.226
15 199.19.225.65
12 35.237.36.246

鉴于之前机器被黑过一次,抓紧时间先修改一下 ssh 端口。

修改 ssh 文件

vi /etc/ssh/sshd_config

去掉 #Port 22 前面的 # 号,并在它下面添加 Port 1422,修改后如下:

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 22
Port 1422
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

我们看到在配置文件中提示我们需要修改 SELinux 相关配置,告知 SELinux 这个改动。这是由于SELinux 默认只允许 ssh 22 端口。如果只修改 sshd 的配置文件是不起作用的。

按提示我们执行

sudo semanage port -a -t ssh_port_t -p tcp 1422

然后我们重启 sshd 服务:

sudo systemctl restart sshd

接下来我们添加防火墙规则:

firewall-cmd --permanent --zone=public --add-port=22/tcp # 全部成功后我们再移除 22 端口
firewall-cmd --permanent --zone=public --add-port=1422/tcp

重启防火墙

firewall-cmd --reload

然后我们检查一下配置:

# 查看防火墙暴露的端口
firewall-cmd --permanent --list-port

# 查看 SELinux 对 ssh 的端口规则
semanage port -l | grep ssh

# 查看 ssh 监听的端口
ss -tnlp | grep ssh

发现我们的修改已经生效,此时我们退出登录,使用新端口进行登录

ssh -p 1422 root@your_ip

登录成功说明配置没有问题,端口添加成功,接下来我们将 22 端口禁用掉。

修改 sshd 配置文件,将 Port 22 注释掉。重启 sshd systemctl restart sshd

将 22 端口从 防火墙的端口中移除

firewall-cmd --permanent --zone=public --remove-port=22/tcp

重载防火墙配置

firewall-cmd --reload

再次查看相关配置

# 查看防火墙暴露的端口
firewall-cmd --permanent --list-port

# 查看 ssh 监听的端口
ss -tnlp | grep ssh

发现已经没有 22 端口。退出登录,尝试使用 22 端口登录,发现失败。使用我们配置的 1422 端口登录则没有问题。

备注:

SELinux 无法禁用 22 端口

$ semanage port -d -t ssh_port_t -p tcp 22
> ValueError: 在策略中定义了端口 tcp/22,无法删除。

至此,ssh 登录端口修改完毕。但这还不够,可以做如下配置:

  1. 禁用密码登录,使用 RSA 私钥登录
  2. 安装 denyhosts

禁止 root 用户远程登录

编辑 /etc/ssh/sshd_config 文件
PermitRootLogin设置为 no
重启 sshd 服务

ssh免密码登录

将本机 .ssh/id_rsa.pub 的 内存放在 远程机的 .ssh/authorized_keys 文件中

远程机的 .ssh 文件夹需要 700 权限

chmod 700 .ssh

远程主机的 .ssh/authorized_keys 文件需要 644 权限

chmod 644 .ssh/authorized_keys