如何在 Amazon EKS 中建立叢集後為其他 IAM 使用者和角色提供存取權?

3 分的閱讀內容
0

當我嘗試透過 kubectl 命令存取 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集時,收到下列授權錯誤:「錯誤: 您必須登入伺服器 (未經授權)。」

簡短描述

當您的 AWS Identity and Access Management (IAM) 實體未經 Amazon EKS 叢集的角色型存取控制 (RBAC) 組態授權時,就會遇到授權錯誤。當建立 Amazon EKS 叢集的 IAM 使用者或角色與 aws-iam-authenticator 使用的 IAM 使用者或角色不同時,就會發生這種情況。

最初,只有 Amazon EKS 叢集的建立者具備可設定叢集的 system:masters 權限。若要將 system:masters 權限擴展至其他使用者和角色,您必須將 aws-auth ConfigMap 新增至 Amazon EKS 叢集的組態中。ConfigMap 允許其他 IAM 實體 (例如使用者和角色) 存取 Amazon EKS 叢集。

若要向 IAM 角色授予存取權,您必須代入叢集建立者憑證。然後,在 aws-auth ConfigMapmapRoles 區段新增 IAM 角色。

重要事項:

  • 當您更新 aws-auth ConfigMap 時,應避免語法錯誤,例如拼字錯誤。這些錯誤可能會影響 Amazon EKS 叢集的 ConfigMap 中更新的所有 IAM 使用者和角色的權限。
  • 最佳實務是避免將 cluster_creator 新增至 ConfigMap。不當修改 ConfigMap 可能導致所有 IAM 使用者和角色 (包括 cluster_creator) 永久失去對 Amazon EKS 叢集的存取權。
  • 您不需要為了取得 Amazon EKS 叢集的管理員存取權,而將 cluster_creator 新增至 aws-auth ConfigMap。預設情況下,cluster_creator 具有其建立的 Amazon EKS 叢集的管理員存取權。

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確認您使用的是最新版本的 AWS CLI

解決方法

**注意:**在下列步驟中,叢集建立者為 cluster_creator。目前無法存取叢集但需要存取權的使用者為 designated_user

識別叢集建立者的 IAM 使用者或角色

1.    識別具備設定 Amazon EKS 叢集主要存取權的叢集建立者的 IAM 使用者或角色。

2.    識別叢集建立者在建立叢集後授予授權的 IAM 使用者。若要識別叢集建立者,請在 AWS CloudTrail 中搜尋 CreateCluster API 呼叫,然後檢查 API 呼叫的 userIdentity 部分。

如果 cluster_creator 為 IAM 使用者,則將 designated_user 新增至 ConfigMap

1.    在您的本地主機機器上安裝 kubectl。或者,如果您擁有已安裝 kubectl 套件的專用 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,則可以使用 SSH 連線至該執行個體。

2.    在已安裝 kubectl 的同一主機機器上,使用 designated_user 憑證設定 AWS CLI:

aws configure

3.    在 AWS CLI 中,執行下列命令:

aws sts get-caller-identity

輸出應傳回 designated_user 的 IAM 使用者詳細資訊。

例如:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/designated_user"
}

4.    列出在預設命名空間叢集中執行的 Pod:

kubectl get pods --namespace default

輸出會顯示以下內容:「錯誤: 您必須登入伺服器 (未經授權)。」 此錯誤表示 designated_user 未獲得存取 Amazon EKS 叢集的授權。

5.    設定 AWS 存取金鑰 ID 和 cluster_creator 的 AWS 私密存取金鑰。

如果該叢集使用 AWS 管理主控台建立,請識別建立該叢集的 IAM 角色或使用者。在已安裝 kubectl 的主機機器中,在 AWS CLI 中設定 cluster_creator IAM 使用者或角色:

aws configure

如果該叢集使用 eksctl 建立,則使用預設或指定的 AWS CLI 設定檔憑證設定 AWS CLI,以執行 kubectl 命令。

6.    確認 cluster_creator 是否具備叢集的存取權:

kubectl get pods

如果一切都設定正確,則不會收到未經授權的錯誤訊息。輸出應列出在預設命名空間中執行的所有 Pod。如果輸出顯示找不到資源,則該預設命名空間中沒有執行任何 Pod。

