吃一堑,长一智。在上次服务器被攻击后(密码复杂度满分却被秒破?腾讯云“白名单”闹剧与AI泄密的血泪复盘),我们进行了深度复盘,同时,也引起了腾讯云官方的注意。
、
该说不说,腾讯云官方的舆情监控做的真到位,早上7:41推文,他们早上9:36找到我跟进这个问题,而且在这之前,他们就已经内部做完了问题分析,直接拉我对改进方案。要是放到其他央国企,估计人还没到岗吧?
当然,防火防盗防运维。作为改进方案,我们配置了Fail2Ban工具来进行密码爆破防御。但是,在生产网络中,我们一般拒绝直接使用、或在脚本中硬编码明文密码。这时,使用密钥对就是一个绝佳的选择,对于大型云计算服务提供商,默认的登录凭证也是使用密钥对,如果要使用密码需要手工调整。
那我们该怎么手工生成密钥对呢?这就不得不提ssh-keygen了。
ssh-keygen是OpenSSH套件中专门用于生成、管理和转换身份验证密钥的核心工具,我们可以通过它生成的密钥对来实现证书级的无密码登录,这也是所有自动化运维(如Ansible、Terraform等)的前提。
生成密钥对时,推荐-t选项并指定为ed25519来使用Ed25519算法,这是目前公认最现代、最安全的椭圆曲线算法。传统的RSA 3072位密钥特别臃肿,并且容易受到潜在的侧信道攻击。相比之下,Ed25519的密钥只有几百个字符,但安全性却相当于3000位以上的RSA,并且生成速度更快、签名速度更快、占用内存极低。
此外,我们还可以通过-a选项指定密钥派生函数的轮数。当我们为私钥设置密码时,SSH会使用一种名为bcrypt的算法对密码进行多次哈希处理。默认值为16,我们可以将其提高到100,这样如果有黑客拿到了我们的私钥文件并尝试暴力破解我们的私钥密码,其计算成本将增加数倍,提升了暴力破解的难度。
为了方便区分,我们可以通过-C选项添加注释,这个字符串会出现在公钥文件的末尾。这就像是我们在机房里给网线贴上标签,当我们把公钥推送到成百上千台交换机或服务器后,通过这个注释,我们可以一眼看出这把钥匙是属于哪台中控机的
则生成密钥对的命令如下:
ssh-keygen -t ed25519 -a 100 -C “tt-200-129”
ll ~/.ssh/
、
可以看到,当我们执行完命令后,生成了两个文件。其中,id_ed25519是私钥文件,这个绝对不能发给任何人;id_ed25519.pub是公钥文件,我们需要把它追加到目标设备的~/.ssh/authorized_keys文件中。
默认情况下,~/.ssh/authorized_keys这个文件是空的,我们需要把公钥文件的内容追加到~/.ssh/authorized_keys文件中。
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
、
保存好生成的私钥和公钥,我们先从电脑上使用MobaXterm连接试一下。
跟使用密码连接不同的是,我们要在【Advanced SSH settings】下面,勾选【Use private key】,并选择生成的私钥文件。
、
然后发起连接,可以看到认证过程一闪而过,提示为使用我们配置的公钥进行认证,随即认证成功。
、
当密钥认证成功之后,我们就可以禁用密码认证,仅允许密钥登录了。同时,禁止root直接带密码登录。
nano /etc/ssh/sshd_config.d/sre_hardening.conf
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
此外,建议开启TCP存活心跳,防止因为网络抖动导致断连。
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 3
这样,修改完成之后,我们再使用普通的密码登录,就会直接被拒绝了。
、
当然,在服务器上也登录不了了。
、
那我们如何通过命令行进行登录呢?
首先,我们要在客户端一侧也配置这个密钥文件。
、
然后,我们执行登录命令,使用-i参数指定私钥路径:
ssh -i ~/.ssh/id_ed25519-200-129 root@192.168.200.129
、
看,因为我们创建的密钥文件默认权限为644,而Linux的SSH客户端非常挑剔,直接报错,提示私钥文件权限太开放了,不应该能被其他用户访问。那么,我们将文件权限修改为600:
chmod 600 ~/.ssh/id_ed25519-200-129
、
可以看到,权限一改,马上登录成功。
如果大家跟我一样,内网有上百台虚拟机,每次连接都需要精确指定不同的密钥文件,这个操作绝对是反人类的,那怎样配置才能简化操作呢?
我们可以客户端侧创建一个快捷登录配置文件~/.ssh/config,给每台服务器起一个昵称,并指定私钥文件:
nano ~/.ssh/config
Host srv200.129
HostName 192.168.200.129
User root
IdentityFile ~/.ssh/id_ed25519-200-129
配置好之后,我们只需要敲一行命令就能秒连服务器了:
ssh srv200.129
、
这样,我们的Ubuntu服务器就已经完成了从裸奔到全副武装的进化,这不仅是安全的升级,更是运维体验的降维打击。
我们不仅利用Ed25519算法构建了坚不可摧的安全防线,更通过SSH Config文件实现了效率的飞跃。这正是运维人的浪漫:用代码的严谨守护安全,用配置的智慧解放双手。
那话说回来了,你更喜欢MobaXterm的图形化操作,还是直接使用终端的命令行配置呢?
声明:来自铁军哥,仅代表创作者观点。链接:https://eyangzhen.com/7238.html