使用外部 OIDC 供應商授予使用者對 Kubernetes 的存取權 - Amazon EKS

協助改善此頁面

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

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

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

使用外部 OIDC 供應商授予使用者對 Kubernetes 的存取權

Amazon EKS 支援使用 OpenID Connect (OIDC) 身分提供者作為向您的叢集對使用者進行身分驗證的方法。OIDC 身分提供者可以與 AWS Identity and Access Management (IAM) 搭配使用,或做為其替代方案。如需使用 IAM 的詳細資訊,請參閱 授予 IAM 使用者和角色對 Kubernetes APIs存取權。設定叢集身分驗證後,您可以建立 Kubernetes rolesclusterroles 指派許可給角色,然後使用 Kubernetes rolebindingsclusterrolebindings 將角色繫結至身分。如需詳細資訊,請參閱 Kubernetes 文件中的使用 RBAC 授權

  • 您可以將一個 OIDC 身分提供者與叢集建立關聯。

  • Kubernetes 不提供 OIDC 身分提供者。您可以使用現有的公有 OIDC 身分提供者,也可以執行您自己的身分提供者。如需認證提供商的清單,請參閱 OpenID 網站上的 OpenID 認證

  • OIDC 身分提供者的發行者 URL 必須可公開存取,以便 Amazon EKS 可以探索簽署金鑰。Amazon EKS 不支援具有自我簽署憑證的 OIDC 身分提供者。

  • 您無法停用叢集的 IAM 身分驗證,因為將節點加入叢集時仍需要此身分驗證。

  • Amazon EKS 叢集仍然必須由 AWS IAM 主體建立,而非 OIDC 身分提供者使用者。這是因為叢集建立者會與 Amazon EKS API 進行互動,而不是與 Kubernetes API 進行互動。

  • 如果為控制平面開啟 CloudWatch 日誌,則叢集的稽核日誌中會列出 OIDC 身分提供者驗證的使用者。如需詳細資訊,請參閱啟用或停用控制平面日誌

  • 您無法 AWS Management Console 透過 OIDC 提供者的帳戶登入 。您只能 AWS Management Console 使用 AWS Identity and Access Management 帳戶在 中檢視 Kubernetes 資源 AWS Management Console登入 。

關聯 OIDC 身分提供者

在可以將 OIDC 身分提供者與叢集建立關聯之前,您需要提供商的下列資訊:

發行者 URL

OIDC 身分提供者的 URL,可讓 API 伺服器探索用於驗證權杖的公有簽署金鑰。URL 必須以 開頭,https://且應對應至提供者的 OIDC ID 字符中的iss宣告。根據 OIDC 標準,允許路徑元件,但不允許查詢參數。通常,URL 只包含一個主機名稱,如 https://server.example.org https://example.com 。此 URL 應指向 .well-known/openid-configuration 以下的層級,必須可透過網際網路公開存取。

用戶端 ID (也稱為對象)

向 OIDC 身分提供者提出驗證請求的用戶端應用程式 ID。

您可以使用 eksctl 或 AWS Management Console關聯身分提供者。

使用 eksctl 關聯身分提供者

  1. 使用下列內容建立名為 associate-identity-provider.yaml 的檔案。使用自己的取代範例值identityProviders 區段中的值是從您的 OIDC 身分提供者取得的。值僅對 identityProviders 下的 nametypeissuerUrlclientId 設定為必要項目。

    --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: your-region-code identityProviders: - name: my-provider type: oidc issuerUrl: https://example.com clientId: kubernetes usernameClaim: email usernamePrefix: my-username-prefix groupsClaim: my-claim groupsPrefix: my-groups-prefix requiredClaims: string: string tags: env: dev
    重要

    請勿為 system:或 指定 groupsPrefix或該字串的任何部分usernamePrefix

  2. 建立供應商。

    eksctl associate identityprovider -f associate-identity-provider.yaml
  3. 若要使用 kubectl 搭配您的叢集和 OIDC 身分提供者,請參閱 Kubernetes 文件中的使用 kubectl

