我们将LDAP授权固定到Kubernetes


有关如何将Kubernetes与Keycloak结合使用的简短说明,以绑定到LDAP服务器并配置用户和组导入。 这将允许您为用户配置RBAC,并使用auth-proxy保护Kubernetes仪表板和其他无法授权自己的应用程序。


安装Keycloak


假设您已经有一个LDAP服务器。 它可以是Active Directory,FreeIPA,OpenLDAP或其他任何东西。 如果您没有LDAP服务器,则原则上可以直接在Keycloak界面中创建用户,或使用公共oidc提供程序(Google,Github,Gitlab),结果将几乎相同。


首先,我们将安装Keycloak本身,安装可以单独执行,然后立即在Kubernetes集群中进行,通常,如果您有多个Kubernetes集群,则分别安装会更容易。 另一方面,您始终可以使用官方头盔图并将其直接安装在集群中。


要存储Keycloak数据,您需要一个数据库。 默认情况下,使用h2 (所有数据都存储在本地),但是也可以使用postgresmysqlmariadb
如果您仍然决定单独安装Keycloak,则可以在官方文档中找到更详细的说明。


联盟设置


首先,创建一个新的领域。 领域是我们应用程序的空间。 每个应用程序可以具有不同的用户和授权设置的自己的领域。 主域由Keycloak本身使用,不适合将其用于其他任何用途。


单击添加领域


选件价值
名称kubernetes
显示名称Kubernetes
HTML显示名称<img src="https://kubernetes.io/images/nav_logo.svg" width="400" \>

默认情况下,Kubernetes检查用户是否有电子邮件。 由于我们使用自己的LDAP服务器,因此此检查几乎总是返回false 。 让我们关闭Kubernetes中此参数的表示形式:


客户范围 -> 电子邮件 -> 映射器 -> 已验证电子邮件 (删除)


现在配置联盟,为此,我们将转到:


用户联盟 -> 添加提供程序...- > ldap


这是FreeIPA的示例设置:


选件价值
控制台显示名称freeipa.example.org
供应商Red Hat Directory Server
UUID LDAP属性ipauniqueid
连接网址ldaps://freeipa.example.org
用户DNcn=users,cn=accounts,dc=example,dc=org
绑定dnuid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
绑定凭证<password>
允许Kerberos身份验证:on
Kerberos领域:EXAMPLE.ORG
服务器主体:HTTP/freeipa.example.org@EXAMPLE.ORG
关键字标签:/etc/krb5.keytab

必须在我们的LDAP服务器上预先创建keycloak-svc用户。


对于Active Directory,只需选择“ 供应商:Active Directory”,然后将必要的设置自动填充到表单中。


点击保存


现在让我们继续:


用户联盟 -> freeipa.example.org- > 映射器 ->


选件价值
Ldap属性givenName

现在启用组映射:


用户联盟 -> freeipa.example.org- > 映射器 -> 创建


选件价值
名称groups
映射器类型group-ldap-mapper
LDAP组DNcn=groups,cn=accounts,dc=example,dc=org
用户组检索策略GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

这样就完成了联盟的配置,让我们继续设置客户端。


客户端设置


创建一个新客户端(一个将从Keycloak接收用户的应用程序)。 我们通过:


客户 -> 创建


选件价值
客户编号kubernetes
访问类型confidenrial
根URLhttp://kubernetes.example.org/
有效的重定向URIhttp://kubernetes.example.org/*
管理员网址http://kubernetes.example.org/

还为组创建范围:


客户范围 -> 创建


选件价值
范本No template
名称groups
完整的群组路径false

并为其配置映射器:


客户范围 -> -> 映射器 -> 创建


选件价值
名称groups
映射器类型Group membership
代币声明名称groups

现在我们需要在客户范围内启用映射组:


客户端 -> kubernetes- > 客户端作用域 -> 默认客户端作用域


在“ 可用的客户范围”中选择 ,单击“ 添加所选内容”


现在配置我们的应用程序的身份验证,请转到:


客户 -> kubernetes


选件价值
授权已启用ON

