You need to enable JavaScript to run this app.
导航

安全组配置最佳实践

最近更新时间2024.04.12 10:34:52

首次发布时间2024.03.14 10:34:09

本文主要介绍在容器服务(VKE)集群中进行安全组管理的一系列最佳实践。通过设置安全组,可以为 VKE 集群中的节点或 Pod 提供流量入口处的安全保障,杜绝实例受到非法访问乃至攻击。

每一个 VKE 集群在创建时,都会根据其网络模型生成默认安全组。在 Flannel 网络模型中,仅会生成节点默认安全组,而在 VPC-CNI 网络模型中,则会额外生成 Pod 默认安全组。安全组以白名单的形式工作,即只有符合安全组规则的流量可以被放行。默认安全组相关说明,请参见 安全组设置

基本原则

结合容器服务的特性,在配置安全组时,应该遵循以下基本原则:

  • 设置安全组端口时保证最小化原则,只允许指定的端口可以被访问。
  • 设置放行的源地址时保证最小化原则,建议不要使用0.0.0.0/0进行配置。
  • VKE 不允许直接使用 NodePort 类型的 Service 对外暴露 Pod 所提供的服务,因此配置安全组时,建议禁止集群以外的网络对象直接访问到节点对应云服务器(ECS)实例的 30000~32768 端口。
  • 建议不要为节点对应的 ECS 实例配置公网 IP(EIP)。
  • 建议使用应用型负载均衡(ALB)或者负载均衡(CLB)对外暴露 Pod 所提供的服务,同时确保安全组已放通上述云资源。
  • 位于同一个私有网络(VPC)内的网络对象(例如 Pod 、ECS 等)属于内部访问,可以完全放行。若有内部网络对象之间的隔离需求,管理人员可根据实际需求,单独配置规则。

VKE 端口介绍

VKE 使用主要端口及说明如下:

  • 22: 该端口为节点对应 ECS 的 SSH 应用端口,管理人员可以通过 VKE 控制台的 ECS Terminal 功能远程登录 ECS。
  • 6443: 该端口是 VKE 中 kube-apiserver 托管服务的入口。如果管理人员通过远程的客户端管理 VKE 集群,则该端口应面向远程客户端的 IP 地址放行。
  • 30000-32768:该端口是 NodePort 类型 Service 启动监听的端口段。Pod 通过该端口段暴露服务。

VKE 默认安全组

默认安全组是指随私有网络创建而自动创建,随私有网络删除而删除的安全组。 VKE 为保证集群和节点本身功能的正常运作,确保集群和节点之间的网络正常连通,避免绑定无效安全组造成集群功能异常,提供默认安全组。VKE 默认安全组详细的出、入方向规则,请参见 安全组设置

不同网络模型的集群,提供的默认安全组不同:

  • VPC-CNI 网络模型下的安全组
    在 VPC-CNI 网络模型集群中,Pod 的网络将直接从 VPC 的子网中分配,Pod 与 ECS 在网络上位于同一个平面。ALB 与 CLB 等云资源可以利用直通 Pod 的能力,直接将流量转发到 Pod 的真实 IP,免除对 NodePort 的依赖,故此可以专门为 Pod 提供一个单独的安全组,用于管控流量入口。
    alt
  • Flannel 网络下的安全组
    在 Flannel 网络模型集群中,Pod 位于由 Flannel 提供的虚拟网络中,网络流量的入口依赖于 ECS 类型 Node 提供的 NodePort。ALB 与 CLB 等云资源仅可以将流量转发到 Node 的指定端口上,故而由节点安全组统一管理流量放行。
    alt

最小化安全组最佳实践

默认生成的安全组适用于一般场景,在对网络安全要求较为严格的场景中,容器服务支持自行管理和配置最小化访问规则的安全组。您可以参考下文配置最小化安全组访问规则。更多自行管理的安全组规则相关说明,请参见 集群访问规则

在火山引擎安全组中,有如下较特殊的 IP 地址段:

  • 100.64.0.0/10:该地址段用于私有网络内云资源 IPv4 私网互通。
  • fd00:64::/32:该地址段用于私有网络内云资源 IPv6 私网互通。

