目前使用SSH固然是不建议开启密码登录的。而目前网络上能查到的基于证书的SSH登录,使用也十分不讲究。本文从安全以及实用的角度,对密钥SSH登录进行加固。
0x01 生成安全的密钥对
目前,网络上关于SSH密钥对生成教程,出于方便,一般都使用默认的rsa加密。这里,我们更加讲究地使用ecdsa来进行密钥对的生成。
ssh-keygen -t ecdsa -b 521
请注意,这里我们十分讲究地使用了521位加密(不是512!)。
生成完毕后,如果你在这里没有输入私钥的密码,我们会生成一个不带密码的私钥。这个不带密码的私钥虽然不安全,但是有其使用场景。例如。。。好吧我想不出来。那这里我们对他进行加密。
cp id_ecdsa id_ecdsa_encrypted ssh-keygen -p -f id_ecdsa_encrypted
这样我们就可以生成一个新的私钥文件“id_ecdsa_encrypted”了。
0x02 上传公钥到服务器
非常简单,一行命令搞定上传。
ssh-copy-id -i id_ecdsa.pub {username}@{hostname}
此时,目标服务器如果还启用了密码验证的话,则需要输入密码。如果启用了证书,则必须确保证书在生成密钥的机器上可以正常被读到。(例如已经安装了rsa密钥,要更新ecdsa密钥)
0x03 加固sshd.service
在没有加固之前,相信你每次登陆ssh都有几万次login failed的提示。
这里我们对 /etc/ssh/sshd_config 文件进行一些关键字段的修改,来实现加固
Port 1234 StrictModes yes #请确保~/.ssh/及其文件的文件权限正确 MaxAuthTries 3 MaxSessions 3 PubkeyAuthentication yes PasswordAuthentication no X11Forwarding no PermitRootLogin no #请确保有低权限账号创建,能正常被ssh登陆,并加入了sudoer豪华午餐
大部分人应该一眼都能明白改的啥吧,不解释了。
好高端的样子
不妨在服务器上安装一个 shadowsocks proxy 或者 VPN, 然后限定只有服务器本身的 IP 才能SSH登录。
思路很棒!我用了更成熟的方案,frp实现了这个特性。欢迎阅读:https://iam.lc/2020/05/frp-configuration.ping