協助改進此頁面
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 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 執行個體的角色。您無法搭配 Amazon EKS on AWS Outposts 的本機叢集使用服務帳戶的 IAM 角色。
服務帳戶的 IAM 角色提供下列優點:
-
最低權限:您可以將 IAM 許可範圍限定為服務帳戶,只有使用該服務帳戶的 Pod 才能存取這些許可。有此功能也就不需要第三方解決方案,例如
kiam或kube2iam。 -
憑證隔離:若 Amazon EC2 執行個體中繼資料服務 (IMDS) 存取權受限,Pod 的容器僅可擷取與容器所用服務帳戶關聯的 IAM 角色憑證。容器一律無法存取其他 Pod 中其他容器使用的憑證。若 IMDS 不受限制,Pod 的容器亦可存取 Amazon EKS 節點 IAM 角色,且容器或許能存取相同節點上其他 Pod 的 IAM 角色的憑證。如需詳細資訊,請參閱限制存取指派給工作節點的執行個體設定檔。
注意
使用 hostNetwork: true 設定的 Pod 一律具有 IMDS 存取權,但 AWS SDK 和 CLI 將在啟用時使用 IRSA 憑證。
-
可稽核性:可透過 AWS CloudTrail 取得存取和事件記錄,以確保回顧稽核。
重要
容器並非安全邊界,而且使用服務帳戶的 IAM 角色亦不會對此有所變更。若 Pod 指派到相同的節點,將會分享核心及可能的其他資源,具體取決於 Pod 組態。儘管執行於單獨節點上的 Pod 將會在運算層隔離,但有些節點應用程式在 Kubernetes API 中擁有超出個別執行個體範圍的額外許可。部分範例包括 kubelet、kube-proxy、CSI 儲存驅動程式,或者您本人的 Kubernetes 應用程式。
完成下列程序,為服務帳戶啟用 IAM 角色:
-
為叢集建立 IAM OIDC 提供商:對於每個叢集,您只需完成一次本程序。
注意
如果您已啟用 EKS VPC 端點,則無法從該 VPC 內部存取 EKS OIDC 服務端點。因此,您的作業 (例如在 VPC 利用
eksctl建立 OIDC 提供者) 將無法運作,並且當嘗試請求https://oidc.eks時,會導致逾時。以下是範例錯誤訊息:. region.amazonaws.com.rproxy.govskope.caserver cant find oidc.eks.region.amazonaws.com: NXDOMAIN若要完成此步驟,您可在 VPC 外部執行命令,例如在 AWS CloudShell 執行,或在連線至網際網路的電腦執行。或者,您可以在 VPC 中建立水平分割條件式解析程式,例如 Route 53 Resolver,以針對 OIDC 發行者 URL 使用不同的解析程式,而不為其使用 VPC DNS。如需 CoreDNS 中條件式轉送的範例,請參閱 GitHub 上的 Amazon EKS 功能請求
。 -
將 IAM 角色指派給 Kubernetes Service 帳戶:對您希望應用程式擁有的每種非重複可組合完成此程序。
-
設定 Pod 來使用 Kubernetes Service 帳戶:對需要存取 AWS 服務的每個 Pod 完成此程序。
-
搭配 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 字符。