曾经被服务器负载飙升困扰不堪?一切从把SSH改为密钥登录开始。
记得那会儿,我的服务器负载经常莫名其妙飙升到100%,查看系统日志才发现,每天都有成千上万的爆破SSH密码的登录请求,这些恶意请求占用了大量系统资源。直到我把SSH认证方式从密码登录改为密钥登录,并禁止了密码登录,服务器负载就像坐了过山车一样——直线下降。
这背后的原因,且听我慢慢道来。
为什么SSH密钥登录能大幅降低服务器负载?
暴力破解的终结者
当你开启SSH密码认证时,你的服务器就像一个大街上没锁门的房子,任何人都可以来尝试推门。事实上,任何在公网暴露22端口的SSH服务器每天都会收到大量暴力破解攻击,有的甚至每天上千次登录尝试。
每一次登录尝试,服务器都需要进行密码验证过程,消耗CPU和内存资源。当攻击者使用自动化工具进行暴力破解时,这些请求会形成洪水般的流量,直接导致服务器资源被耗尽。
而切换到SSH密钥登录后,情况就完全不同了。密钥认证使用非对称加密技术,私钥长度通常较长(如4096位),破解难度极高。攻击者面对这种加密方式,往往知难而退,因为尝试破解从计算经济学上根本不划算。
认证流程的简化
SSH密钥登录不仅更安全,认证流程也更为高效。使用密码登录时,服务器需要维护密码验证机制,处理密码输入和验证的整个过程。而密钥认证简化了这一过程,客户端直接证明自己拥有私钥,服务器只需使用对应的公钥验证即可。
这种改变减少了认证所需的计算资源,特别是在高并发连接情况下,差异尤为明显。
密钥登录的工作原理
SSH密钥对是通过加密算法生成的一对密钥,即公有密钥(公钥)和私有密钥(私钥)。
- 公钥:放置在服务器上,相当于一个公共的锁,任何人都可以看到但它不能解锁
- 私钥:保存在本地客户端,是开锁的钥匙,必须妥善保管
当你连接服务器时,服务器会用一个随机生成的消息挑战你,你用私钥加密这个消息后返回,服务器使用存储的公钥解密验证。如果匹配,则认证成功。这个过程不需要传输任何密码,私钥始终保存在本地,不会在网络上传输。
如何配置SSH密钥登录并禁用密码认证
生成SSH密钥对
在本地计算机上使用ssh-keygen命令生成密钥对:
ssh-keygen -t rsa -b 4096
这里-t rsa
指定密钥类型为RSA,-b 4096
指定密钥长度为4096位,更高的密钥长度意味着更强的安全性。
将公钥上传到服务器
- 登录服务器,在家目录下创建
.ssh
目录(如果不存在),并设置正确权限:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
- 将公钥内容(通常是
id_rsa.pub
文件的内容)添加到~/.ssh/authorized_keys
文件中:
vim ~/.ssh/authorized_keys
- 设置authorized_keys文件的权限:
chmod 600 ~/.ssh/authorized_keys
禁用SSH密码登录
编辑SSH服务器配置文件/etc/ssh/sshd_config
:
vim /etc/ssh/sshd_config
找到并修改以下行:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin without-password # 或者使用 'prohibit-password'
重启SSH服务使配置生效:
sudo systemctl restart sshd
重要提示:在关闭密码认证前,一定要确保你的公钥已经正确添加到服务器且能用密钥登录!否则你可能会被锁在服务器外面。
其他降低SSH相关负载的小技巧
除了切换到密钥登录,还有几个方法可以进一步优化SSH连接:
关闭DNS反向解析
OpenSSH在用户登录时默认会验证IP,它会根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法。如果客户机的IP没有域名,或者DNS服务器很慢,登录就会花费很多时间。
在/etc/ssh/sshd_config
中添加:
UseDNS no
然后重启SSH服务,这可以显著加快连接速度。
禁用GSSAPI认证
GSSAPI认证在目标机器无域名解析时会有问题,默认情况下,GSSAPIAuthentication在服务器端和客户端都激活。如果DNS服务出现问题,登录过程要等到DNS查询超时后才能继续。
在/etc/ssh/sshd_config
中设置:
GSSAPIAuthentication no
考虑更改SSH端口
虽然更改端口不会减少攻击,但会减少攻击噪音,因为大多数自动化攻击工具只扫描默认的22端口。你可以将SSH服务配置为监听非默认端口。
在/etc/ssh/sshd_config
中添加:
Port 2222 # 或其他非标准端口
然后使用指定端口连接:
ssh -p 2222 username@server_ip_address
密钥管理的最佳实践
妥善保管私钥
云平台不会保存你的私钥,私钥仅一次下载机会,因此需要将私钥保存在安全的位置。拥有你的私钥的任何人都可以解密你的登录信息。
使用强密码保护私钥
在生成密钥对时,你可以选择为私钥设置一个密码(passphrase),这样即使私钥文件被盗,攻击者仍然需要破解密码才能使用它。
定期轮换密钥
制定密钥轮换策略,定期更新SSH密钥。轮换策略应包括密钥的生成、分发、测试与旧密钥的撤销等环节,确保在不影响业务连续性的前提下完成密钥更新。
结语
自从切换到SSH密钥登录并禁用密码认证后,我的服务器负载从经常性的100%下降到了个位数,CPU使用率也变得稳定,不再出现那种一会0%、一会100%的疯狂波动。
这不仅仅是一个安全改进,更是性能优化的重要举措。如果你还在为服务器负载过高而烦恼,不妨检查一下是否还在使用SSH密码认证。改成密钥登录,很可能就是你一直在寻找的解决方案。
毕竟,在服务器运维的世界里,安全与性能往往是同一枚硬币的两面。
本文由万事屋原创,转载请保留出处:https://www.rei3.com
没有回复内容