ECS 安全组只放行指定 IP:一次 SSH 暴力破解后的加固实战
前言
上周三凌晨,我的华为云 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)试一次,应该直接超时连不上——这正是我们要的效果。
三、配套加固:密钥登录 + 关闭密码登录
只靠安全组还不够,纵深防御要多做一层。我的做法是:
-
先确认本地密钥对完好,公钥已经写入服务器 ~/.ssh/authorized_keys,私钥权限是 600,authorized_keys 是 600,.ssh 目录是 700,权限太开放会导致密钥登录被 sshd 拒绝。
-
编辑 /etc/ssh/sshd_config,把 PasswordAuthentication 改为 no,PubkeyAuthentication 改为 yes,PermitRootLogin 改为 prohibit-password 或 no(视自己的使用习惯定,我用的是 prohibit-password,即 root 只允许密钥登录)。
-
执行 systemctl restart sshd 重启服务。重启前务必先开一个新终端验证密钥能登录,确认无误再退出旧会话,否则一旦配置写错、密钥又不对,就会把自己锁在门外。
-
顺手把 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 端口全网放行的服务器,建议今晚就按上面的步骤改掉它——别等收到暴力破解告警才动手。
- 点赞
- 收藏
- 关注作者
评论(0)