网络安全

网络安全防护涉及访问控制和流量加密。通过定义网络策略,您可以限制服务之间的网络访问,只允许特定的流量通过。网络策略涉及很多方面,例如默认允许或拒绝规则、命名空间隔离、安全组设置等。通过加密传输的流量,可以确保敏感数据在传输过程中不被篡改或窃取。通过综合使用以上技术和措施,您可以增强服务之间的安全性和保护敏感数据的传输。

网络策略

在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集群时,会默认自动为您分配一个安全组。该安全组允许集群内部节点之间的访问不受限制。出于安全考虑,您还可以继续收敛安全组出、入规则,实现集群的最小化访问规则。详细信息,请参见集群安全组出、入规则推荐配置

更多信息,请参见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访问