使用 AWS 秘密和組態提供者 CSI 搭配 Amazon EKS 的 Pod 身分 - AWS Secrets Manager

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS 秘密和組態提供者 CSI 搭配 Amazon EKS 的 Pod 身分

AWS Secrets and Configuration Provider 與 Pod Identity Agent for Amazon Elastic Kubernetes Service 整合,可為在 Amazon EKS 上執行的應用程式提供增強的安全性、簡化組態並改善效能。從 Secrets Manager 或從 AWS Systems Manager 參數存放區擷取秘密或參數時,Pod Identity 可簡化 Amazon EKS 的 IAM 身分驗證。

Amazon EKS Pod 身分識別透過允許直接透過 Amazon EKS 介面設定許可、減少步驟數量,並消除在 Amazon EKS 和 IAM 服務之間切換的需求,簡化設定 Kubernetes 應用程式 IAM 許可的程序。Pod 身分識別可讓您跨多個叢集使用單一 IAM 角色,而無需更新信任政策,並支援角色工作階段標籤,以實現更精細的存取控制。這種方法不僅允許跨角色重複使用許可政策來簡化政策管理,還允許根據相符標籤存取 AWS 資源來增強安全性。

運作方式

  1. Pod 身分識別可將 IAM 角色指派給 Pod。

  2. ASCP 使用此角色進行身分驗證 AWS 服務。

  3. 如果獲得授權,ASCP 會擷取請求的秘密,並將其提供給 Pod。

如需詳細資訊,請參閱《Amazon EKS 使用者指南》中的了解 Amazon EKS Pod 身分識別的運作方式

先決條件

重要

僅雲端中的 Amazon EKS 支援 Pod 身分識別。Amazon EC2 執行個體上的 Amazon EKS AnywhereRed Hat OpenShift Service on AWS 或自我管理型 Kubernetes 叢集不支援此功能。

  • Amazon EKS 叢集 (1.24 版或更新版本)

  • 透過 存取 AWS CLI 和 Amazon EKS 叢集 kubectl

  • 存取兩個 AWS 帳戶 (用於跨帳戶存取)

安裝 Amazon EKS Pod 身分識別代理程式

若要將 Pod 身分識別與叢集搭配使用,您必須安裝 Amazon EKS Pod 身分識別代理程式附加元件。

安裝 Pod 身分識別代理程式
  • 在叢集上安裝 Pod Identity Agent 附加元件:

    eksctl create addon \ --name eks-pod-identity-agent \ --cluster clusterName \ --region region

使用 Pod 身分識別設定 ASCP

  1. 建立許可政策,以授予 Pod 需要存取之秘密的 secretsmanager:GetSecretValuesecretsmanager:DescribeSecret許可。如需政策範例,請參閱 範例:讀取和描述個別秘密的許可

  2. 建立由 Amazon EKS 服務主體擔任的 IAM 角色,用於 Pod 身分識別:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }

    將 IAM 政策連接至角色:

    aws iam attach-role-policy \ --role-name MY_ROLE \ --policy-arn POLICY_ARN
  3. 建立 Pod 身分識別關聯。如需範例,請參閱《Amazon EKS 使用者指南》中的建立 Pod 身分識別關聯

  4. 建立 SecretProviderClass,指定要掛載在 Pod 中的秘密:

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleSecretProviderClass-PodIdentity.yaml

    在 IRSA 和 Pod 身分識別之間,SecretProviderClass 主要差異是選用參數 usePodIdentity。這是可決定身分驗證方法的選用欄位。未指定時,它會預設為使用服務帳戶的 IAM 角色 (IRSA)。

    • 若要使用 EKS Pod 身分識別,請使用下列任何值:"true", "True", "TRUE", "t", "T"

    • 若要明確使用 IRSA,請設定為下列任何值:"false", "False", "FALSE", "f", or "F"

  5. 在 下部署掛載秘密的 Pod/mnt/secrets-store

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleDeployment-PodIdentity.yaml
  6. 如果您使用私有 Amazon EKS 叢集,請確定叢集所在的 VPC 具有 AWS STS 端點。如需有關建立端點的資訊,請參閱 AWS Identity and Access Management User Guide 中的 Interface VPC endpoints

驗證秘密掛載

若要驗證秘密是否已正確掛載,請執行下列命令:

kubectl exec -it $(kubectl get pods | awk '/pod-identity-deployment/{print $1}' | head -1) -- cat /mnt/secrets-store/MySecret
設定 Amazon EKS Pod Identity 以存取 Secrets Manager 中的秘密
  1. 建立許可政策,以授予 Pod 需要存取之秘密的 secretsmanager:GetSecretValuesecretsmanager:DescribeSecret許可。如需政策範例,請參閱 範例:讀取和描述個別秘密的許可

  2. 如果您還沒有秘密,請在 Secrets Manager 中建立秘密。

疑難排解

您可以透過描述 Pod 部署來檢視大多數錯誤。

若要查看容器的錯誤訊息
  1. 使用下列命令取得 Pod 名稱清單。如果不使用預設命名空間,請使用 -n NAMESPACE

    kubectl get pods
  2. 若要描述 Pod,請在下列命令中,針對 PODID 使用您在上一個步驟中找到的 Pod 中的 Pod ID。如果不使用預設命名空間,請使用 -n NAMESPACE

    kubectl describe pod/PODID
若要查看 ASCP 的錯誤
  • 若要在提供者日誌中尋找更多資訊,請在下列命令中,針對 PODID 使用 csi-secrets-store-provider-aws Pod 的 ID。

    kubectl -n kube-system get pods kubectl -n kube-system logs pod/PODID