<h1>SSH密钥登录:让服务器负载从100%暴跌的神奇操作!- 万事屋

SSH密钥登录:让服务器负载从100%暴跌的神奇操作!

曾经被服务器负载飙升困扰不堪?一切从把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位,更高的密钥长度意味着更强的安全性。

将公钥上传到服务器

  1. 登录服务器,在家目录下创建.ssh目录(如果不存在),并设置正确权限:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
  1. 将公钥内容(通常是id_rsa.pub文件的内容)添加到~/.ssh/authorized_keys文件中:

vim ~/.ssh/authorized_keys
  1. 设置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


请登录后发表评论

    没有回复内容

万事屋新帖