关于如何使用 Keycloak 将 Kubernetes 连接到 LDAP 服务器并设置用户和组导入的小教程。 这将允许您为用户设置 RBAC 并使用 auth-proxy 来保护 Kubernetes Dashboard 和其他不知道如何对自身进行授权的应用程序。
钥匙斗篷安装
假设您已经有一个 LDAP 服务器。 它可以是 Active Directory、FreeIPA、OpenLDAP 或其他。 如果你没有 LDAP 服务器,那么原则上你可以直接在 Keycloak 界面中创建用户,或者使用公共 oidc 提供者(Google、Github、Gitlab),结果会几乎相同。
首先我们来安装Keycloak本身,安装可以单独进行,也可以直接安装到Kubernetes集群上,一般来说,如果你有多个Kubernetes集群,单独安装会更容易。 另一方面,您始终可以使用
要存储 Keycloak 数据,您需要一个数据库。 默认为 h2
(所有数据都存储在本地),但也可以使用 postgres
, mysql
или mariadb
.
如果您仍然决定单独安装 Keycloak,您可以在以下位置找到更详细的说明:
联盟设置
首先,让我们创建一个新领域。 Realm 是我们应用程序的空间。 每个应用程序都可以拥有自己的领域,具有不同的用户和授权设置。 主域由 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/[email protected]
关键选项卡:
/etc/krb5.keytab
成员 keycloak-svc
必须提前在我们的 LDAP 服务器上创建。
对于 Active Directory,只需选择 供应商:活动目录 必要的设置将自动插入到表单中。
点击这里 保存
现在让我们继续:
用户联盟 -> freeipa.example.org -> 映射器 -> 名
附加选项
值
LDAP 属性
givenName
现在启用组映射:
用户联盟 -> freeipa.example.org -> 映射器 -> 创建
附加选项
值
名字
groups
映射器类型
group-ldap-mapper
LDAP 组 DN
cn=groups,cn=accounts,dc=example,dc=org
用户组检索策略
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
这就完成了联合设置,让我们继续设置客户端。
客户端设置
让我们创建一个新的客户端(一个将从 Keycloak 接收用户的应用程序)。 我们走吧:
客户 -> 创建
附加选项
值
客户ID
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
附加选项
值
授权已启用
ON
让我们推一下 保存 这样就完成了客户端设置,现在位于选项卡上
客户 -> kubernetes -> 资历
你可以得到 秘密 我们稍后会用到。
配置 Kubernetes
设置 Kubernetes 进行 OIDC 授权非常简单,也不是很复杂。 您所需要做的就是将 OIDC 服务器的 CA 证书放入 /etc/kubernetes/pki/oidc-ca.pem
并为 kube-apiserver 添加必要的选项。
为此,请更新 /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,只需描述 kubeconfig 的模板并使用以下参数运行它即可:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
欲了解更多详情,请参阅
也可以使用
生成的 kubeconfig 可以在网站上查看 users[].user.auth-provider.config.id-token
从您的 kubeconfig 到网站上的表格并立即获取成绩单。
RBAC 设置
配置RBAC时,可以引用用户名(字段 name
在 jwt 令牌中)和一组用户(字段 groups
在 jwt 令牌中)。 以下是为组设置权限的示例 kubernetes-default-namespace-admins
:
kubernetes-default-namespace-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
有关 RBAC 的更多示例可以在以下位置找到:
设置授权代理
有一个很棒的项目
仪表板-proxy.yaml
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
来源: habr.com