7.    若要向 designated_user 授予叢集的存取權,請將 mapUsers 部分新增至 aws-auth.yaml 檔案。請參閱授予 IAM 使用者和角色對叢集的存取權中的範例 aws-auth.yaml 檔案。

8.    將 designated_user 新增至步驟 7 中 aws-auth.yaml 檔案的 mapUsers 部分,然後儲存該檔案。

9.    將新的 ConfigMap 套用至叢集的 RBAC 組態:

kubectl apply -f aws-auth.yaml

10.    再次變更 AWS CLI 組態以使用 designated_user 的憑證:

aws configure

11.    驗證 designated_user 是否具備叢集的存取權:

kubectl get pods

如果一切都設定正確,您不會收到未經授權的錯誤訊息。輸出會列出在預設命名空間中執行的所有 Pod。如果輸出顯示找不到資源,則該預設命名空間中沒有執行任何 Pod。

如果 cluster_creator 為 IAM 角色,則將 designated_user 新增至 ConfigMap

在前述步驟中,您已使用 cluster_creator 憑證為 designated_user 提供存取權。然而,如果叢集是由 IAM 角色而非 IAM 使用者建立,則沒有您可以使用的憑證。在這種情況下,您必須擔任建立叢集的 IAM 角色,進而為 designated_user 提供存取權。如果叢集建立者不是 IAM 角色,則您不需要完成下列步驟。

**注意:**在下列步驟中,assume_role_user 是擔任 cluster_creator 角色的使用者。目前無法存取叢集但需要存取權的使用者為 designated_user

若要擔任 IAM 角色並在叢集上編輯 aws-auth ConfigMap,進而為 designated_user 提供存取權,請完成下列步驟:

1.    顯示 assume_role_user 的 IAM 使用者詳細資訊:

aws sts get-caller-identity

2.    確認 assume_role_user 具備對叢集的存取權:

kubectl get pods

輸出會顯示以下錯誤:「錯誤: 您必須登入伺服器 (未經授權)。」 此錯誤表示 assume_role_user 未獲得設定 Amazon EKS 叢集的授權。

3.    允許 assume_role_user 擔任 cluster_creator 的角色:

aws sts assume-role --role-arn arn:aws:iam:11122223333:role/cluster_creator --role-session-name test

輸出會顯示 assume_role_user 的臨時 IAM 憑證。

4.    使用臨時 IAM 憑證設定 AWS_ACCESS_KEY_IDAWS_SESSION_TOKENAWS_SECRET_ACCESS_KEY 環境變數。

例如:

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SESSION_TOKEN=EXAMPLETOKEN
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

AWS CLI 現在會將環境變數中設定的憑證排名,並使用這些憑證呼叫 AWS 服務。

5.    確認 AWS CLI 是否正在使用 cluster_creator 擔任的角色:

aws sts get-caller-identity

6.    若要向 designated_user 授予叢集的存取權,請將 mapUsers 部分新增至 aws-auth.yaml 檔案。請參閱授予 IAM 使用者和角色對叢集的存取權中的範例 aws-auth.yaml 檔案。

7.    將 designated_user 新增至步驟 6 中 aws-auth.yaml 檔案的 mapUsers 部分,然後儲存該檔案。

8.    將新的組態套用至 Amazon EKS 叢集的 RBAC 組態:

kubectl apply -f aws-auth.yaml

9.    取消設定下列環境變數:

unset AWS_ACCESS_KEY_ID
unset AWS_SESSION_TOKEN
unset AWS_SECRET_ACCESS_KEY

10.    顯示 designated_user 的 IAM 使用者詳細資訊:

aws sts get-caller-identity

11.    確認 designated_user 是否具備叢集的存取權:

kubectl get pods

如果一切都設定正確,則不會收到未經授權的錯誤訊息。輸出會列出在預設命名空間中執行的所有 Pod。如果輸出顯示找不到資源,則該預設命名空間中沒有執行任何 Pod。

**注意:**如果您使用 eksctl,請考慮 Weaveworks 網站上管理 IAM 使用者和角色中的解決方案。


相關資訊

在 AWS CLI 中使用 IAM 角色

AWS 官方
AWS 官方已更新 2 年前