面向 VKE 集群所发起的管控操作以及 ALB/CLB 等云资源的流量转发均来自上述两个地址段,因此可以利用上述两个地址段大规模替换 0.0.0.0/0

说明

IPv6 私网目前在 VPC 侧处于 邀测 阶段。更多介绍,请参见 搭建 IPv6 私有网络

VPC-CNI 最小化安全组

在 VPC-CNI 网络模型集群中,优化后的节点和 Pod 最小化规则安全组如下表所示。

  • 节点安全组

    协议端口范围源地址描述
    集群的私有网络仅使用 IPv4 CIDR 时:
    ALLALL******-common关联该节点默认安全组的所有网络对象可以自由访问。
    ALLALL******-pod关联该 Pod 默认安全组的所有网络对象可以自由访问。
    TCP22100.64.0.0/10仅允许集群管控服务访问节点对应 ECS 的 SSH 端口。
    TCP6443100.64.0.0/10仅允许集群管控服务访问集群 kube-apiserver 入口。
    TCP30000-32768100.64.0.0/10仅允许 ALB/CLB 等云资源访问 TCP 协议的 NodePort。
    UDP30000-32768100.64.0.0/10仅允许 ALB/CLB 等云资源访问 UDP 协议的 NodePort。
    集群的私有网络启用 IPv6 CIDR 时:
    TCP22fd00:64::/32仅允许集群管控服务访问节点对应 ECS 的 SSH 端口。
    TCP6443fd00:64::/32仅允许集群管控服务访问集群 kube-apiserver 入口。
    TCP30000-32768fd00:64::/32仅允许 ALB/CLB 等云资源访问 TCP 协议的 NodePort。
    UDP30000-32768fd00:64::/32仅允许 ALB/CLB 等云资源访问 UDP 协议的 NodePort。
  • Pod 安全组

    协议端口范围源地址描述
    集群的私有网络仅使用 IPv4 CIDR 时:
    ALLALL******-pod关联该 Pod 默认安全组的所有网络对象可以自由访问。
    ALLALL100.64.0.0/10仅允许 ALB/CLB 等云资源访问 Pod 所有端口。
    ALLALL******-common关联该节点默认安全组的所有网络对象可以自由访问。
    集群的私有网络启用 IPv6 CIDR 时:
    ALLALLfd00:64::/32仅允许 ALB/CLB 等云资源访问 Pod 所有端口。

Flannel 最小化安全组

在 Flannel 网络模型集群中,优化后的节点最小化规则安全组如下表所示。

协议端口范围源地址描述
集群的私有网络仅使用 IPv4 CIDR 时:
ALLALL******-common关联当前安全组的所有网络对象可以自由访问。
ALLALLx.x.x.x/xPod 可以自由访问节点对应的 ECS。x.x.x.x/x为 Pod CIDR。
TCP22100.64.0.0/10仅允许集群管控服务访问节点对应 ECS 的 SSH 端口。
TCP6443100.64.0.0/10仅允许集群管控服务访问集群 kube-apiserver 入口。
TCP30000-32768100.64.0.0/10仅允许 ALB/CLB 等云资源访问 TCP 协议的 NodePort。
UDP30000-32768100.64.0.0/10仅允许 ALB/CLB 等云资源访问 UDP 协议的 NodePort。
集群的私有网络启用 IPv6 CIDR 时:
TCP22fd00:64::/32仅允许集群管控服务访问节点对应 ECS 的 SSH 端口。
TCP6443fd00:64::/32仅允许集群管控服务访问集群 kube-apiserver 入口。
TCP30000-32768fd00:64::/32仅允许 ALB/CLB 等云资源访问 TCP 协议的 NodePort。
UDP30000-32768fd00:64::/32仅允许 ALB/CLB 等云资源访问 UDP 协议的 NodePort。

对四层 CLB 的特殊处理

CLB 提供四层流量转发能力,配置基于 CLB 实现的路由规则时安全组会产生透传,需要节点或 Pod 安全组放行来自客户端的访问流量。因此需要在上述最小化安全组中附加以下规则,以确保指定客户端的访问被放行。

协议端口范围源地址描述
ALL用户自定义端口x.x.x.x/x允许指定的客户端访问节点。x.x.x.x/x为客户端的公网 IP 地址或 CIDR。