单击“ 保存” ,这样就完成了客户端设置,现在在选项卡上


客户端 -> kubernetes- > 凭据


您可以获取我们将来将使用的Secret


配置Kubernetes


配置Kubernetes进行OIDC身份验证非常简单,也不是很复杂。 您需要做的只是将OIDC服务器的CA证书放在/etc/kubernetes/pki/oidc-ca.pem并为kube-apiserver添加必要的选项。
为此, /etc/kubernetes/manifests/kube-apiserver.yaml在所有向导上更新/etc/kubernetes/manifests/kube-apiserver.yaml


 ... spec: containers: - command: - kube-apiserver ... - --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem - --oidc-client-id=kubernetes - --oidc-groups-claim=groups - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes - --oidc-username-claim=email ... 

并且还要更新集群中的kubeadm配置,以免在更新时丢失这些设置:


 kubectl edit -n kube-system configmaps kubeadm-config 

 ... data: ClusterConfiguration: | apiServer: extraArgs: oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem oidc-client-id: kubernetes oidc-groups-claim: groups oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes oidc-username-claim: email ... 

这样就完成了Kubernetes的设置。 您可以在所有Kubernetes集群中重复这些步骤。


初步授权


完成这些步骤后,您将已经具有配置了OIDC身份验证的Kubernetes集群。 唯一的一点是您的用户还没有配置客户端以及他们自己的kubeconfig。 要解决此问题,需要在成功授权后为用户配置kubeconfig的自动发布。


为此,您可以使用特殊的Web应用程序来允许您对用户进行身份验证,然后下载完成的kubeconfig。 最方便的方法之一是Kuberos ,它使您可以在一个配置中描述所有Kubernetes集群,并可以在它们之间轻松切换。


要配置Kuberos,只需描述kubeconfig的模板并使用以下参数运行:


 kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template 

有关更多详细信息,请参见在Github上的用法


如果您想直接在用户计算机上进行授权,也可以使用kubelogin 。 在这种情况下,用户将在本地主机上打开带有授权表单的浏览器。


可以在jwt.io上检查生成的kubeconfig。 只需将users[].user.auth-provider.config.id-tokenusers[].user.auth-provider.config.id-token的值复制到站点上的表单中,即可立即获得解密。


RBAC设置


设置RBAC时,可以同时引用用户名(jwt令牌中的name字段)和用户组(jwt令牌中的groups字段)。 这是为kubernetes-default-namespace-admins组设置权限的示例:


kubernetes-默认名称空间-admins.yaml
 apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: default-admins namespace: default rules: - apiGroups: - '*' resources: - '*' verbs: - '*' --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kubernetes-default-namespace-admins namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: default-admins subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: kubernetes-default-namespace-admins 

可以在Kubernetes官方文档中找到有关RBAC的更多示例


配置身份验证代理


有一个很棒的keycloak-gatekeeper项目,它使您可以保护任何应用程序,并使用户能够通过OIDC服务器进行身份验证。 我将展示如何使用Kubernetes仪表板作为示例进行配置:


仪表板代理
 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kubernetes-dashboard-proxy spec: replicas: 1 template: metadata: labels: app: kubernetes-dashboard-proxy spec: containers: - args: - --listen=0.0.0.0:80 - --discovery-url=https://keycloak.example.org/auth/realms/kubernetes - --client-id=kubernetes - --client-secret=<your-client-secret-here> - --redirection-url=https://kubernetes-dashboard.example.org - --enable-refresh-tokens=true - --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh - --upstream-url=https://kubernetes-dashboard.kube-system - --resources=uri=/* image: keycloak/keycloak-gatekeeper name: kubernetes-dashboard-proxy ports: - containerPort: 80 livenessProbe: httpGet: path: /oauth/health port: 80 initialDelaySeconds: 3 timeoutSeconds: 2 readinessProbe: httpGet: path: /oauth/health port: 80 initialDelaySeconds: 3 timeoutSeconds: 2 --- apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard-proxy spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: kubernetes-dashboard-proxy type: ClusterIP 

Source: https://habr.com/ru/post/zh-CN441112/


All Articles