无论是个人的 VPS 还是企业允许公网访问的服务器,如果开放 22 端口的 SSH 密码登录验证方式,被众多黑客暴力猜解捅破菊花也可能是经常发生的惨剧。企业可以通过防火墙来做限制,普通用户也可能借助修改 22 端口和强化弱口令等方式防护,但目前相对安全和简单的方案则是让 SSH 使用密钥登录并禁止口令登录。
本地电脑的设置(client)
生成 rsa 秘钥对
1 | ssh-keygen -t rsa -C "youremail@example.com" |
会在 ~/.ssh/ 目录下生成 id_rsa 和 id_rsa.pub 两个文件,分别为私钥和公钥。
服务器端的设置(server)
在 /
/.ssh/ 目录下,创建文件 authorized_keys:1
touch /<username>/.ssh/authorized_keys
将 client 的公钥里的内容复制到 server 的 authorized_keys 中(server 的 authorized_keys 中可以存放多个 client 的公钥,之间用换行隔开就行)。
修改 /
/.ssh 的权限为 700, authorized_keys 的权限为 600 或者更严格的 400,否则登录的时候会提示server refuse you key
:1
2chmod 700 /<username>/.ssh
chmod 600 /<username>/.ssh/authorized_keys修改 ssh 的配置,使其允许秘钥登录:
编辑 /etc/ssh/sshd_config 文件,修改如下内容:
1
2
3RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys另外,请留意 root 用户能否通过 SSH 登录,最好进制 root 用户通过 SSH 登录:
1
PermitRootLogin no
重启 SSH 服务:
1
service sshd restart
这时查看一下是否可以使用秘钥登录,如果可以就可以禁用密码登录
修改 ssh 的配置,禁用密码登录:
编辑 /etc/ssh/sshd_config 文件,修改如下内容:
1
PasswordAuthentication no
最后重启 SSH 服务:
1
service sshd restart
more
查看登录记录
1 | last -x -F |
or
1 | # 登录成功的记录 |
换端口
修改文件 /etc/ssh/sshd_config:
找到 Prot,改为想要的端口。
然后重启sshd服务:
1 | sudo systemctl restart sshd |
修改防火墙,放行新的端口,同时关闭旧端口:
1 | sudo ufw allow 1122 # 放行新的端口 |
限制连续登录次数(好像使用秘钥登录后,这个就不用管了)
在 /etc/pam.d/sshd 文件第一行(最前面)添加如下内容:
1 | auth required pam_tally2.so deny=3 unlock_time=3600 even_deny_root root_unlock_time=3600 |
deny=3 表示尝试登录次数,超过3次后会执行后续动作,单位为秒 even_deny_root 对root也开启此限制
查看登录失败次数:
1 | sudo pam_tally2 --user <user> |
设置重复验证次数,默认6次
编辑 SSH 配置文件 /etc/ssh/sshd_config:
在 ssh 配置文件中查找 #MaxAuthTries 修改为: MaxAuthTries 3 #错误 3 次即断开连接