本文主要介绍网络安全防护涉及的两个方面:服务之间网络流量的访问控制和传输过程中的流量加密。
网络策略
在Kubernetes集群中,默认情况下允许所有Pod间的通信。在生产环境中这样的默认配置是不安全的。Kubernetes网络策略(Network Policy)
为您提供了一种机制来限制Pod间的网络流量(通常称为东/西向流量)以及Pod和外部服务之间的网络流量。Network Policy使用Pod Selectors和Labels标签标识源和目的Pod,同时在策略中支持指定的IP地址,端口号和协议类型及组合。使用Terway容器网络时,如果您希望在IP地址或者端口层面控制网络流量,您可以为集群中特定应用配置网络策略。具体操作,请参见使用网络策略Network Policy和Kubernetes Network Policy Recipes。
创建默认拒绝策略
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进行名称解析的全局规则。
- 执行以下命令对命名空间添加标签。
kubectl label namespace kube-system name=kube-system
- 使用以下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。
- 执行以下命令,创建一个包含
app-bookstore
和role=api
标签的应用Pod示例。kubectl run apiserver --image=nginx --labels="app=bookstore,role=api" --expose --port=80
- 使用以下模板并执行
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
- 执行以下命令,查看其它流量是否被拦截。
kubectl run test-$RANDOM --rm -i -t --image=alpine -- sh
预期输出:
/ # wget -qO- --timeout=2 http://apiserver wget: download timed out
- 执行以下命令,测试包含指定的
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/TCP | ALL/443, 1025-65535 | 集群安全组 | 无 |
最小化出方向流量 | TCP | 443 | 无 | 集群安全组 |
推荐出方向流量 | ALL | ALL | 无 | 0.0.0.0/0 |
更多信息,请参见ECS安全组配置案例和配置安全组。