使用 AWS 主控台關聯身分提供者

  1. 開啟 Amazon EKS 主控台

  2. 選取您的叢集,然後選取存取標籤。

  3. OIDC 身分提供者區段中,選取* 關聯身分提供者*。

  4. Associate OIDC Identity Provider (關聯 OIDC 身分提供者) 頁面上,輸入或選取下列選項,然後選取 Associate (關聯)。

    • 對於 Name (名稱),輸入提供商的唯一名稱。

    • 對於 Issuer URL (發行者 URL),輸入您的提供商 URL。此 URL 必須可透過網際網路存取。

    • 針對用戶端 ID,輸入 OIDC 身分提供者的用戶端 ID (也稱為對象)。

    • 對於 Username claim (使用者名稱宣告),輸入要用作使用者名稱的宣告。

    • 針對群組宣告,輸入要用作使用者群組的宣告。

    • (選用) 選取 Advanced options (進階選項),輸入或選取下列資訊。

      • Username prefix (使用者名稱字首):輸入要在使用者名稱宣告前面加上的字首。字首會加入使用者名稱宣告,以防止與現有名稱發生衝突。如果未提供值,且使用者名稱是非 email 的值,字首預設為 Issuer URL (發行者 URL) 的值。您可以使用值 - 停用所有字首。請勿指定 system:或該字串的任何部分。

      • Groups prefix (群組字首):輸入要在群組宣告前面加上的字首。字首會加入群組宣告,以防止與現有名稱發生衝突 (例如 system: groups)。例如,值 oidc: 會建立群組名稱,例如 oidc:engineeringoidc:infra。請勿指定 system:或該字串的任何部分。

      • Required claims (必要宣告):選取 Add claim (新增宣告),然後在用戶端 ID 字符中輸入一或多個描述必要宣告的鍵值對。配對描述 ID 權杖中的必要宣告。如果設定,則會驗證每個宣告是否存在於具有相符值的 ID 字符中。

        1. 若要使用 kubectl 搭配您的叢集和 OIDC 身分提供者,請參閱 Kubernetes 文件中的使用 kubectl

範例 IAM 政策

如果您想要防止 OIDC 身分提供者與叢集產生關聯,請建立下列 IAM 政策並將其與 Amazon EKS 管理員的 IAM 帳戶關聯。如需詳細資訊,請參閱 IAM 使用者指南中的建立 IAM 政策和新增 IAM 身分許可和服務授權參考中的動作

{ "Version": "2012-10-17", "Statement": [ { "Sid": "denyOIDC", "Effect": "Deny", "Action": [ "eks:AssociateIdentityProviderConfig" ], "Resource": "arn:aws: eks:us-west-2.amazonaws.com:111122223333:cluster/*" }, { "Sid": "eksAdmin", "Effect": "Allow", "Action": [ "eks:*" ], "Resource": "*" } ] }

下列範例政策允許 OIDC 身分提供者關聯,如果 clientIDkubernetes 以及 issuerUrl https://cognito-idp.us-west-2amazonaws.com/*

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCognitoOnly", "Effect": "Deny", "Action": "eks:AssociateIdentityProviderConfig", "Resource": "arn:aws: eks:us-west-2:111122223333:cluster/my-instance", "Condition": { "StringNotLikeIfExists": { "eks:issuerUrl": "https://cognito-idp.us-west-2.amazonaws.com/*" } } }, { "Sid": "DenyOtherClients", "Effect": "Deny", "Action": "eks:AssociateIdentityProviderConfig", "Resource": "arn:aws: eks:us-west-2:111122223333:cluster/my-instance", "Condition": { "StringNotEquals": { "eks:clientId": "kubernetes" } } }, { "Sid": "AllowOthers", "Effect": "Allow", "Action": "eks:*", "Resource": "*" } ] }