我們將 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, mysqlmariadb.
如果您仍然決定單獨安裝 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

來源: www.habr.com

添加評論