
有关如何将Kubernetes与Keycloak结合使用的简短说明,以绑定到LDAP服务器并配置用户和组导入。 这将允许您为用户配置RBAC,并使用auth-proxy保护Kubernetes仪表板和其他无法授权自己的应用程序。
安装Keycloak
假设您已经有一个LDAP服务器。 它可以是Active Directory,FreeIPA,OpenLDAP或其他任何东西。 如果您没有LDAP服务器,则原则上可以直接在Keycloak界面中创建用户,或使用公共oidc提供程序(Google,Github,Gitlab),结果将几乎相同。
首先,我们将安装Keycloak本身,安装可以单独执行,然后立即在Kubernetes集群中进行,通常,如果您有多个Kubernetes集群,则分别安装会更容易。 另一方面,您始终可以使用官方头盔图并将其直接安装在集群中。
要存储Keycloak数据,您需要一个数据库。 默认情况下,使用h2
(所有数据都存储在本地),但是也可以使用postgres
, mysql
或mariadb
。
如果您仍然决定单独安装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 |
用户DN | cn=users,cn=accounts,dc=example,dc=org |
绑定dn | uid=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- > 映射器 -> 名
现在启用组映射:
用户联盟 -> freeipa.example.org- > 映射器 -> 创建
选件 | 价值 |
---|
名称 | groups |
映射器类型 | group-ldap-mapper |
LDAP组DN | cn=groups,cn=accounts,dc=example,dc=org |
用户组检索策略 | GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE |
这样就完成了联盟的配置,让我们继续设置客户端。
客户端设置
创建一个新客户端(一个将从Keycloak接收用户的应用程序)。 我们通过:
客户 -> 创建
选件 | 价值 |
---|
客户编号 | kubernetes |
访问类型 | confidenrial |
根URL | http://kubernetes.example.org/ |
有效的重定向URI | http://kubernetes.example.org/* |
管理员网址 | http://kubernetes.example.org/ |
还为组创建范围:
客户范围 -> 创建
选件 | 价值 |
---|
范本 | No template |
名称 | groups |
完整的群组路径 | false |
并为其配置映射器:
客户范围 -> 组 -> 映射器 -> 创建
选件 | 价值 |
---|
名称 | groups |
映射器类型 | Group membership |
代币声明名称 | groups |
现在我们需要在客户范围内启用映射组:
客户端 -> kubernetes- > 客户端作用域 -> 默认客户端作用域
在“ 可用的客户范围”中选择组 ,单击“ 添加所选内容”
现在配置我们的应用程序的身份验证,请转到:
客户 -> kubernetes
单击“ 保存” ,这样就完成了客户端设置,现在在选项卡上
客户端 -> 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-token
的users[].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