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

网络策略

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

重要 Network Policy只适用于Terway集群。当集群节点数量较多(节点大于100),Network Policy的代理会给Kubernetes的管控带来较大压力,您可以通过优化大规模集群Network Policy进行调整。具体操作,请参见优化大规模Terway集群NetworkPolicy的扩展性

创建默认拒绝策略

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间的流量控制,请参见官方文档

限制应用Pod的网络流量

在以下应用场景中,您可以通过部署Network Policy限制到指定应用Pod的网络流量。

  • 仅允许指定的微服务能访问到该应用Pod服务。
  • 仅允许指定应用能访问到该数据库Pod。
  1. 执行以下命令,创建一个包含app-bookstorerole=api标签的应用Pod示例。
    kubectl run apiserver --image=nginx --labels="app=bookstore,role=api" --expose --port=80
  2. 使用以下模板并执行kubectl apply -f部署Network Policy限制。
    该限制表示只允许被包含app-bookstore标签的Pod的流量访问。
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: api-allow
    spec:
      podSelector:
        matchLabels:
          app: bookstore
          role: api
      ingress:
      - from:
          - podSelector:
              matchLabels:
                app: bookstore
  3. 执行以下命令,查看其它流量是否被拦截。
    kubectl run test-$RANDOM --rm -i -t --image=alpine -- sh

    预期输出:

    / # wget -qO- --timeout=2 http://apiserver
    wget: download timed out
  4. 执行以下命令,测试包含指定的app-bookstore标签的应用Pod流量是否被放行。
    kubectl run test-$RANDOM --rm -i -t --image=alpine --labels="app=bookstore,role=frontend" -- sh

    预期输出:

    / # wget -qO- --timeout=2 http://apiserver
    <!DOCTYPE html>
    <html><head>

增量添加规则选择性允许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/TCPALL/443, 1025-65535集群安全组
最小化出方向流量TCP443集群安全组
推荐出方向流量ALLALL0.0.0.0/0

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