本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
网络安全
提示
通过亚马逊 EKS 研讨会探索
网络安全有几个方面。第一个涉及应用限制服务之间网络流量流动的规则。第二个涉及在传输过程中对流量进行加密。在 EKS 上实施这些安全措施的机制多种多样,但通常包括以下项目:
交通管制
-
网络策略
-
安全组
网络加密
-
服务网格
-
入口控制器和负载均衡器
-
Nitro 实例
-
带有证书管理器的 ACM 私有 CA
网络策略
在 Kubernetes 集群中,默认情况下允许所有 Pod 与 Pod 的通信。尽管这种灵活性可能有助于促进实验,但它并不安全。Kubernetes 网络策略为你提供了一种限制 Pod 之间的网络流量(通常称为 East/West流量)以及 Pod 与外部服务之间的网络流量的机制。Kubernetes 网络策略在 OSI 模型的第 3 层和第 4 层运行。网络策略使用 pod、命名空间选择器和标签来识别源和目标 Pod,但也可以包括 IP 地址、端口号、协议或它们的组合。网络策略可以应用于 Pod 的入站或出站连接,通常称为入口和出口规则。
借助 Amazon VPC CNI 插件的原生网络策略支持,您可以实施网络策略来保护 kubernetes 集群中的网络流量。它与上游 Kubernetes 网络策略 API 集成在一起,确保了兼容性并遵守了 Kubernetes 标准。您可以使用上游 API 支持的不同
重要
首次配置 EKS 集群时,默认情况下未启用 VPC CNI 网络策略功能。确保您部署了支持的 VPC CNI Add-on 版本,并将 vpc-cni 插件true上的ENABLE_NETWORK_POLICY标志设置为以启用此功能。有关详细说明,请参阅亚马逊 EKS 用户指南。
建议
网络策略入门-遵循最小权限原则
创建默认拒绝策略
与 RBAC 策略一样,建议在网络策略中遵循最低权限访问原则。首先,创建一个 “全部拒绝” 策略,限制命名空间中的所有入站和出站流量。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {} policyTypes: - Ingress - Egress
默认拒绝
注意
上面的图片是由 Tufin
创建允许 DNS 查询的规则
一旦设置了默认的 “全部拒绝” 规则,就可以开始对其他规则进行分层,例如允许 pod 查询 CoreDNS 以进行名称解析的规则。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns-access namespace: default spec: podSelector: matchLabels: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53
允许 dns 访问
逐步添加规则,有选择地允许两者之间的流量流动 namespaces/pods
了解应用程序要求并根据需要创建精细的入口和出口规则。以下示例显示如何将端口 80 上的入口流量限制为 f app-one ro client-one m。这有助于最大限度地减少攻击面并降低未经授权访问的风险。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ingress-app-one namespace: default spec: podSelector: matchLabels: k8s-app: app-one policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: k8s-app: client-one ports: - protocol: TCP port: 80
允许进入应用程序一
监控网络策略的执行
-
使用网络策略编辑器
-
网络策略编辑器
有助于实现可视化、安全评分以及从网络流日志自动生成 -
以交互方式制定网络策略
-
-
审计日志
-
定期查看 EKS 集群的审计日志
-
审计日志提供了有关在集群上执行了哪些操作的大量信息,包括对网络策略的更改
-
使用此信息跟踪网络策略随时间推移而发生的变化,并检测任何未经授权或意外的更改
-
-
自动测试
-
通过创建反映您的生产环境的测试环境来实施自动测试,并定期部署企图违反网络策略的工作负载。
-
-
监控指标
-
配置您的可观察性代理以从 VPC CNI 节点代理中抓取 prometheus 指标,从而监控代理运行状况和 sdk 错误。
-
-
定期审核网络策略
-
定期审核您的网络策略,确保它们符合您当前的应用程序要求。随着应用程序的发展,审计使您有机会删除冗余的入口和出口规则,并确保您的应用程序没有过多的权限。
-
-
使用开放策略代理 (OPA) 确保存在网络策略
-
使用如下所示的 OPA 策略来确保在加载应用程序 pod 之前网络策略始终存在。
k8s-app: sample-app如果不存在相应的网络策略,则此政策会拒绝使用带有标签的 k8s pod 加载。
-
package kubernetes.admission import data.kubernetes.networkpolicies deny[msg] { input.request.kind.kind == "Pod" pod_label_value := {v["k8s-app"] | v := input.request.object.metadata.labels} contains_label(pod_label_value, "sample-app") np_label_value := {v["k8s-app"] | v := networkpolicies[_].spec.podSelector.matchLabels} not contains_label(np_label_value, "sample-app") msg:= sprintf("The Pod %v could not be created because it is missing an associated Network Policy.", [input.request.object.metadata.name]) } contains_label(arr, val) { arr[_] == val }
问题排查
监控 vpc-网络策略控制器、节点代理日志
启用 EKS 控制平面控制器管理器日志来诊断网络策略功能。您可以将控制平面日志流式传输到CloudWatch 日志组,并使用CloudWatch日志见解执行高级查询。从日志中,您可以查看哪些 pod 端点对象已解析为网络策略、策略的协调状态,以及调试该策略是否按预期运行。
此外,亚马逊 VPC CNI 允许您从 EKS 工作节点收集策略执行日志并将其导出到
亚马逊 VPC CNI 还提供了一个软件开发工具包,该软件开发工具包提供了与节点上的 eBPF 程序进行交互的接口。将 SDK 部署到节点上时即会安装。aws-node你可以找到安装在节点/opt/cni/bin目录下的 SDK 二进制文件。在发布时,SDK 为检查 eBPF 程序和地图等基本功能提供支持。
sudo /opt/cni/bin/aws-eks-na-cli ebpf progs
记录网络流量元数据
AWS VPC 流量日志捕获有关流经 VPC 的流量的元数据,例如源和目标 IP 地址和端口以及accepted/dropped 数据包。可以分析这些信息,以查找 VPC 内资源(包括 Pod)之间的可疑或异常活动。但是,由于 pod 的 IP 地址在被替换时经常发生变化,因此 Flow Log 本身可能不够。Calico Enterprise 使用容器标签和其他元数据扩展了流量日志,使解密容器之间的流量变得更加容易。
安全组
EKS 使用 AWS VPC 安全组 (SG) 来控制 Kubernetes 控制平面和集群工作节点之间的流量。安全组还用于控制工作节点、其他 VPC 资源和外部 IP 地址之间的流量。当您配置 EKS 集群(使用 Kubernetes 版本 1.14-eks.3 或更高版本)时,会自动为您创建集群安全组。该安全组允许 EKS 控制平面和托管节点组中的节点之间不受限制的通信。为简单起见,建议您将集群 SG 添加到所有节点组,包括非托管节点组。
在 Kubernetes 版本 1.14 和 EKS 版本 eks.3 之前,为 EKS 控制平面和节点组配置了单独的安全组。控制平面和节点组安全组的最低和建议规则可以在控制平面安全组的最低规则https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html.中找到。控制平面安全组的最低规则允许端口 443 从工作节点 SG 入站。这条规则允许 kubelet 与 Kubernetes API 服务器进行通信。它还包括端口 10250,用于流向工作节点 SG 的出站流量;10250 是 kubelet 监听的端口。同样,最低节点组规则允许端口 10250 从控制平面 SG 入站,443 出站到控制平面 SG。最后,还有一条规则允许节点组中的节点之间进行不受限制的通信。
如果您需要控制在集群内运行的服务与在集群外运行的服务(例如 RDS 数据库)之间的通信,请考虑为 pod 设置安全组。使用容器安全组,您可以将现有的安全组分配给一组 pod。
警告
如果您引用的安全组在创建 pod 之前不存在,则无法调度 pod。
您可以通过创建SecurityGroupPolicy对象并指定 a PodSelector 或 a 来控制将哪些 pod 分配给安全组ServiceAccountSelector。将选择器设置为{}会将中引用的 SG 分配给命名空间中的所有 pod 或命名空间中的所有服务帐户。SecurityGroupPolicy在为 pod 实施安全组之前,请务必熟悉所有注意事项。
重要
如果您将 SG 用于 Pod,则必须创建允许端口 53 出站到集群安全组的 SG。同样,你必须更新集群安全组以接受来自 pod 安全组的端口 53 入站流量。
重要
在 pod 使用安全组时,安全组的限制仍然适用,因此请谨慎使用它们。
重要
您必须为所有为 pod 配置的探测器为来自集群安全组 (kubelet) 的入站流量创建规则。
重要
Pod 的安全组依赖于一项名为 ENI 中继的功能,该功能旨在提高 EC2 实例的 ENI 密度。将容器分配给 SG 时,VPC 控制器会将节点组中的分支 ENI 与该容器关联起来。如果在调度 pod 时节点组中没有足够的分支 ENI 可用,则该 Pod 将保持待定状态。一个实例可以支持的分支 ENI 的数量因实例 type/family而异。有关更多详细信息,请参见 https://docs.aws.amazon.com/eks/latest/userguide/security-groups-for-pods.html #supported-instance-types。
虽然 pod 的安全组提供了一 AWS-native 种无需策略守护程序开销即可控制集群内外的网络流量的方法,但还有其他选项可供选择。例如,Cilium 策略引擎允许您在网络策略中引用 DNS 名称。Calico 企业版包含将网络策略映射到 AWS 安全组的选项。如果您已经实现了像 Istio 这样的服务网格,则可以使用出口网关将网络出口限制到特定的、完全合格的域或 IP 地址。有关此选项的更多信息,请阅读有关 Istio 中
何时为 Pod 使用网络策略与安全组?
何时使用 Kubernetes 网络策略
-
控制 pod 到 pod 的流量
-
适用于控制集群内各个 Pod 之间的网络流量(东西向流量)
-
-
在 IP 地址或端口级别控制流量(OSI 第 3 层或第 4 层)
何时为 pod 使用 AWS 安全组 (SGP)
-
利用现有的 AWS 配置
-
如果您已经拥有一组复杂的 EC2 安全组来管理 AWS 服务的访问权限,并且您正在将应用程序从 EC2 实例迁移到 EKS,那么 SGP 可能是一个非常不错的选择,允许您重复使用安全组资源并将其应用到您的 pod 中。
-
-
控制对 AWS 服务的访问权限
-
在 EKS 集群中运行的应用程序希望与其他 AWS 服务(RDS 数据库)通信,使用 SGP 作为一种有效机制来控制从 Pod 到 AWS 服务的流量。
-
-
隔离 Pod 和节点流量
-
如果你想将 Pod 流量与其他节点流量完全分开,请在
POD_SECURITY_GROUP_ENFORCING_MODE=strict模式下使用 SGP。
-
为 pod 使用安全组和网络策略的最佳实践
-
分层安全
-
结合使用 SGP 和 kubernetes 网络策略来实现分层安全方法
-
使用 SGP 限制对不属于集群的 AWS 服务的网络级别访问,而 kubernetes 网络策略可以限制集群内的 Pod 之间的网络流量
-
-
最低特权原则
-
只允许 pod 或命名空间之间必要的流量
-
-
对您的应用程序进行细分
-
尽可能按网络策略对应用程序进行分段,以便在应用程序遭到入侵时缩小爆炸半径
-
-
保持政策简单明了
-
Kubernetes 网络策略可能非常精细和复杂,最好使它们尽可能简单,以降低配置错误的风险并减轻管理开销
-
-
缩小攻击面
-
通过限制应用程序的暴露来最大限度地减少攻击面
-
重要
Pod 的安全组提供两种强制模式:strict和standard。在 EKS 集群中同时使用网络策略和安全组来实现 pod 功能时,必须使用standard模式。
在网络安全方面,分层方法通常是最有效的解决方案。结合使用 kubernetes 网络策略和 SGP 可以为在 EKS 中运行的应用程序提供强大的深度防御策略。
服务网格策略实施或 Kubernetes 网络策略
A service mesh 是专用的基础架构层,您可以将其添加到应用程序中。它允许您透明地添加可观察性、流量管理和安全性等功能,而无需将其添加到自己的代码中。
服务网格在 OSI 模型的第 7 层(应用程序)上执行策略,而 kubernetes 网络策略在第 3 层(网络)和第 4 层(传输)上运行。这个领域有许多产品,比如 AWS AppMesh、Istio、Linkerd 等,
何时使用服务网格执行策略
-
对服务网格进行了现有投资
-
需要更高级的功能,例如流量管理、可观察性和安全性
-
流量控制、负载均衡、断路、速率限制、超时等
-
详细了解您的服务性能(延迟、错误率、每秒请求数、请求量等)
-
你想实现和利用服务网格来实现 mTL 等安全功能
-
选择 Kubernetes 网络策略以获得更简单的用例
-
限制哪些 pod 可以相互通信
-
网络策略所需的资源少于服务网格,因此非常适合更简单的用例或较小的集群,在这些集群中,运行和管理服务网格的开销可能不合理
注意
网络策略和服务网格也可以一起使用。使用网络策略在 Pod 之间提供基准级别的安全和隔离,然后使用服务网格添加流量管理、可观察性和安全性等其他功能。
ThirdParty 网络策略引擎
如果您有高级策略要求,例如全球网络策略、支持基于 DNS 主机名的规则、第 7 层规则、基于规则和明确 deny/log 操作等, ServiceAccount 可以考虑使用第三方网络策略引擎。 Calico 是 Tigera
你可以在以下网址找到常见 Kubernetes 网络策略的列表。Calic https://github.com/ahmetb/kubernetes-network-policy-recipes. o 的一组类似规则可在以下网址找到 https://docs.projectcalico.org/security/calico-network-policy.
迁移到 Amazon VPC CNI 网络策略引擎
为了保持一致性并避免意外的 pod 通信行为,建议仅在集群中部署一个网络策略引擎。如果您想从 3P 迁移到 VPC CNI 网络策略引擎,我们建议您在启用 VPC CNI 网络策略支持之前将现有的 3P NetworkPolicy CRD 转换为 Kubernetes NetworkPolicy 资源。而且,在生产环境中应用迁移策略之前,请在单独的测试集群中对其进行测试。这使您可以识别和解决 Pod 通信行为中的任何潜在问题或不一致之处。
迁移工具
为了协助您的迁移过程,我们开发了一个名为 K8s 网络策略迁移器的
重要
迁移工具只会转换与原生 kubernetes 网络策略 API 兼容的 3P 策略。如果您使用的是 3P 插件提供的高级网络策略功能,则迁移工具将跳过并报告这些功能。
请注意,AWS VPC CNI 网络策略工程团队目前不支持迁移工具,它是尽最大努力向客户提供的。我们鼓励您使用此工具来简化迁移过程。如果您在使用该工具时遇到任何问题或错误,我们恳请您创建GitHub问题
其他资源
传输中加密
需要遵守 PCI、HIPAA 或其他法规的应用程序可能需要在传输过程中对数据进行加密。如今,TLS 实际上是加密网络流量的选择。TLS 与其前身 SSL 一样,使用加密协议通过网络提供安全通信。TLS 使用对称加密,其中加密数据的密钥是根据会话开始时协商的共享密钥生成的。以下是在 Kubernetes 环境中加密数据的几种方法。
Nitro 实例
默认情况下,以下 Nitro 实例类型(例如 C5n、G4、I3en、M5dn、M5n、P3dn、P3dn、R5dn 和 R5n)之间交换的流量会自动加密。当存在中间跃点(例如传输网关或负载均衡器)时,流量不会加密。有关传输中加密的更多详细信息以及默认支持网络加密的实例类型的完整列表,请参阅传输中加密。
服务网格
传输中的加密也可以通过 App Mesh、Linkerd v2 和 Istio 等服务网格来实现。 AppMesh 支持带有 X.509 证书的 mTL 或 Envoy 的秘密发现服务 (SDS)。Linkerd 和 Istio 都支持 mTL。
aws-app-mesh-examples
App Mesh 还支持使用由 AWS 证书管理器 (ACM) 颁发的私有证书或存储在虚拟节点本地文件系统中的证书进行 TLS 加密。
aws-app-mesh-examples
入口控制器和负载均衡器
入口控制器是您智能地将来自集群外部的 HTTP/S流量路由到集群内部运行的服务的一种方式。通常,这些入口由第 4 层负载均衡器前置,例如经典负载均衡器或网络负载均衡器 (NLB)。加密流量可以在网络中的不同位置终止,例如在负载均衡器、入口资源或 Pod 上。终止 SSL 连接的方式和地点最终将由贵组织的网络安全政策决定。例如,如果你有一个需要端到端加密的策略,你必须解密 Pod 上的流量。这将给你的 Pod 带来额外的负担,因为它必须花费大量时间来建立初始握手。总体 SSL/TLS 处理非常占用 CPU 资源。因此,如果您有灵活性,可以尝试在 Ingress 或负载均衡器上执行 SSL 卸载。
在 AWS 弹性负载均衡器中使用加密
AWS 应用程序负载均衡器 (ALB) 和网络负载均衡器 (NLB) 都支持传输加密(SSL 和 TLS)。ALB 的alb.ingress.kubernetes.io/certificate-arn注解允许您指定要向 ALB 添加哪些证书。如果您省略注解,控制器将尝试使用主机字段匹配可用的 AWS 证书管理器 (ACM) 证书,向需要该注解的监听器添加证书。从 EKS v1.15 开始,你可以在 NLB 中使用service.beta.kubernetes.io/aws-load-balancer-ssl-cert注解,如下例所示。
apiVersion: v1 kind: Service metadata: name: demo-app namespace: default labels: app: demo-app annotations: service.beta.kubernetes.io/aws-load-balancer-type: "nlb" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "<certificate ARN>" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" spec: type: LoadBalancer ports: - port: 443 targetPort: 80 protocol: TCP selector: app: demo-app //--- kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default labels: app: demo-app spec: replicas: 1 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: nginx image: nginx ports: - containerPort: 443 protocol: TCP - containerPort: 80 protocol: TCP
以下是其他 SSL/TLS 终止示例。
重要
一些入口,例如AWS LB控制器, SSL/TLS 使用注释来实现,而不是作为入口规范的一部分。
带有证书管理器的 ACM 私有 CA
您可以使用 ACM 私有证书颁发机构 (CA) 和证书管理器(一种用于分发、续订和吊销证书的常用 Kub ernetes 插件)启用 TLS 和 mTLS 来保护入口处
Short-Lived 工作负载之间双向 TLS 的 CA 模式
在 EKS 中将 ACM 私有 CA 用于 mTL 时,建议您使用具有短期 CA 模式的短期证书。尽管可以在通用 CA 模式下颁发短期证书,但对于需要经常颁发新证书的用例,使用短期 CA 模式更具成本效益(比普通模式便宜约 75%)。除此之外,你应该尝试使私有证书的有效期与 EKS 集群中 pod 的生命周期保持一致。在此处了解有关 ACM 私有 CA 及其优势的更多信息
ACM 设置说明
首先,按照 ACM 私有 CA 技术文档中提供的步骤创建私有 CA。拥有私有 CA 后,按照常规安装说明安装证书管理器。
现在你已经有了私有 CA 和一个安装了证书管理器和插件的 EKS 集群,是时候设置权限并创建颁发者了。更新 EKS 节点角色的 IAM 权限,以允许访问 ACM 私有 CA。将<CA_ARN>替换为您的私有 CA 中的值:
{ "Version":"2012-10-17", "Statement": [ { "Sid": "awspcaissuer", "Action": [ "acm-pca:DescribeCertificateAuthority", "acm-pca:GetCertificate", "acm-pca:IssueCertificate" ], "Effect": "Allow", "Resource": "arn:aws:acm-pca:us-west-2:123456789012:certificate-authority/12345678-1234-1234-1234-123456789012" } ] }
https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html也可以使用 IAM 账户或 IRSA 的服务角色。有关完整示例,请参阅下面的 “其他资源” 部分。
在亚马逊 EKS 中创建发行人,方法是创建一个名为 cluster-issuer.yaml 的自定义资源定义文件,其中包含以下文本,将信息替换<CA_ARN>为您的私有 CA。<Region>
apiVersion: awspca.cert-manager.io/v1beta1 kind: AWSPCAClusterIssuer metadata: name: demo-test-root-ca spec: arn: <CA_ARN> region: <Region>
部署您创建的发行者。
kubectl apply -f cluster-issuer.yaml
您的 EKS 集群配置为向私有 CA 请求证书。现在,您可以使用 cert-manager 的Certificate资源通过将issuerRef字段的值更改为您在上面创建的私有 CA 颁发者来颁发证书。有关如何指定和请求证书资源的更多详细信息,请查看 cert-manager 的证书资源指南。
带有 Istio 和证书管理器的 ACM 私有 CA
如果您在 EKS 集群中运行 Istio,则可以禁用 Istio 控制平面(特别是istiod)作为根证书颁发机构(CA),并将 ACM 私有 CA 配置为工作负载之间 mTL 的根 CA。如果你采用这种方法,可以考虑在 ACM 私有 CA 中使用短期 CA 模式。有关更多详细信息,请参阅上一节和这篇博客文章
证书签名在 Istio 中的工作原理(默认)
Kubernetes 中的工作负载使用服务帐号进行识别。如果您未指定服务帐号,Kubernetes 将自动为您的工作负载分配一个服务帐号。此外,服务帐号会自动挂载关联的令牌。服务账户使用此令牌让工作负载通过 Kubernetes API 进行身份验证。服务账户可能足以作为 Kubernetes 的身份,但是 Istio 有自己的身份管理系统和 CA。当工作负载使用其 envoy sidecar 代理启动时,它需要从 Istio 分配一个身份,才能被认为是可信的,并允许它与网格中的其他服务通信。
为了从 Istio 获取此身份,会向 Istio 控制平面istio-agent发送一个称为证书签名请求(或 CSR)的请求。此 CSR 包含服务帐号令牌,因此可以在处理工作负载之前验证其身份。该验证过程由istiod注册机构(简称 RA)和 CA 处理。RA 充当看门人,确保只有经过验证的 CSR 才能通过 CA。CSR 通过验证后,它将被转发到 CA,然后由该机构颁发包含服务帐号的 SPIFFE
Istio 证书签名请求的默认流程:
使用 ACM 私有 CA 在 Istio 中如何进行证书签名
您可以使用名为 Istio 证书签名请求代理 (istio-csr
每当有来自工作负载的 CSR 时,它就会被转发到 istio-csr,后者将向 ACM 私有 CA 申请证书。istio-csr 和 ACM 私有 CA 之间的这种通信由 AWS 私有 CA 发行者插件启用。
使用 istio-csr 提出 Istio 证书签名请求的流程
图片:: istio-csr-with-acm-private-ca.png [使用 istio-csr 提出 Istio 证书签名请求的流程]
带有私有 CA 设置说明的 Istio
-
首先,按照本节中的相同设置说明完成以下操作:
-
创建私有 CA
-
安装证书管理器
-
安装发行者插件
-
设置权限并创建发行者。颁发者代表 CA,用于签署
istiod和网格化工作负载证书。它将与 ACM 私有 CA 通信。 -
创建
istio-system命名空间。这是部署 Istio 资源istiod certificate和其他 Istio 资源的地方。 -
安装使用 AWS 私有 CA 发行者插件配置的 Istio CSR。您可以保留工作负载的证书签名请求,以验证它们是否获得批准和签名(
preserveCertificateRequests=true)。helm install -n cert-manager cert-manager-istio-csr jetstack/cert-manager-istio-csr \ --set "app.certmanager.issuer.group=awspca.cert-manager.io" \ --set "app.certmanager.issuer.kind=AWSPCAClusterIssuer" \ --set "app.certmanager.issuer.name=<the-name-of-the-issuer-you-created>" \ --set "app.certmanager.preserveCertificateRequests=true" \ --set "app.server.maxCertificateDuration=48h" \ --set "app.tls.certificateDuration=24h" \ --set "app.tls.istiodCertificateDuration=24h" \ --set "app.tls.rootCAFile=/var/run/secrets/istio-csr/ca.pem" \ --set "volumeMounts[0].name=root-ca" \ --set "volumeMounts[0].mountPath=/var/run/secrets/istio-csr" \ --set "volumes[0].name=root-ca" \ --set "volumes[0].secret.secretName=istio-root-ca" -
使用自定义配置安装 Istio,
cert-manager istio-csr将其istiod替换为网格的证书提供商。这个过程可以使用 Istio 操作符来执行。 apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: istio namespace: istio-system spec: profile: "demo" hub: gcr.io/istio-release values: global: # Change certificate provider to cert-manager istio agent for istio agent caAddress: cert-manager-istio-csr.cert-manager.svc:443 components: pilot: k8s: env: # Disable istiod CA Sever functionality - name: ENABLE_CA_SERVER value: "false" overlays: - apiVersion: apps/v1 kind: Deployment name: istiod patches: # Mount istiod serving and webhook certificate from Secret mount - path: spec.template.spec.containers.[name:discovery].args[7] value: "--tlsCertFile=/etc/cert-manager/tls/tls.crt" - path: spec.template.spec.containers.[name:discovery].args[8] value: "--tlsKeyFile=/etc/cert-manager/tls/tls.key" - path: spec.template.spec.containers.[name:discovery].args[9] value: "--caCertFile=/etc/cert-manager/ca/root-cert.pem" - path: spec.template.spec.containers.[name:discovery].volumeMounts[6] value: name: cert-manager mountPath: "/etc/cert-manager/tls" readOnly: true - path: spec.template.spec.containers.[name:discovery].volumeMounts[7] value: name: ca-root-cert mountPath: "/etc/cert-manager/ca" readOnly: true - path: spec.template.spec.volumes[6] value: name: cert-manager secret: secretName: istiod-tls - path: spec.template.spec.volumes[7] value: name: ca-root-cert configMap: defaultMode: 420 name: istio-ca-root-cert -
部署您创建的上述自定义资源。
istioctl operator init kubectl apply -f istio-custom-config.yaml -
现在,您可以将工作负载部署到 EKS 集群中的网格并强制执行 mTLS
。
Istio 证书签名请求
图片:: istio-csr-requests.png [Istio 证书签名请求]
工具和资源
-
使用新的 AWS 负载均衡器控制器和 ACM 私有 CA
在 Amazon EKS 上设置端到端 TLS 加密。 -
egress-operator
一个操作员和 DNS 插件,无需协议检查即可控制来自集群的出口流量 -
NeuVector 由 SUSE
开源、零信任容器安全平台提供策略网络规则、数据丢失防护 (DLP)、Web 应用程序防火墙 (WAF) 和网络威胁签名。