本文主要介绍在容器服务(VKE)集群中进行安全组管理的一系列最佳实践。通过设置安全组,可以为 VKE 集群中的节点或 Pod 提供流量入口处的安全保障,杜绝实例受到非法访问乃至攻击。
每一个 VKE 集群在创建时,都会根据其网络模型生成默认安全组。在 Flannel 网络模型中,仅会生成节点默认安全组,而在 VPC-CNI 网络模型中,则会额外生成 Pod 默认安全组。安全组以白名单的形式工作,即只有符合安全组规则的流量可以被放行。默认安全组相关说明,请参见 安全组设置。
结合容器服务的特性,在配置安全组时,应该遵循以下基本原则:
0.0.0.0/0
进行配置。VKE 使用主要端口及说明如下:
默认安全组是指随私有网络创建而自动创建,随私有网络删除而删除的安全组。 VKE 为保证集群和节点本身功能的正常运作,确保集群和节点之间的网络正常连通,避免绑定无效安全组造成集群功能异常,提供默认安全组。VKE 默认安全组详细的出、入方向规则,请参见 安全组设置。
不同网络模型的集群,提供的默认安全组不同:
默认生成的安全组适用于一般场景,在对网络安全要求较为严格的场景中,容器服务支持自行管理和配置最小化访问规则的安全组。您可以参考下文配置最小化安全组访问规则。更多自行管理的安全组规则相关说明,请参见 集群访问规则。
在火山引擎安全组中,有如下较特殊的 IP 地址段:
面向 VKE 集群所发起的管控操作以及 ALB/CLB 等云资源的流量转发均来自上述两个地址段,因此可以利用上述两个地址段大规模替换 0.0.0.0/0 。
说明
IPv6 私网目前在 VPC 侧处于 邀测 阶段。更多介绍,请参见 搭建 IPv6 私有网络。
在 VPC-CNI 网络模型集群中,优化后的节点和 Pod 最小化规则安全组如下表所示。
节点安全组
协议 | 端口范围 | 源地址 | 描述 |
---|---|---|---|
集群的私有网络仅使用 IPv4 CIDR 时: | |||
ALL | ALL | ******-common | 关联该节点默认安全组的所有网络对象可以自由访问。 |
ALL | ALL | ******-pod | 关联该 Pod 默认安全组的所有网络对象可以自由访问。 |
TCP | 22 | 100.64.0.0/10 | 仅允许集群管控服务访问节点对应 ECS 的 SSH 端口。 |
TCP | 6443 | 100.64.0.0/10 | 仅允许集群管控服务访问集群 kube-apiserver 入口。 |
TCP | 30000-32768 | 100.64.0.0/10 | 仅允许 ALB/CLB 等云资源访问 TCP 协议的 NodePort。 |
UDP | 30000-32768 | 100.64.0.0/10 | 仅允许 ALB/CLB 等云资源访问 UDP 协议的 NodePort。 |
集群的私有网络启用 IPv6 CIDR 时: | |||
TCP | 22 | fd00:64::/32 | 仅允许集群管控服务访问节点对应 ECS 的 SSH 端口。 |
TCP | 6443 | fd00:64::/32 | 仅允许集群管控服务访问集群 kube-apiserver 入口。 |
TCP | 30000-32768 | fd00:64::/32 | 仅允许 ALB/CLB 等云资源访问 TCP 协议的 NodePort。 |
UDP | 30000-32768 | fd00:64::/32 | 仅允许 ALB/CLB 等云资源访问 UDP 协议的 NodePort。 |
Pod 安全组
协议 | 端口范围 | 源地址 | 描述 |
---|---|---|---|
集群的私有网络仅使用 IPv4 CIDR 时: | |||
ALL | ALL | ******-pod | 关联该 Pod 默认安全组的所有网络对象可以自由访问。 |
ALL | ALL | 100.64.0.0/10 | 仅允许 ALB/CLB 等云资源访问 Pod 所有端口。 |
ALL | ALL | ******-common | 关联该节点默认安全组的所有网络对象可以自由访问。 |
集群的私有网络启用 IPv6 CIDR 时: | |||
ALL | ALL | fd00:64::/32 | 仅允许 ALB/CLB 等云资源访问 Pod 所有端口。 |
在 Flannel 网络模型集群中,优化后的节点最小化规则安全组如下表所示。
协议 | 端口范围 | 源地址 | 描述 |
---|---|---|---|
集群的私有网络仅使用 IPv4 CIDR 时: | |||
ALL | ALL | ******-common | 关联当前安全组的所有网络对象可以自由访问。 |
ALL | ALL | x.x.x.x/x | Pod 可以自由访问节点对应的 ECS。x.x.x.x/x 为 Pod CIDR。 |
TCP | 22 | 100.64.0.0/10 | 仅允许集群管控服务访问节点对应 ECS 的 SSH 端口。 |
TCP | 6443 | 100.64.0.0/10 | 仅允许集群管控服务访问集群 kube-apiserver 入口。 |
TCP | 30000-32768 | 100.64.0.0/10 | 仅允许 ALB/CLB 等云资源访问 TCP 协议的 NodePort。 |
UDP | 30000-32768 | 100.64.0.0/10 | 仅允许 ALB/CLB 等云资源访问 UDP 协议的 NodePort。 |
集群的私有网络启用 IPv6 CIDR 时: | |||
TCP | 22 | fd00:64::/32 | 仅允许集群管控服务访问节点对应 ECS 的 SSH 端口。 |
TCP | 6443 | fd00:64::/32 | 仅允许集群管控服务访问集群 kube-apiserver 入口。 |
TCP | 30000-32768 | fd00:64::/32 | 仅允许 ALB/CLB 等云资源访问 TCP 协议的 NodePort。 |
UDP | 30000-32768 | fd00:64::/32 | 仅允许 ALB/CLB 等云资源访问 UDP 协议的 NodePort。 |
CLB 提供四层流量转发能力,配置基于 CLB 实现的路由规则时安全组会产生透传,需要节点或 Pod 安全组放行来自客户端的访问流量。因此需要在上述最小化安全组中附加以下规则,以确保指定客户端的访问被放行。
协议 | 端口范围 | 源地址 | 描述 |
---|---|---|---|
ALL | 用户自定义端口 | x.x.x.x/x | 允许指定的客户端访问节点。x.x.x.x/x 为客户端的公网 IP 地址或 CIDR。 |