ECS 安全组只放行指定 IP:一次 SSH 暴力破解后的加固实战

举报
yd_213686897 发表于 2026/11/15 00:24:04 2026/11/15
【摘要】 前言上周三凌晨,我的华为云 ECS 云服务器突然收到一封登录告警邮件:过去一小时内,有境外 IP 对 22 端口发起了数百次 SSH 登录尝试,用户名从 root、admin、ubuntu 一路试到 oracle、postgres。所幸我一直用密钥登录、密码登录早已关闭,攻击没有得逞,但这件事把我吓出了一身冷汗——22 端口对全网放行,就等于把家门钥匙孔亮给全世界看。这篇文章记录我当天做的加...

前言

上周三凌晨,我的华为云 ECS 云服务器突然收到一封登录告警邮件:过去一小时内,有境外 IP 对 22 端口发起了数百次 SSH 登录尝试,用户名从 root、admin、ubuntu 一路试到 oracle、postgres。所幸我一直用密钥登录、密码登录早已关闭,攻击没有得逞,但这件事把我吓出了一身冷汗——22 端口对全网放行,就等于把家门钥匙孔亮给全世界看。这篇文章记录我当天做的加固:用安全组入方向规则把 SSH 只放行自己的出口 IP,同时改用密钥登录、开启登录告警,并把验证过程完整走了一遍。

一、先看清现状:问题出在哪

出事的是一台跑了半年多的 ECS,上面跑着一个个人博客和几个定时任务。检查后发现问题有三个:第一,安全组入方向有一条 0.0.0.0/0 放行 TCP 22 端口的规则,这是建服务器时图省事留下的;第二,云服务器的登录方式虽然设了密钥,但 sshd 配置里 PasswordAuthentication 还没有显式关死,留了口子;第三,没有开登录告警,攻击持续了两天我才从邮件里发现。

很多人以为“我的服务器没人惦记”,其实恰恰相反。公网 IP 一旦暴露,就会被全网扫描器轮询,22、3389、6379 这些端口是重点照顾对象。暴力破解不需要针对你,它是广撒网的自动化行为,拼的就是谁的门没锁好。

二、核心操作:安全组只放行自己的出口 IP

思路很简单:SSH 的入方向只允许我自己的出口公网 IP 访问 22 端口,其他一切来源全部拒绝。安全组是有状态的,入方向放行后,回包自动放行,不用再配出方向。

第一步:确认自己的出口 IP

在自己常用的电脑上访问“IP 查询”类网站,或在终端用 curl 命令查询出口 IP,记下出口公网 IP,比如 203.0.113.45。注意:公司网络和家庭宽带、手机热点的出口 IP 都不一样,经常出差或换网络的同学要把几个常用出口 IP 都记下来。家用宽带拨号后 IP 会变,这是后面要说的第一个坑。

第二步:添加只放行自己的入方向规则

进入华为云控制台,依次打开“弹性云服务器 ECS - 安全组”,找到这台 ECS 绑定的安全组,点击“入方向规则 - 添加规则”。按下面这样填:方向选“入方向”,协议端口选“TCP”,端口号填 22,源地址选“IP地址”,填 203.0.113.45/32,描述写“仅允许个人办公出口 IP SSH 登录”,然后确定。/32 表示只放行这一个 IP,是最小授权,宁可先紧后松。

第三步:删除或收紧 0.0.0.0/0 的 22 端口规则

这是最关键、也最容易手抖的一步。先确认第二步的新规则已经保存生效,再回到入方向规则列表,找到源地址为 0.0.0.0/0、端口为 22 的那条规则,点删除。如果安全组里还有其他业务端口的 0.0.0.0/0 规则,比如 80、443,那是网站对外服务的正常放行,不用动,只处理 22 端口这一条。

操作顺序千万别反:先加新规则、再删旧规则。如果先删旧规则,中间有几分钟窗口期自己也连不上;更稳妥的做法是先开一个已登录的 SSH 会话保持在线,再在控制台上改规则,万一改错了,还能通过已建立的会话把规则改回来。

