我们将 LDAP 授权固定到 Kubernetes

我们将 LDAP 授权固定到 Kubernetes

关于如何使用 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。 最方便的之一是 库贝罗斯,它允许您在一个配置中描述所有 Kubernetes 集群,并在它们之间轻松切换。

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

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

欲了解更多详情,请参阅 用法 在 Github 上。

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

生成的 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 的更多示例可以在以下位置找到: Kubernetes 官方文档

设置授权代理

有一个很棒的项目 钥匙斗篷看门人,它允许您通过允许用户向 OIDC 服务器进行身份验证来保护任何应用程序。 我将向您展示如何使用 Kubernetes 仪表板作为示例进行设置:

仪表板-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

添加评论