

 **協助改進此頁面** 

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

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

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

# 透過外部 OIDC 提供商授予使用者存取 Kubernetes 的權限
<a name="authenticate-oidc-identity-provider"></a>

Amazon EKS 支援使用 OpenID Connect (OIDC) 身分提供者作為向您的叢集對使用者進行身分驗證的方法。OIDC 身分提供者可以與 AWS Identity and Access Management (IAM) 搭配使用或作為替代方案。如需使用 IAM 的詳細資訊，請參閱 [授予 IAM 使用者和角色對 Kubernetes APIs存取權](grant-k8s-access.md)。設定叢集身分驗證後，您可以建立 Kubernetes `roles` 和 `clusterroles` 指派許可給角色，然後使用 Kubernetes `rolebindings` 和 `clusterrolebindings` 將角色繫結至身分。如需詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。
+ 您可以將一個 OIDC 身分提供者與叢集建立關聯。
+ Kubernetes 不提供 OIDC 身分提供者。您可以使用現有的公有 OIDC 身分提供者，也可以執行您自己的身分提供者。如需認證提供商的清單，請參閱 OpenID 網站上的 [OpenID 認證](https://openid.net/certification/)。
+ OIDC 身分提供者的發行者 URL 必須可公開存取，以便 Amazon EKS 可以探索簽署金鑰。Amazon EKS 不支援具有自我簽署憑證的 OIDC 身分提供者。
+ 您無法停用叢集上的 IAM 身分驗證器，因為將節點連接到叢集仍然需要此身分驗證器。
+ Amazon EKS 叢集仍然必須由 AWS [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)建立，而非 OIDC 身分提供者使用者。這是因為叢集建立者會與 Amazon EKS API 進行互動，而不是與 Kubernetes API 進行互動。
+ 如果控制平面的 CloudWatch Logs 已開啟，則已進行提供商身分驗證的 OIDC 身分使用者會列在叢集的稽核日誌中。如需詳細資訊，請參閱[啟用或停用控制平面日誌](control-plane-logs.md#enabling-control-plane-log-export)。
+ 您無法 AWS 管理主控台 透過 OIDC 供應商的帳戶登入 。您只能[在 中檢視 Kubernetes 資源 AWS 管理主控台](view-kubernetes-resources.md)使用 AWS Identity and Access Management AWS 管理主控台 帳戶登入 。

## 關聯 OIDC 身分提供者
<a name="associate-oidc-identity-provider"></a>

在可以將 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 管理主控台關聯身分提供者。

### 使用 eksctl 關聯身分提供者
<a name="identity-associate-eksctl"></a>

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

   ```
   ---
   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`。

1. 建立供應商。

   ```
   eksctl associate identityprovider -f associate-identity-provider.yaml
   ```

1. 若要讓 `kubectl` 與叢集和 OIDC 身分提供者搭配使用，請參閱 Kubernetes 文件中的[使用 kubectl](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#using-kubectl)。

### 使用 AWS 主控台關聯身分提供者
<a name="identity-associate-console"></a>

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選取叢集，然後選取**存取**索引標籤。

1. 在 **OIDC 身分提供者**區段上，選取\$1關聯身分提供者\$1。

1. 在 **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:engineering` 和 `oidc:infra`。請勿指定 `system:` 或該字串的任何部分。
     +  **Required claims** (必要宣告)：選取 **Add claim** (新增宣告)，然後在用戶端 ID 字符中輸入一或多個描述必要宣告的鍵值對。鍵值對在 ID 字符中描述了必要宣告。如果設定，則會驗證每個宣告是否存在於具有相符值的 ID 字符中。

       1. 若要讓 `kubectl` 與叢集和 OIDC 身分提供者搭配使用，請參閱 Kubernetes 文件中的[使用 kubectl](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#using-kubectl)。

## 範例 IAM 政策
<a name="oidc-identity-provider-iam-policy"></a>

如果您想要防止 OIDC 身分提供者與叢集產生關聯，請建立下列 IAM 政策並將其與 Amazon EKS 管理員的 IAM 帳戶關聯。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)和[新增 IAM 身分許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)以及《服務授權參考》中的[動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelasticcontainerserviceforkubernetes.html)。

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

        },
        {
            "Sid": "eksAdmin",
            "Effect": "Allow",
            "Action": [
                "eks:*"
            ],
            "Resource": "*"
        }
    ]
}
```

下列範例政策允許 OIDC 身分提供者關聯，如果 `clientID` 為 `kubernetes` 以及 `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": "*"
        }
    ]
}
```