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

通过 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 身份提供者。

  • 您不能在集群上禁用 IAM 身份验证,因为在将节点加入集群时仍需要使用。

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

  • 如果为控制面板启用了 CloudWatch 日志,则将在集群的审核日志中列出经 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. OIDC 身份提供者部分中,选择关联身份提供者

  4. 关联 OIDC 身份提供者页面上,输入或选择以下选项,然后选择关联

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

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

    • 对于客户端 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 令牌中。

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

取消 OIDC 身份提供者与集群的关联

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

使用 Amazon Web Services Management Console 取消 OIDC 身份提供者与集群的关联
  1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

  2. OIDC 身份提供者部分中,选择取消关联,输入身份提供者名称,然后选择 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": "*" } ] }

经合作伙伴验证的 OIDC 身份提供商

Amazon EKS 与为兼容的 OIDC 身份提供商提供支持的合作伙伴网络保持着合作关系。参考以下合作伙伴的文档,了解如何将身份提供商与 Amazon EKS 集成的详细信息。

合作伙伴

产品

文档

PingIdentity

企业版 PingOne

安装说明

Amazon EKS 旨在为您提供广泛的选项来涵盖所有使用案例。如果您开发的商业支持的 OIDC 兼容身份提供商未在此处列出,请通过 aws-container-partners@amazon.com 与我们的合作伙伴团队联系以获取更多信息。