通过 OpenID Connect 身份提供商对集群的用户进行身份验证 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

通过 OpenID Connect 身份提供商对集群的用户进行身份验证

Amazon EKS 支持使用 OpenID Connect (OIDC) 身份提供商作为对您的集群的用户进行身份验证的方法。OIDC 身份提供商可与 Amazon Identity and Access Management (IAM) 一起使用或作为其替代方法。有关使用 IAM 的更多信息,请参阅让 IAM 用户和角色有权访问您的集群。配置集群身份验证后,您可以创建 Kubernetes rolesclusterroles 以将权限分配给角色,然后使用 Kubernetes rolebindingsclusterrolebindings 将角色绑定到身份。有关更多信息,请参阅 Kubernetes 文档中的使用 RBAC 授权

注意事项

  • 您可以将一个 OIDC 身份提供商与您的集群关联。

  • Kubernetes 没有提供 OIDC 身份提供商。您可以使用现有的公共 OIDC 身份提供商,也可以运行您自己的身份提供商。有关经认证提供商的列表,请参阅 OpenID 网站上的 OpenID 认证

  • OIDC 身份提供商的发布者 URL 必须可公开访问,以便 Amazon EKS 能够发现签名密钥。Amazon EKS 不支持拥有自签名证书的 OIDC 身份提供商。

  • 您不能在集群上禁用 Amazon IAM 身份验证器,因为在将节点加入集群时仍需要使用它。有关更多信息,请参阅 GitHub 上的适用于 Kubernetes 的 Amazon IAM 身份验证器

  • Amazon EKS 集群仍必须由 Amazon IAM 用户创建,而不是由 OIDC 身份提供商用户创建。这是因为集群创建者与 Amazon EKS API 进行交互,而不是与 Kubernetes API 进行交互。

  • 如果为控制层面启用了 CloudWatch Logs,则将在集群的审核日志中列出经 OIDC 身份提供商验证的用户。有关更多信息,请参阅启用和禁用控制层面日志

  • 您无法使用来自 OIDC 提供商的账户登录 Amazon Web Services Management Console。您只能通过使用 Amazon Identity and Access Management 账户登录 Amazon Web Services Management Console,从而在控制台中查看 Kubernetes 资源

关联 OIDC 身份提供商

您需要提供商提供以下信息,然后才能将 OIDC 身份提供商与集群关联:

  • 发布者 URL – OIDC 身份提供商的 URL,该 URL 允许 API 服务器发现用于验证令牌的公共签名密钥。该 URL 必须以 https:// 开头,并应与提供商的 OIDC ID 令牌中的 iss 声明相对应。根据 OIDC 标准,允许使用路径组件,但不允许使用查询参数。通常,URL 只包含一个主机名称,如 https://server.example.orghttps://example.com。该 URL 应指向 .well-known/openid-configuration 以下的级别,并且必须可通过 Internet 网公开访问。

  • 客户端 ID(也称为受众 – 向 OIDC 身份提供商发出身份验证请求的客户端应用程序的 ID。

您可以使用 eksctl 或 Amazon Web Services Management Console 关联身份提供商。

eksctl

使用 eksctl 将 OIDC 身份提供商与您的集群关联

  1. 使用以下内容创建名为 associate-identity-provider.yaml 的文件。将 example values 替换为您自己的值。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
    重要

    不要为 groupsPrefixusernamePrefix 指定 system: 或该字符串的任何部分。

  2. 创建提供商。

    eksctl associate identityprovider -f associate-identity-provider.yaml
  3. 要使用 kubectl 与您的集群和 OIDC 身份提供商搭配使用,请参阅 Kubernetes 文档中的使用 kubectl

Amazon Web Services Management Console

使用 Amazon Web Services Management Console 将 OIDC 身份提供商与您的集群关联

  1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

  2. 选择您的集群。

  3. 选择 Configuration(配置)选项卡,然后选择 Authentication(身份验证)选项卡。

  4. OIDC Identity Providers(OIDC 身份提供商)页面上,选择 Associate Identity Provider(关联身份提供商)

  5. Associate OIDC Identity Provider(关联 OIDC 身份提供商)页面上,输入或选择以下选项,然后选择 Associate(关联)

    • 对于 Name(名称),为提供商输入一个唯一的名称。

    • 对于 Issuer URL(发布者 URL),输入您的提供商的 URL。此 URL 必须可通过 Internet 进行访问。

    • 对于 Client ID(客户端 ID),输入 OIDC 身份提供商的客户端 ID(也称为受众)。

    • 对于 Username claim(用户名声明),输入要用作用户名的声明。

    • 对于 Groups claim(组声明),输入要用作用户的组的声明。

    • (可选)选择 Advanced options(高级选项),输入或选择以下信息。

      • Username prefix(用户名前缀)– 输入要加在用户名声明前面的前缀。该前缀加在用户名声明前面,以防止与现有名称发生冲突。如果您未提供值,并且用户名为 email 之外的值,则前缀默认为 Issuer URL(发布者 URL)的值。您可以使用值 - 来禁用所有前缀。不要指定 system: 或该字符串的任何部分。

      • 组前缀 – 输入要加在组声明前面的前缀。该前缀加在组声明前面,以防止与现有名称(如 system: groups)发生冲突。例如,值 oidc: 会创建组名称,如 oidc:engineeringoidc:infra。不要指定 system: 或该字符串的任何部分。

      • Required claims(所需声明)– 选择 Add claim(添加声明),然后在客户端 ID 令牌中输入描述所需声明的一个或多个键值对。这些键值对描述了 ID 令牌中所需的声明。如果设置,则验证每个声明是否存在于具有匹配值的 ID 令牌中。

  6. 要使用 kubectl 与您的集群和 OIDC 身份提供商搭配使用,请参阅 kubectl 文档中的使用 Kubernetes

解除 OIDC 身份提供商与集群的关联

如果您解除 OIDC 身份提供商与集群的关联,则提供商中包含的用户将无法再访问该集群。但是,您仍然可以使用 Amazon IAM 用户访问该集群。

使用 Amazon Web Services Management Console 解除 OIDC 身份提供商与集群的关联

  1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

  2. OIDC Identity Providers(OIDC 身份提供商)部分中,选择 Disassociate(解除关联),输入身份提供商名称,然后选择 Disassociate

示例 IAM policy

如果要阻止 OIDC 身份提供商与集群关联,请创建以下 IAM policy 并将其与 Amazon EKS 管理员的 IAM 账户关联。有关更多信息,请参阅 IAM 用户指南中的创建 IAM policy添加 IAM 身份权限,以及服务授权参考中的 Amazon Elastic Kubernetes Service 的操作、资源和条件键

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

如果 clientIDkubernetesissuerUrlhttps://cognito-idp.cn-north-1amazonaws.com.cn/*,则以下示例策略允许进行 OIDC 身份提供商关联。

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