

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# 外部 OIDC プロバイダーを使用して Kubernetes へのアクセスをユーザーに許可する
<a name="authenticate-oidc-identity-provider"></a>

Amazon EKS では、クラスターに対してユーザーを認証する方法として OpenID Connect (OIDC) ID プロバイダーがサポートされます。OIDC ID プロバイダーはAWS アイデンティティとアクセス管理 (IAM) と併用、または代替として使用できます。IAM の使用の詳細については、「[IAM ユーザーおよびロールに Kubernetes API へのアクセスを付与する](grant-k8s-access.md)」を参照してください。クラスターに認証を設定した後は、Kubernetes `roles` および `clusterroles` を作成しロールにアクセス許可を割り当て、さらに、このロールを Kubernetes `rolebindings` および`clusterrolebindings` を使用する ID にバインドできます。詳細についてはKubernetes ドキュメントの「[RBAC 認可を使用する](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)」を参照してください。
+ クラスターには OIDC ID プロバイダーを 1 つ関連付けることができます。
+ Kubernetes は OIDC ID プロバイダーを提供しません。既存のパブリック OIDC ID プロバイダーを使用することも、独自の ID プロバイダーを実行することもできます。認定プロバイダーのリストについては、OpenID サイトの「[OpenID Certification](https://openid.net/certification/)」(OpenID 認定) を参照してください。
+ Amazon EKS が署名キーを検出できるように、OIDC ID プロバイダーの発行者 URL は公的にアクセス可能である必要があります。Amazon EKS は、自己署名証明書を持つ OIDC ID プロバイダーをサポートしていません。
+ ノードをクラスターに結合する時に必要なため、クラスターへの IAM 認証を無効にすることはできません。
+ Amazon EKS クラスターは、OIDC ID プロバイダーユーザーではなく、AWS [IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)が作成する必要があります。これは、クラスター作成者が Kubernetes API ではなく Amazon EKS API と対話するためです。
+ コントロールプレーンで CloudWatch ログが有効になっている場合、OIDC ID プロバイダー認証ユーザーは、クラスターの監査ログに一覧表示されます。詳細については、「[コントロールプレーンログを有効または無効にする](control-plane-logs.md#enabling-control-plane-log-export)」を参照してください。
+ OIDC プロバイダーのアカウントで AWS マネジメントコンソールにサインインすることはできません。AWS アイデンティティとアクセス管理 アカウントで AWS マネジメントコンソールにサインインした場合にのみ、[AWS マネジメントコンソール に Kubernetes リソースを表示する](view-kubernetes-resources.md) が可能となります。

## OIDC ID プロバイダーを関連付ける
<a name="associate-oidc-identity-provider"></a>

OIDC ID プロバイダーをクラスターに関連付けるには、プロバイダーから以下の情報が必要です。

 **発行者 URL**   
API サーバーがトークン検証のために公開署名キーを検出できるようにする OIDC ID プロバイダーの URL。URL は `https://` で始まり、プロバイダーの OIDC ID トークンで `iss` クレームに対応している必要があります。OIDC 標準に従って、パスコンポーネントは許可されますが、クエリパラメータは許可されません。通常 URL は `https://server.example.org` または `https://example.com` のように、ホスト名のみで構成されます。この URL は以下 `.well-known/openid-configuration` のレベルを指し、インターネット経由で公的にアクセス可能である必要があります。

 **クライアント ID (オーディエンスとも呼ばれる)**   
OIDC ID プロバイダーに認証リクエストを行うクライアントアプリケーションの ID。

`eksctl` または AWS マネジメントコンソール を使用して、ID プロバイダーを関連付けることができます。

### eksctl を使用して ID プロバイダーを関連付ける
<a name="identity-associate-eksctl"></a>

1. 次の内容で、`associate-identity-provider.yaml` という名前のファイルを作成します。値の例 は実際に使用する値に置き換えます。`identityProviders` セクションの値は、OIDC ID プロバイダーから取得します。値は`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
   ```
**重要**  
`groupsPrefix` または `usernamePrefix` に対しては`system:` またはその文字列の一部でも指定しないでください。

1. プロバイダーを作成します。

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

1. `kubectl` を使用してクラスターと OIDC ID プロバイダーを操作する方法については、Kubernetes ドキュメントの「[kubectl の使用](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#using-kubectl)」を参照してください。

### AWS コンソールを使用して ID プロバイダーを関連付ける
<a name="identity-associate-console"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. クラスターを選択し、**[アクセス]** タブを選択してください。

1. **[OIDC ID プロバイダー]** セクションで、[ID プロバイダーを関連付け] を選択します。

1. **[Associate OIDC Identity Provider]** (OIDC ID プロバイダーの関連付け) ページで、以下のオプションを入力または選択した上で、**[Associate]** (関連付け) を選択します。
   + **[Name]** (名前) に、プロバイダーの一意の名前を入力します。
   + **[Issuer URL]** (発行者 URL） に、プロバイダーの URL を入力してください。この URL はインターネットからアクセス可能である必要があります。
   + **[クライアント ID]** に、OIDC ID プロバイダーのクライアント ID (別名、**対象者**) を入力します。
   + **[Username claim]** (ユーザー名のクレーム） に、ユーザー名として使用するクレームを入力してください。
   + **[Groups 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 トークンに必要なクレームを記述する、キーと値のペアを 1 つ以上入力してください。ペアはID トークンで必要なクレームを記述します。設定されている場合、各クレームは一致する値を持つ ID トークンに存在することが検証されます。

       1. `kubectl` を使用してクラスターと OIDC ID プロバイダーを操作する方法については、Kubernetes ドキュメントの「[kubectl の使用](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#using-kubectl)」を参照してください。

## IAM ポリシーの例
<a name="oidc-identity-provider-iam-policy"></a>

OIDC ID プロバイダーとクラスターの関連付けを防ぐには、以下の IAM ポリシーを作成して、Amazon EKS 管理者の IAM アカウントに関連付けます。詳細については、「*IAM ユーザーガイド*」の「[IAM ポリシーを作成する](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)」と「[IAM ID アクセス許可の追加](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)」、および「サービス認証リファレンス」の「[Actions](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": "*"
        }
    ]
}
```

以下のポリシーの例では、`clientID` が `kubernetes` で、`issuerUrl` が `https://cognito-idp.us-west-2.amazonaws.com/*` の場合、OIDC ID プロバイダーの関連付けを許可します。

```
{
    "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": "*"
        }
    ]
}
```