關於如何使用 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
來源: www.habr.com