服務帳戶的 IAM 角色 - Amazon EKS

協助改善此頁面

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

若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。

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

服務帳戶的 IAM 角色

Pod 容器中的應用程式可以使用 AWS SDK 或 AWS CLI,使用 AWS Identity and Access Management (IAM) 許可向 AWS 服務提出 API 請求。應用程式必須使用 AWS 登入資料簽署其 AWS API 請求。服務帳戶的 IAM 角色 (IRSA) 可讓您管理應用程式的登入資料,類似於 Amazon EC2 執行個體描述檔向 Amazon EC2 執行個體提供登入資料的方式。您可以將 IAM 角色與 Kubernetes 服務帳戶建立關聯,並將您的 Pod 設定為使用服務帳戶,而不是建立 AWS 登入資料並將其分發至容器或使用 Amazon EC2 執行個體的 角色。您無法將 IAM 角色用於具有 Amazon EKS on AWS Outposts 本機叢集的服務帳戶。

服務帳戶的 IAM 角色提供下列優點:

  • 最低權限 – 您可以將 IAM 許可範圍限定為服務帳戶,而且只有使用該服務帳戶的 Pod 才能存取這些許可。有此功能也就不需要第三方解決方案,例如 kiamkube2iam

  • 登入資料隔離 – 當對 Amazon EC2 執行個體中繼資料服務 (IMDS) 的存取受到限制時,Pod 的容器只能擷取與容器使用之服務帳戶相關聯的 IAM 角色登入資料。容器永遠無法存取其他 Pod 中其他容器使用的登入資料。如果 IMDS 不受限制,Pod 的容器也可以存取 Amazon EKS 節點 IAM 角色,而且容器可能可以存取相同節點上其他 Pod 的 IAM 角色憑證。如需詳細資訊,請參閱‬限制存取指派給工作節點的執行個體設定檔‭

注意

使用 設定的 Pod hostNetwork: true 一律具有 IMDS 存取權,但啟用時, AWS SDKs和 CLI 將使用 IRSA 登入資料。

  • 稽核性 – 可透過 AWS CloudTrail 存取和事件記錄,以協助確保回溯性稽核。

重要

容器不是安全界限,而且服務帳戶使用 IAM 角色並不會變更此限制。指派給相同節點的 Pod 將共用核心和可能的其他資源,具體取決於您的 Pod 組態。雖然在個別節點上執行的 Pod 會在運算層隔離,但有些節點應用程式在 Kubernetes API 中具有超出個別執行個體範圍的額外許可。一些範例包括 kubeletkube-proxy、CSI 儲存驅動程式或您自己的 Kubernetes 應用程式。

完成下列程序,為服務帳戶啟用 IAM 角色:

  1. 為您的叢集建立 IAM OIDC 提供者 – 您只為每個叢集完成此程序一次。

    注意

    如果您啟用 EKS VPC 端點,則無法從該 VPC 內部存取 EKS OIDC 服務端點。因此,您的作業 (例如在 VPC 利用 eksctl 建立 OIDC 提供者) 將無法運作,並且當嘗試請求 https://oidc.eks.region.amazonaws.com 時,會導致逾時。以下是範例錯誤訊息:

    server cant find oidc.eks.region.amazonaws.com: NXDOMAIN

    若要完成此步驟,您可以在 VPC 外部執行 命令,例如 in AWS CloudShell 或連接至網際網路的電腦。或者,您可以在 VPC 中建立分割期限條件式解析程式,例如 Route 53 Resolver,以針對 OIDC 發行者 URL 使用不同的解析程式,而不為其使用 VPC DNS。如需 CoreDNS 中條件式轉送的範例,請參閱 GitHub 上的 Amazon EKS 功能請求

  2. 將 IAM 角色指派給 Kubernetes 服務帳戶 – 為您希望應用程式擁有的每個唯一許可集完成此程序。

  3. 將 Pod 設定為使用 Kubernetes 服務帳戶 – 為每個需要存取 AWS 服務的 Pod 完成此程序。

  4. 搭配 AWS SDK 使用 IRSA – 確認工作負載使用支援版本的 AWS SDK,以及工作負載使用預設登入資料鏈。

IAM、Kubernetes 和 OpenID Connect (OIDC) 背景資訊

在 2014 年, AWS Identity and Access Management 新增了對使用 OpenID Connect (OIDC) 的聯合身分的支援。此功能可讓您向支援的身分提供者驗證 AWS API 呼叫,並接收有效的 OIDC JSON Web 字符 (JWT)。您可以將此字符傳遞至 AWS STS AssumeRoleWithWebIdentity API 操作,並接收 IAM 臨時角色登入資料。您可以使用這些登入資料與任何 AWS 服務互動,包括 Amazon S3 和 DynamoDB。

每個 JWT 權杖均由一個簽署金鑰對簽署。這些金鑰是由 Amazon EKS 管理的 OIDC 供應商提供服務,且私有金鑰每 7 天就會輪換一次。Amazon EKS 會保留公有金鑰,直到它們過期為止。如果您連接外部 OIDC 用戶端,請注意,您需要在公有金鑰過期之前重新整理簽署金鑰。了解如何擷取簽署金鑰來驗證 OIDC 權杖

Kubernetes 長期以來使用服務帳戶作為自己的內部身分系統。Pod 可以使用只有 Kubernetes API 伺服器可以驗證的自動掛載字符 (非 OIDC JWT),向 Kubernetes API 伺服器進行驗證。這些舊版服務帳戶字符不會過期,輪換簽署金鑰是一個困難的程序。在 Kubernetes 版本 中1.12,已新增新ProjectedServiceAccountToken功能的支援。此功能是 OIDC JSON Web 權杖,也包含服務帳戶身分,並支援可設定的對象。

Amazon EKS 會為每個叢集託管公有 OIDC 探索端點,其中包含 ProjectedServiceAccountToken JSON Web 字符的簽署金鑰,因此 IAM 等外部系統可以驗證並接受 Kubernetes 發行的 OIDC 字符。