第四步:确认规则生效

安全组规则保存后一般立即生效,不需要重启 ECS。重新打开一个终端,用 ssh -i ~/.ssh/id_rsa root@你的服务器公网IP 试一次,应该能正常登录;再用手机热点(另一个出口 IP)试一次,应该直接超时连不上——这正是我们要的效果。

三、配套加固:密钥登录 + 关闭密码登录

只靠安全组还不够,纵深防御要多做一层。我的做法是:

  1. 先确认本地密钥对完好,公钥已经写入服务器 ~/.ssh/authorized_keys,私钥权限是 600,authorized_keys 是 600,.ssh 目录是 700,权限太开放会导致密钥登录被 sshd 拒绝。

  2. 编辑 /etc/ssh/sshd_config,把 PasswordAuthentication 改为 no,PubkeyAuthentication 改为 yes,PermitRootLogin 改为 prohibit-password 或 no(视自己的使用习惯定,我用的是 prohibit-password,即 root 只允许密钥登录)。

  3. 执行 systemctl restart sshd 重启服务。重启前务必先开一个新终端验证密钥能登录,确认无误再退出旧会话,否则一旦配置写错、密钥又不对,就会把自己锁在门外。

  4. 顺手把 ChallengeResponseAuthentication 也设为 no,避免键盘交互式认证绕过密码关闭。

四、开启登录告警:下次攻击第一时间知道

加固之后我还开了两处告警:一是华为云主机安全服务(HSS)的暴力破解告警和异地登录告警,二是云监控的登录失败次数告警。告警通知绑定了我的邮箱和短信。这样即使未来再有扫描行为,几分钟内我就能收到提醒,而不是两天后才从邮件堆里翻出来。

五、踩过的三个坑

坑一:出口 IP 变了,自己被挡在门外。家用宽带重新拨号后出口 IP 变化,第二天我突然 SSH 超时。解决办法:通过华为云控制台的远程登录(VNC)进服务器排查,或用手机热点先确认,再在控制台把安全组规则里的源 IP 更新为新地址。后来我干脆把规则写成了一个小脚本,IP 变化时在控制台手动改一次,并把常用的几个出口 IP 都加进了规则。

坑二:误删规则后连不上,慌了神。第一次操作时我先删了 0.0.0.0/0 的规则才加新规则,中间断连了几分钟。正确顺序永远是“先加后删”,且改规则前保持一个已登录会话在线。

坑三:只改安全组,忘了 sshd 配置。安全组收紧后我以为万事大吉,检查时才发现 PasswordAuthentication 还是 yes。这意味着一旦某天安全组被误改放开,密码爆破立刻又有机会。安全组和 sshd 配置要双保险。

六、验证清单:照着打勾才算完工

加固完成后,我按下面这张清单逐项验证,全部通过才收工:

  • 用自己的出口 IP 通过 SSH 密钥能正常登录;
  • 用手机热点(非白名单 IP)连接 22 端口超时失败;
  • 用 nmap 从外网扫 22 端口,显示 filtered 而不是 open;
  • 故意用错误密码登录一次,确认提示 Permission denied (publickey),而不是要求输入密码;
  • 安全组入方向列表里已经没有 0.0.0.0/0 放行 22 端口的规则;
  • 控制台 HSS 告警和登录告警都已开启并收到测试通知。

结语

这次加固总共花了不到一小时,成本几乎为零,效果却是最实在的:扫描器再扫到我的 22 端口,得到的只是超时。云上安全没有一劳永逸的配置,安全组最小授权、密钥登录、登录告警这三件套,值得每一台对公网暴露 SSH 的 ECS 都配齐。如果你也有一台 22 端口全网放行的服务器,建议今晚就按上面的步骤改掉它——别等收到暴力破解告警才动手。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。