在本节及后面两节,我们将关注向EKS里的应用颁发私有证书。
使用 AWS Private CA 可以通过三种方式保护 EKS 工作负载的传输中数据:
ingress controller
处终止 TLS本节关注在ingress controller
和单个 Pod 级别终止 TLS,以实现端到端加密, Pod 之间的相互 TLS 是一个更复杂的主题。我们还可以终止ELB上的 TLS,但这通常使用ACM 的公共证书,因此本节还不会介绍
cert-manager 是一个 Kubernetes 插件,用于自动管理来自各种颁发源的 TLS 证书。它将确保证书有效,并在证书过期之前尝试在适当的时间续订证书。
安装:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
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>"
}
]
}
使用我们在上一步中创建的 pca-iam-policy.json
文件创建一个名为的AWSPCAIssuerIAMPolicy
的 Role:
aws iam create-policy \
--policy-name AWSPCAIssuerIAMPolicy \
--policy-document file://pca-iam-policy.json
记下返回的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
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 已准备就绪,状态为运行中:
现在我们可以开始请求可供 Kubernetes 应用程序使用的私有证书。
Issuer 和ClusterIssuer 表示可以获取x509签名证书的证书颁发机构,例如 AWS Private CA。在开始在集群中请求证书之前,至少需要一个 Issuer 或 ClusterIssuer。有两种CRD可用于使用 aws-pca-issuer 在 Kubernetes 内创建 Issuer:
AWSPCAIssuer
是一个常规命名空间Issuer,可用作证书自定义资源中的引用。AWSPCAClusterIssuer
以完全相同的方式指定,但它不属于单个命名空间,可以被来自多个不同命名空间的证书资源引用。我们将创建一个AWSPCAClusterIssuer
, 首先创建一个名为cluster-issuer.yaml
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 有四种方式:
App Mesh
用于这个场景。