

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

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

# 服務帳戶的 IAM 角色
<a name="iam-roles-for-service-accounts"></a>

**提示**  
 [註冊](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)即將舉行的 Amazon EKS 研討會。

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 本機叢集](eks-outposts-local-cluster-overview.md)的服務帳戶。

服務帳戶的 IAM 角色提供下列優點：
+  **最低權限**：您可以將 IAM 許可範圍限定為服務帳戶，只有使用該服務帳戶的 Pod 才能存取這些許可。有此功能也就不需要第三方解決方案，例如 `kiam` 或 `kube2iam`。
+  **憑證隔離**：若 [Amazon EC2 執行個體中繼資料服務 (IMDS)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html) 存取權受限，Pod 的容器僅可擷取與容器所用服務帳戶關聯的 IAM 角色憑證。容器一律無法存取其他 Pod 中其他容器使用的憑證。若 IMDS 不受限制，Pod 的容器亦可存取 [Amazon EKS 節點 IAM 角色](create-node-role.md)，且容器或許能存取相同節點上其他 Pod 的 IAM 角色的憑證。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://docs.aws.amazon.com/eks/latest/best-practices/identity-and-access-management.html#_identities_and_credentials_for_eks_pods_recommendations)。

**注意**  
使用 設定的 Pod `hostNetwork: true` 一律具有 IMDS 存取權，但啟用時， AWS SDKs和 CLI 將使用 IRSA 登入資料。
+  可**稽核性** – 可透過 AWS CloudTrail 存取和事件記錄，以協助確保回溯性稽核。

**重要**  
容器並非安全邊界，而且使用服務帳戶的 IAM 角色亦不會對此有所變更。若 Pod 指派到相同的節點，將會分享核心及可能的其他資源，具體取決於 Pod 組態。儘管執行於單獨節點上的 Pod 將會在運算層隔離，但有些節點應用程式在 Kubernetes API 中擁有超出個別執行個體範圍的額外許可。部分範例包括 `kubelet`、`kube-proxy`、CSI 儲存驅動程式，或者您本人的 Kubernetes 應用程式。

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

1.  [為叢集建立 IAM OIDC 提供商](enable-iam-roles-for-service-accounts.md)：對於每個叢集，您只需完成一次本程序。
**注意**  
如果您已啟用 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 功能請求](https://github.com/aws/containers-roadmap/issues/2038)。

1.  [將 IAM 角色指派給 Kubernetes Service 帳戶](associate-service-account-role.md)：對您希望應用程式擁有的每種非重複可組合完成此程序。

1.  [將 Pod 設定為使用 Kubernetes 服務帳戶](pod-configuration.md) – 為每個需要存取 AWS 服務的 Pod 完成此程序。

1.  [搭配 AWS SDK 使用 IRSA](iam-roles-for-service-accounts-minimum-sdk.md) – 確認工作負載使用支援版本的 AWS SDK，以及工作負載使用預設登入資料鏈。

## IAM, Kubernetes 和 OpenID Connect (OIDC) 背景資訊
<a name="irsa-oidc-background"></a>

在 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 權杖](irsa-fetch-keys.md)。

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

Amazon EKS 為每個叢集託管公有 OIDC 探索端點，其中包含 `ProjectedServiceAccountToken` JSON Web 字符的簽署金鑰，讓外部系統 (例如 IAM) 可以驗證和接受 Kubernetes 發出的 OIDC 字符。