网络安全防护涉及访问控制和流量加密。通过定义网络策略,您可以限制服务之间的网络访问,只允许特定的流量通过。网络策略涉及很多方面,例如默认允许或拒绝规则、命名空间隔离、安全组设置等。通过加密传输的流量,可以确保敏感数据在传输过程中不被篡改或窃取。通过综合使用以上技术和措施,您可以增强服务之间的安全性和保护敏感数据的传输。
网络策略
在Kubernetes集群中,默认情况下允许所有Pod间的通信。在生产环境中这样的默认配置是不安全的。Kubernetes网络策略(Network Policy)为您提供了一种机制来限制Pod间的网络流量(通常称为东/西向流量)以及Pod和外部服务之间的网络流量。Network Policy使用Pod Selectors和Labels标签标识源和目的Pod,同时在策略中支持指定的IP地址、端口号和协议类型及组合。使用Terway容器网络时,如果您希望在IP地址或者端口层面控制网络流量,您可以为集群中特定应用配置网络策略。具体操作,请参见使用网络策略Network Policy和Kubernetes 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进行名称解析的全局规则。
执行以下命令,对命名空间添加标签。
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集群时,会默认自动为您分配一个安全组。该安全组允许集群内部节点之间的访问不受限制。出于安全考虑,您还可以继续收敛安全组出、入规则,实现集群的最小化访问规则。详细信息,请参见集群安全组出、入规则推荐配置。
更多信息,请参见ECS安全组配置案例和配置安全组。
传输加密
阿里云服务网格 ASM(Service Mesh)
ASM可以帮助您实现服务之间的传输加密,除了服务之间的双向TLS加密,也支持使用SDS(Envoy' s Secret Discovery Service)为服务网关提供HTTPS安全支持、证书动态加载,从而提升服务网关整体安全性。同时ASM支持配合阿里云应用高可用服务AHAS对部署在服务网格内的应用进行流量控制,通过集成阿里云链路追踪服务Tracing Analysis,为分布式应用的开发者提供完整的调用链路还原、调用请求量统计、链路拓扑、应用依赖分析等能力,可以帮助开发者快速分析和诊断分布式应用架构下的性能瓶颈,提升开发诊断效率。
通过Secret配置TLS证书实现HTTPS访问
集群中通过Ingress暴露的服务需要开启HTTPS访问。具体操作,请参见通过Secret配置TLS证书实现HTTPS访问。