云服务器运维与项目部署
13.7 安全组配置
Tip
你的家门上不仅有一把锁(密码),还有一道防盗门(防火墙)。Security Group (安全组) 就是这道云时代的防盗门。它决定了谁能敲你的门。
1. 为什么要学这个?
你买了个阿里云服务器,装好了 Nginx,但死活打不开网页。
你在服务器里 curl localhost 正常。
换台电脑 ping 也通。
千万别重装系统。99% 的原因是:云厂商默认只开了 22 端口,80 端口被安全组拦截了。
2. 核心概念:Inbound / Outbound
2.1 Inbound (入站)
- 谁进得来?
- 默认:全部拒绝 (Deny All)。
- 必须显式添加规则:允许所有人 (0.0.0.0/0) 访问 TCP 80 端口。
2.2 Outbound (出站)
- 谁出得去?
- 默认:全部允许 (Allow All)。
- 你的服务器要下载包、调 API,通常不需要限制出站。
3. 解决方案 (HOW)
3.1 通用配置策略 (最小权限原则)
不要开全端口 (All Traffic)。只开需要的。
| Port | Protocol | Source | 用途 | 备注 |
|---|---|---|---|---|
| 22 | TCP | 0.0.0.0/0 (或特定IP) | SSH 连接 | 必须开,建议设为仅限自己 IP |
| 80 | TCP | 0.0.0.0/0 | HTTP | 网站访问 |
| 443 | TCP | 0.0.0.0/0 | HTTPS | 网站访问 |
| 3306 | TCP | 禁用 / 仅限内网 | MySQL | 千万别开公网 |
3.2 流量过滤示意图
graph TD
Hacker["黑客"] --"Port 3306"--> Firewall
User["正常用户"] --"Port 443"--> Firewall
Firewall{"安全组 (Security Group)"}
Firewall --"Block"--> Drop["丢弃 (黑客无法连接)"]
Firewall --"Allow"--> Server["你的服务器"]
style Drop fill:#ffcdd2,stroke:#c62828
style Server fill:#c8e6c9,stroke:#2e7d32
4. 避坑指南
| ❌ 不要这样做 | ✅ 应该这样做 | 为什么 |
|---|---|---|
| Allow All | 白名单模式 | 上来就 Allow All TCP,你以为省事了,其实是把服务器裸奔在互联网上。 |
| 默认 SSH 端口 | 改 SSH 端口 | SSH 一直用 22。全球的扫描脚本都在扫 22 端口,改成 2222 可以避开 99% 的骚扰。 |
| 数据库公网 | 数据库内网 | 数据库开公网访问是勒索软件的最爱。数据库只应该被 WebServer 通过内网 IP 访问。 |
5. 真实案例
Story
2017年,MongoDB 勒索事件
2017年,数万个公网 MongoDB 被清洗,数据被删,只留下一封勒索信:“支付 0.2 比特币恢复数据”。
原因是 MongoDB 默认没有密码,且很多开发者为了方便调试,在安全组里开放了 27017 端口给 0.0.0.0/0。
黑客不需要任何高深技术,只需要一个扫描脚本就能把这些数据库洗劫一空。
Vibe 心法:内网是舒适区,公网是修罗场。安全组的配置应遵循“最小化原则”,只针对必要的服务开启必要的窗口。封锁非必要的数据库端口,是防止黑客勒索、确保业务存续的最廉价保险。
6. 本章小结
- 默认拒绝:安全组是默认拒绝的,不开就进不来。
- 按需开放:用一个开一个,用完记得关。
- 内网优先:能走内网通信的 (App->DB),绝不走公网。