如何設定 SSO 使用者以存取我的 Amazon EKS 叢集?

4 分的閱讀內容
0

我正在使用 AWS IAM Identity Center (AWS Single Sign-On 的後繼者)。但是,我無法存取 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集。我想要設定 SSO 使用者以存取我的叢集。

解決方案

請確認符合下列先決條件:

**注意:**下列步驟會使用 kubectl 來存取叢集。設定 kubectl 存取權後,您可以在 Amazon EKS 主控台中查看叢集資源,方法是以 IAM Identity Center 使用者身分登入。

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

設定 AWS CLI 來使用您的 SSO 使用者

建立在執行 AWS CLI 命令時會使用 SSO 身分驗證的 AWS Command Line Interface (AWS CLI) 設定檔。如需詳細資訊,請參閱設定 AWS CLI 以使用 AWS IAM Identity Center (AWS Single Sign-On 的後繼者)

以下是使用自動程序的 AWS CLI SSO 組態範例:

aws configure sso
SSO start URL [None]: https://my-sso-portal.awsapps.com/start
SSO region [None]: us-east-1

AWS CLI 會嘗試開啟您的預設瀏覽器,並開始 IAM Identity Center 帳戶的登入程序。

Attempting to automatically open the SSO authorization page in your default browser.

如果 AWS CLI 無法開啟瀏覽器,您會收到下列訊息,其中包含如何手動啟動登入程序的說明:

If the browser does not open or you wish to use a different device to authorize this request, open the following URL:
https://device.sso.us-east-2.amazonaws.com/
Then enter the code:
XXXX-XXXX
The only AWS account available to you is: 123456789999
Using the account ID 123456789999
The only role available to you is: ViewOnlyAccess
Using the role name "ViewOnlyAccess"
CLI default client Region [us-east-2]:
CLI default output format [json]:
CLI profile name [ViewOnlyAccess-123456789999]: test-profile
To use this profile, specify the profile name using --profile, as shown:
aws s3 ls --profile test-profile

您現在可以使用這個新的設定檔執行 AWS CLI 命令。此組態讓您的 SSO 使用者可以執行下列動作:

  • 使用 AWS 進行驗證。
  • 擔任由 IAM Identity Center 建立的 AWS Identity and Management (IAM) 角色。

範例:

$ aws sts get-caller-identity
{
    "UserId": "AROAXMRV33N1234567890:test-user",
    "Account": "123456789999",
    "Arn": "arn:aws:sts::123456789999:assumed-role/AWSReservedSSO_ViewOnlyAccess_05a3861234567890/test-user"
}

設定 kubectl 環境以使用針對 SSO 建立的 AWS CLI 設定檔

Kubectl 使用 AWS CLI 命令。因此,您必須在 kubectl 的目前環境中指定新的 AWS CLI 設定檔。若要更新 kubectl 環境以使用新的設定檔,請執行下列命令:

aws eks update-kubeconfig --name $CLUSTER-NAME --profile test-profile

執行此命令之後,kubectl 會使用設定檔 test-profile 來以叢集 API 伺服器進行驗證。

透過排除路徑建置 ARN 版本

在 aws-auth ConfigMap 中映射的 IAM 角色不包含路徑。根據預設,與您 SSO 使用者關聯的 IAM 角色之 Amazon Resource Name (ARN) 會包含路徑。

範例:

arn:aws:iam::123456789999:role/aws-reserved/sso.amazonaws.com/us-east-2/AWSReservedSSO_ViewOnlyAccess_05a3861234567890

如果您將完整 ARN 新增至 aws-auth ConfigMap,則您的 SSO 使用者不會進行身分驗證。您無法使用 SSO 使用者存取叢集。請確認在不包含路徑的情況下建置此 ARN 的版本。下一個步驟必須使用此版本

範例:

arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01

您也可以執行下列命令來取得沒有路徑的 IAM 角色:

ssorole=$(aws sts get-caller-identity --query Arn --output text --profile test-profile | cut -d/ -f2)
account=$(aws sts get-caller-identity --query Account --output text --profile  test-profile)
echo "arn:aws:iam::$account:role/$ssorole"
arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01

將 ARN 新增至 aws-auth ConfigMap

若要讓您的 SSO 使用者存取 Amazon EKS 叢集,與您 SSO 使用者關聯的 IAM 角色必須映射至 Kubernetes RBAC 許可。若要這樣做,請在 aws-auth ConfigMap 中包含沒有路徑的 IAM 角色 ARN。接著,將其映射至 Kubernetes 使用者以及連結至 Kubernetes Role 和 RoleBinding (或 ClusterRole 和 ClusterRoleBinding) 的群組。根據您的使用案例,使用下列任一區段所提供的指示。

具有叢集範圍管理員權限的 SSO 使用者

根據預設,Kubernetes 群組 system:masters 會提供叢集範圍管理員權限。此群組會連結至 ClusterRole 叢集管理員和 ClusterRoleBinding 叢集管理員。因此,您不需要建立新的 ClusterRole 和 ClusterBindingRole 物件。您只需要將沒有路徑的 IAM 角色映射至 system:masters 群組。

若要這樣做,請編輯 aws-auth ConfigMap:

kubectl edit configmap aws-auth -n kube-system

接著,新增以下內容:

- groups:
  - system:masters
  rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
  username: cluster-admin

具有命名空間繫結讀取許可的 SSO 使用者

在這種情況下,您必須在特定命名空間內建立具有讀取許可的 Role 和 RoleBinding。然後,使用 aws-auth ConfigMap 中的自訂使用者名稱或群組名稱,將這些物件連結至 IAM 角色。

1.    建立 Kubernetes Role 物件,此物件在您所需的命名空間中僅允許讀取許可:

cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: $MY-NAMESPACE
  name: reader-role
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["*"]
  verbs: ["get", "watch", "list"]
EOF

注意:

  • $MY-NAMESPACE 替換為您命名空間的名稱。
  • reader-role 替換為您的自訂使用者名稱。

2.    建立 Kubernetes RoleBinding 物件,此物件將 Kubernetes 角色權限連結至群組 read-only-group

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: reader-binding
  namespace: MY-NAMESPACE
subjects:
- kind: Group
  name: read-only-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: reader-role
  apiGroup: rbac.authorization.k8s.io
EOF

3.    將沒有路徑的 IAM 角色 ARN 映射至 aws-auth ConfigMap 中的群組 read-only-group

您可以透過執行下列命令以自動映射 IAM 角色:

eksctl create iamidentitymapping \
    --cluster $CLUSTER-NAME \
    --region $REGION \
    --arn arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 \
    --group read-only-group \
    --no-duplicate-arns \
    --username read-only-user1

注意:將 $CLUSTER-NAME$REGION 分別替換為您叢集和區域的名稱。 或者,您可以手動映射 IAM 角色。若要這樣做,請編輯 aws-auth ConfigMap:

kubectl edit configmap aws-auth -n kube-system

然後,在 mapRoles 區段下方新增以下內容:

- groups:
  - read-only-group
  rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
  username: read-only-user1

**重要事項:**IAM 角色在 aws-auth ConfigMap 中必須僅出現一次。因此,請確認只有一個區段包含 IAM 角色。

您現在可以使用 SSO 使用者來存取叢集:

$ kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          24h

相關資訊

開啟叢集的 IAM 使用者和角色存取

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