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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

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

Considerations

  • 您的集群必须运行 Kubernetes 1.16 或更高版本。

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

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

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

  • 您无法在集群上禁用 AWS IAM 身份验证器,因为在集群中联接节点时仍需要使用该身份验证器。有关更多信息,请参阅 GitHub 上的适用于 Kubernetes 的 AWSIAM 身份验证器。

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

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

  • 您不能使用 AWS 管理控制台 OIDC 提供商的账户登录 。您只能使用 View 节点 账户登录 并在 控制台Workloads中执行 AWS 管理控制台 和 AWS Identity and Access Management 操作。

关联 OIDC 身份提供商

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

  • 发布者 URL – OIDC 身份提供商的 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 或 关联身份提供商AWS 管理控制台。

eksctl

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

  1. 创建名为 的文件 associate-identity-provider.yaml 替换为以下内容。替换 <example values> (包括 <>) 与您自己的 。identityProviders 部分中的值从您的 OIDC 身份提供商获取。只有 下的 nametypeissuerUrlclientId 设置才需要值identityProviders

    --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: <my-cluster> region: <us-west-2> 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 管理控制台

使用 将 OIDC 身份提供商与您的集群关联 AWS 管理控制台

  1. Open the Amazon EKS console at https://console.amazonaws.cn/eks/home#/clusters.

  2. 选择您的集群。

  3. 选择 Configuration 选项卡,然后选择 Authentication 选项卡。

  4. OIDC Identity Providers 页面上,选择 Associate Identity Provider。

  5. Associate OIDC Identity Provider 页面上,输入或选择以下选项,然后选择 Associate。

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

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

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

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

    • 对于组声明,请输入声明以用作用户组。

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

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

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

      • 必需声明 – 选择添加声明,然后输入一个或多个密钥值对,用于描述客户端 ID 令牌中必需的声明。paris 描述 ID 令牌中的必需声明。如果设置,则将验证每个声明是否存在于具有匹配值的 ID 令牌中。

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

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

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

使用 取消 OIDC 身份提供商与您的集群的关联 AWS 管理控制台

  1. Open the Amazon EKS console at https://console.amazonaws.cn/eks/home#/clusters.

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

示例IAM策略

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

{ "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 身份提供商关联(如果 clientIDkubernetesissuerUrlhttps://cognito-idp.us-west-2.amazonaws.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": "*" } ] }