本文主要介绍网络安全防护涉及的两个方面:服务之间网络流量的访问控制和传输过程中的流量加密。

网络策略

在Kubernetes集群中,默认情况下允许所有Pod间的通信。在生产环境中这样的默认配置是不安全的。Kubernetes网络策略(Network Policy)为您提供了一种机制来限制Pod间的网络流量(通常称为东/西向流量)以及Pod和外部服务之间的网络流量。Network Policy使用Pod Selectors和Labels标签标识源和目的Pod,同时在策略中支持指定的IP地址,端口号和协议类型及组合。使用Terway容器网络时,如果您希望在IP地址或者端口层面控制网络流量,您可以为集群中特定应用配置网络策略。具体操作,请参见使用网络策略Network PolicyKubernetes Network Policy Recipes

注意 在大规模生产环境中使用Network Policy会对API Server造成压力,请谨慎使用。

创建默认拒绝策略

RBAC策略一样,创建Network policy同样应遵循最低权限访问原则。应创建一个默认拒绝(Deny All)策略限制来自命名空间的所有入站和出站流量,或者使用Calico创建一个全局策略。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

创建允许DNS查询的规则

设置了默认的Deny All规则,您就可以开始对其他规则进行分层,例如允许Pod查询CoreDNS进行名称解析的全局规则。

  1. 执行以下命令对命名空间添加标签。
    kubectl label namespace kube-system name=kube-system
  2. 使用以下YAML示例创建Network Policy
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-dns-access
      namespace: default
    spec:
      podSelector:
        matchLabels: {}
      policyTypes:
      - Egress
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              name: kube-system
        ports:
        - protocol: UDP
          port: 53
    注意 关于如何在Kubernetes Network Policy中配置Pod间的流量控制,请参见官方文档
以下示例说明了如何将网络策略与服务帐户ali-sa关联,以及如何防止与readonly-sa-group RBAC组绑定的readonly-sa-role角色来编辑默认命名空间中的服务账户ali-sa。
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ali-sa
  namespace: default
  labels:
    name: ali-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: readonly-sa-role
rules:
# 允许受试者读取名为ali sa的服务帐户。
- apiGroups: [""]
  resources: ["serviceaccounts"]
  resourceNames: ["ali-sa"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: readonly-sa-rolebinding
# 将只读sa角色绑定到名为只读sa组的RBAC组。
subjects:
- kind: Group
  name: readonly-sa-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: readonly-sa-role
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
  name: netpol-sa-demo
  namespace: default
# 允许对引用的默认命名空间中的服务的所有入口流量。
# 参考名为ali sa的服务帐户。
spec:
  ingress:
    - action: Allow
      source:
        serviceAccounts:
          selector: 'name == "ali-sa"'
  selector: all()

增量添加规则以选择性地允许Namespaces/Pods之间的流量

首先允许命名空间内的Pod相互通信,然后添加自定义规则,进一步限制该命名空间内的Pod和Pod间的通信。更多信息,请参见Kubernetes Network Policy Recipes

对网络流量数据进行分析监控

阿里云VPC提供流日志功能,可以记录VPC网络中弹性网卡ENI(Elastic Network Interface)传入和传出的流量信息,帮助您检查访问控制规则、监控网络流量和排查网络故障。通过分析这些信息可以查找VPC内资源(包括Pod)之间的异常流量。更多信息,请参见流日志概述

安全组

ACK使用安全组来约束控制平面节点和节点之间的网络流量。安全组还用于控制节点、其他VPC资源和外部IP地址之间的流量。当创建ACK集群时,会默认自动为您分配一个安全组。该安全组允许集群内部节点之间的访问不受限制。出于安全考虑您还可以继续收敛安全组规则,您可以参考下面表格中的最小化出入方向配置,在此基础上根据业务出入网需要进行增量配置:

出入方向流量 协议 端口范围 目的
最小化入方向流量(来自控制平面和其他节点) TCP 您希望用于节点间通信的协议 443,10250您希望用于节点间通信的端口 集群安全组
推荐入方向流量 ALL/TCP ALL/443, 1025-65535 集群安全组
最小化出方向流量 TCP 443 集群安全组
推荐出方向流量 ALL ALL 0.0.0.0/0

更多信息,请参见ECS安全组配置案例配置安全组