使用证书保护EKS数据

在本节及后面两节,我们将关注向EKS里的应用颁发私有证书。


使用 AWS Private CA 可以通过三种方式保护 EKS 工作负载的传输中数据:

  • ingress controller处终止 TLS
  • 在单个 Pod 处终止 TLS
  • Pod 之间的相互 TLS

本节关注在ingress controller和单个 Pod 级别终止 TLS,以实现端到端加密, Pod 之间的相互 TLS 是一个更复杂的主题。我们还可以终止ELB上的 TLS,但这通常使用ACM 的公共证书,因此本节还不会介绍

用到的组件

  • cert-manager是 Kubernetes 的一个附加组件,用于提供 TLS 证书管理。cert-manager 请求证书,将其分发到 Kubernetes 容器,并自动更新证书。cert-manager 确保证书有效且最新,并尝试在到期前的适当时间续订证书。
  • AWS Private CA Issue Plugin:Kubernetes 容器和应用程序使用证书通过 TLS 提供安全身份验证和加密。使用此插件,cert-manager 可以向私有 CA 请求 TLS 证书。该插件支持 TLS 证书自动化,包括ingress上、Pod 上以及 Pod 之间的相互 TLS。
  • AWS Load Balancer

安装cert-manager

cert-manager 是一个 Kubernetes 插件,用于自动管理来自各种颁发源的 TLS 证书。它将确保证书有效,并在证书过期之前尝试在适当的时间续订证书。

安装:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml

image-20231203171211858

安装aws-pca-issuer

AWS PCA Issuer Plugin 充当 cert-manager 的插件,使用 AWS PCA签署证书请求。

AWS PCA Issuer在worker node上运行,因此需要通过 IAM 权限访问 AWS Private CA 资源。我们使用IRSA的方式来授权。

创建pca-iam-policy.json文件,内容如下,将Resource ARN替换为之前创建的Subordinate CA的ARN:

{
   "Version": "2012-10-17",
   "Statement": [
     {
       "Sid": "awspcaissuer",
       "Action": [
         "acm-pca:DescribeCertificateAuthority",
         "acm-pca:GetCertificate",
         "acm-pca:IssueCertificate"
       ],
       "Effect": "Allow",
       "Resource": "arn:aws:acm-pca:<region>:<account_id>:certificate-authority/<resource_id>"
     }
   ]
 }

image-20231203171647926

使用我们在上一步中创建的 pca-iam-policy.json 文件创建一个名为的AWSPCAIssuerIAMPolicy的 Role:

aws iam create-policy \
    --policy-name AWSPCAIssuerIAMPolicy \
    --policy-document file://pca-iam-policy.json

image-20231203171831391

记下返回的ARN

为 AWS PCA Issuer创建 IAM Role和 ServiceAccount,使用上面返回的ARN:

eksctl create iamserviceaccount \
--cluster=<cluster-name> \  # 替换cluster name
--namespace=aws-pca-issuer \
--name=aws-pca-issuer \
--attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSPCAIssuerIAMPolicy \
--override-existing-serviceaccounts \
--approve

image-20231203172143857

Helm安装AWS PCA Issuer:

helm repo add awspca https://cert-manager.github.io/aws-privateca-issuer
helm install aws-pca-issuer awspca/aws-privateca-issuer -n aws-pca-issuer --set serviceAccount.create=false --set serviceAccount.name=aws-pca-issuer

通过运行以下命令验证 AWS PCA Issuer是否已正确安装:

kubectl get pods --namespace aws-pca-issuer

看到 aws-pca-issuer pod 已准备就绪,状态为运行中:

image-20231203172246899

在EKS集群创建Issuer

现在我们可以开始请求可供 Kubernetes 应用程序使用的私有证书。

Issuer ClusterIssuer 表示可以获取x509签名证书的证书颁发机构,例如 AWS Private CA。在开始在集群中请求证书之前,至少需要一个 Issuer 或 ClusterIssuer。有两种CRD可用于使用 aws-pca-issuer 在 Kubernetes 内创建 Issuer:

  • AWSPCAIssuer是一个常规命名空间Issuer,可用作证书自定义资源中的引用。
  • AWSPCAClusterIssuer以完全相同的方式指定,但它不属于单个命名空间,可以被来自多个不同命名空间的证书资源引用。

我们将创建一个AWSPCAClusterIssuer, 首先创建一个名为cluster-issuer.yaml

  • <CA_ARN>替换为Subordinate CA的arn, 将区域值替换为当前使用的 AWS 区域:
apiVersion: awspca.cert-manager.io/v1beta1
kind: AWSPCAClusterIssuer
metadata:
          name: demo-test-root-ca
spec:
          arn: <CA_ARN>
          region: <REGION>

使用以下命令部署 AWS PCA ClusterIssuer

kubectl apply -f cluster-issuer.yaml

现在我们已经设置了 EKS 集群, 并准备好开始请求证书。接下来,我们将详细研究将 TLS 与容器工作负载结合使用的不同方法。

TLS终止位置的选择

在何处终止 TLS 连接取决于实际使用案例、安全策略以及遵守法规要求的需要。终止 TLS 有四种方式:

  1. 在负载均衡器处:在负载均衡器级别终止 TLS 的最常见场景是使用公共信任的证书。该场景部署起来很简单,并且证书绑定到负载均衡器本身。例如,您可以使用AWS颁发公共证书并将其与AWS NLB绑定。本节不会介绍此场景,因为它使用 ACM 的公共证书,而不是 AWS Private CA 的私有证书
  2. 在ingress处:如果对端到端加密没有严格要求,可以在此处卸载。这有助于优化工作负载的性能并使其更易于配置和管理。我们将在后面研究这个场景
  3. 在 Pod 上:在 Kubernetes 中,Pod 是最小的可部署计算单元,它封装了一个或多个应用程序。从客户端一直 Kubernetes Pod 的流量的端到端加密是一种安全的通信模型,其中 TLS 在 Kubernetes 集群内的 Pod 处终止。这对于满足某些安全要求可能很有用。我们将在后面重点讨论这个场景
  4. Pod 之间的相互 TLS:此用例重点关注 Kubernetes 集群内数据流动的传输中加密。可以将 AWS Private CA Issuer 插件与cert-manager结合使用,一般App Mesh用于这个场景。

TLS 终止选项