华为云 ECS 安全组配置的 5 个常见误区,你踩过几个?
华为云 ECS 安全组配置的 5 个常见误区,你踩过几个?
安全组是华为云 ECS 的第一道"虚拟防火墙",配置得当能挡住绝大多数网络攻击。但实际工作中,很多人对安全组的理解停留在"放通端口就能访问"的层面,导致生产环境裸奔在公网下而不自知。本文盘点 5 个最常见的配置误区,每个都附上错误配置、正确配置和排查方法,看看你踩过几个。
先搞清楚:安全组到底是什么?
安全组是华为云 VPC 提供的实例级别的虚拟防火墙,作用在 ECS 网卡上。它通过白名单机制工作——默认拒绝所有流量,只有明确放通的规则才允许通过。
一个安全组包含:
- 入方向规则(ingress):控制外部访问 ECS 的流量
- 出方向规则(egress):控制 ECS 主动外出的流量
一个 ECS 可以关联多个安全组,多个安全组的规则取并集(全部允许的叠加,只要有一个安全组允许,就放行)。
理解了这些基础,下面来看 5 个误区。
误区一:图省事放通 0.0.0.0/0 所有端口
❌ 错误配置
| 方向 | 协议 | 端口 | 源地址 |
|---|---|---|---|
| 入方向 | TCP | 1-65535 | 0.0.0.0/0 |
| 入方向 | UDP | 1-65535 | 0.0.0.0/0 |
这是最常见也最危险的配置。为了"省得以后再开端口",直接把所有 TCP/UDP 端口对全网开放。等于把 ECS 变成了一台没有防火墙的公网服务器,任何人都能尝试连接你的 SSH、数据库、Redis、管理后台……
✅ 正确配置
按需放通,只开实际需要的端口,且限制源地址:
| 方向 | 协议 | 端口 | 源地址 | 说明 |
|---|---|---|---|---|
| 入方向 | TCP | 22 | 你的办公 IP/32 | SSH 只允许你的 IP |
| 入方向 | TCP | 80 | 0.0.0.0/0 | HTTP 对外开放 |
| 入方向 | TCP | 443 | 0.0.0.0/0 | HTTPS 对外开放 |
| 入方向 | TCP | 3306 | 192.168.1.0/24 | MySQL 只允许内网访问 |
🔍 排查方法
在 ECS 控制台查看安全组规则,如果看到源地址列出现 0.0.0.0/0 且端口范围很大,就要警惕。也可以用 hcloud CLI 快速检查:
# 列出指定安全组的所有规则
hcloud VPC ShowSecurityGroupRules --security-group-id <安全组ID> --cli-output json
重点看 direction=ingress 且 remote_ip_prefix=0.0.0.0/0 的规则,端口范围是否过大。
💡 实用建议
- SSH(22 端口)永远不要对 0.0.0.0/0 开放,用跳板机或 VPN 代替
- 数据库端口(3306、5432、6379 等)只开内网网段,不开公网
- 如果办公 IP 是动态的,考虑用 NAT 网关 + VPN 组合,而不是开放公网
误区二:只配入方向,忘了出方向
❌ 错误配置
很多人只关注"外面怎么访问进来",完全不管"ECS 主动出去访问什么"。默认安全组的出方向规则通常是放通所有的:
| 方向 | 协议 | 端口 | 目的地址 |
|---|---|---|---|
| 出方向 | 全部 | 全部 | 0.0.0.0/0 |
这意味着你的 ECS 可以主动连接任何外部 IP 的任何端口。如果 ECS 被植入恶意程序,它可以自由地向外发送数据、连接 C2 服务器、下载恶意载荷。
✅ 正确配置
生产环境应该限制出方向,只允许必要的对外访问:
| 方向 | 协议 | 端口 | 目的地址 | 说明 |
|---|---|---|---|---|
| 出方向 | TCP | 443 | 0.0.0.0/0 | 允许 HTTPS 外联(API 调用等) |
| 出方向 | TCP | 80 | 0.0.0.0/0 | 允许 HTTP 外联(软件源等) |
| 出方向 | TCP | 3306 | 192.168.1.0/24 | 访问内网 MySQL |
| 出方向 | TCP | 53 | 192.168.0.0/16 | 内网 DNS 解析 |
| 出方向 | UDP | 53 | 192.168.0.0/16 | 内网 DNS 解析 |
🔍 排查方法
# 查看出方向规则
hcloud VPC ShowSecurityGroupRules --security-group-id <安全组ID> --cli-output json | jq '.security_group_rules[] | select(.direction=="egress")'
如果出方向有 port_range_min=1, port_range_max=65535, remote_ip_prefix=0.0.0.0/0,说明出方向完全不限。
💡 实用建议
- 出方向至少限制端口范围,不要让 ECS 随意连接外部高位端口
- 如果 ECS 只需要访问华为云内部服务(OBS、RDS 等),出方向可以限制为内网网段
- 日志/监控数据上报端口单独放通,其他端口收紧
误区三:以为安全组规则有优先级,越靠前越优先
❌ 错误认知
很多人从传统防火墙(iptables、安全设备)迁移过来,以为安全组规则像防火墙一样按顺序匹配,命中即停止。于是花很多时间调整规则顺序,或者担心"放通规则在拒绝规则前面会导致拒绝规则失效"。
✅ 实际机制
华为云安全组规则没有优先级概念,所有规则是平等的叠加关系:
- 只要任意一条规则允许该流量,就放行
- 不存在 deny 规则(安全组是纯白名单机制,默认拒绝,显式允许)
- 规则的先后顺序不影响最终结果
举个例子,以下两条规则效果完全一样,不管谁在前:
| 规则 | 协议 | 端口 | 源地址 |
|---|---|---|---|
| 规则 A | TCP | 80 | 0.0.0.0/0 |
| 规则 B | TCP | 80 | 10.0.0.0/8 |
最终效果:任何 IP 都能访问 80 端口(规则 A 已经放通了全网,规则 B 是子集,叠加后还是全网)。
🔍 排查方法
如果你发现自己花了很多时间调整规则顺序,停下来——那不是问题所在。检查是否有范围重叠的规则,合并它们就好。
💡 实用建议
- 不要纠结规则顺序,关注规则是否有多余或冲突
- 如果想实现"允许 A 网段但拒绝 A 中的 B IP"这种需求,安全组做不到(它没有 deny 规则),需要用网络 ACL(VPC 级别的防火墙,支持 deny)或在 ECS 内部用 iptables 补充
误区四:多安全组叠加时以为"取交集"
❌ 错误认知
一个 ECS 关联了多个安全组,有人以为流量需要同时满足所有安全组的规则才能通过(取交集)。于是创建了两个安全组,一个放通 80,一个放通 443,以为这样就能"只允许 80 和 443"。
✅ 实际机制
多安全组是取并集——只要任意一个安全组允许该流量,就放行。
举个例子:
- 安全组 A:放通 TCP 80
- 安全组 B:放通 TCP 22(0.0.0.0/0)
ECS 同时关联 A 和 B,最终效果:80 和 22 都对公网开放。如果你以为"两个安全组取交集,只有 80 能通",那就危险了——SSH 22 端口实际上对全网开放了。
🔍 排查方法
# 查看 ECS 关联了哪些安全组
hcloud ECS ShowServer --server-id <ECS实例ID> --cli-output json | jq '.server.security_groups'
然后逐个检查每个安全组的规则,把所有入方向允许的规则叠加在一起,看最终效果是否如你预期。
💡 实用建议
- 尽量用一个安全组管理一台 ECS 的所有规则,减少叠加带来的混乱
- 如果必须用多个安全组(比如公共安全组 + 专用安全组),确保公共安全组的规则是你能接受的最大放通范围
- 定期审计:列出 ECS 关联的所有安全组,叠加规则,看是否有意外放通的端口
误区五:测试环境的配置直接复制到生产环境
❌ 错误做法
开发测试时为了方便,安全组放得很宽(0.0.0.0/0 开 22、3306、6379……),上线时直接把这个安全组配置复制到生产环境。测试环境无所谓,生产环境也这么裸奔,直到被扫描才后知后觉。
✅ 正确做法
生产环境的安全组应该从头设计,遵循最小权限原则:
第一步:列出 ECS 需要对外提供的所有服务
| 服务 | 端口 | 谁需要访问 | 源地址 |
|---|---|---|---|
| Web 服务 | 80/443 | 所有用户 | 0.0.0.0/0 |
| SSH 管理 | 22 | 运维人员 | 跳板机 IP/32 或 VPN 网段 |
| 健康检查 | 8080 | ELB | ELB 内网 IP 段 |
第二步:逐条配置,每条规则都要问"谁需要访问?从哪里来?"
第三步:用 Terraform 管理,避免手动改动导致漂移
# 生产环境安全组 - 最小权限配置
resource "huaweicloud_networking_secgroup" "prod_web" {
name = "prod-web-sg"
description = "生产环境 Web 服务器安全组"
# 删除默认的出方向全放通规则
delete_default_rules = true
}
# 入方向:只放通必要端口
resource "huaweicloud_networking_secgroup_rule" "allow_http" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
remote_ip_prefix = "0.0.0.0/0"
security_group_id = huaweicloud_networking_secgroup.prod_web.id
}
resource "huaweicloud_networking_secgroup_rule" "allow_https" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 443
port_range_max = 443
remote_ip_prefix = "0.0.0.0/0"
security_group_id = huaweicloud_networking_secgroup.prod_web.id
}
# SSH 只允许跳板机访问
resource "huaweicloud_networking_secgroup_rule" "allow_ssh_from_bastion" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_ip_prefix = "192.168.0.10/32" # 跳板机 IP
security_group_id = huaweicloud_networking_secgroup.prod_web.id
}
# 出方向:只允许 HTTPS 和内网 MySQL
resource "huaweicloud_networking_secgroup_rule" "allow_egress_https" {
direction = "egress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 443
port_range_max = 443
remote_ip_prefix = "0.0.0.0/0"
security_group_id = huaweicloud_networking_secgroup.prod_web.id
}
resource "huaweicloud_networking_secgroup_rule" "allow_egress_mysql" {
direction = "egress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 3306
port_range_max = 3306
remote_ip_prefix = "192.168.1.0/24" # 内网 MySQL 网段
security_group_id = huaweicloud_networking_secgroup.prod_web.id
}
注意上面 delete_default_rules = true 这一行——它会删除安全组创建时默认的"出方向全放通"规则,然后我们再按需添加出方向规则。这是很多人忽略的一步。
🔍 排查方法
# 对比测试和生产安全组规则数量
hcloud VPC ShowSecurityGroupRules --security-group-id <测试安全组ID> --cli-output json | jq '.security_group_rules | length'
hcloud VPC ShowSecurityGroupRules --security-group-id <生产安全组ID> --cli-output json | jq '.security_group_rules | length'
# 如果两者规则数量和内容几乎一样,说明生产环境可能直接复制了测试配置
💡 实用建议
- 生产环境安全组应该有独立的命名规范(如
prod-web-sg、prod-db-sg),和测试环境区分 - 用 Terraform 或代码管理安全组,不要在控制台手动改——手动改的容易忘,也不好审计
- 上线前做一次安全组审计:列出所有入方向规则,逐条确认源地址是否合理
总结:一张表记住所有要点
| 误区 | 核心问题 | 一句话记住 |
|---|---|---|
| 0.0.0./0 全开 | 公网裸奔 | 按需放通,SSH 永不对公网开 |
| 忽略出方向 | ECS 可随意外联 | 出方向也要限制端口和目的地址 |
| 以为有优先级 | 白费功夫调顺序 | 安全组是白名单叠加,没有 deny |
| 多安全组取交集 | 意外放通端口 | 多安全组取并集,不是交集 |
| 测试配置直接上生产 | 生产裸奔 | 生产安全组从头设计,最小权限 |
安全组配置看似简单,但它是云上安全的第一道防线。很多云上安全事件,追根溯源都是安全组配错了。花 10 分钟审计一下你的安全组规则,比出事后再补救划算得多。
每日一问:你的生产环境 ECS 安全组,入方向有几条规则是
0.0.0.0/0?如果超过 2 条(通常只有 HTTP/HTTPS),建议立刻检查。
- 点赞
- 收藏
- 关注作者
评论(0)