作者:申紅磊,青雲QingCloud 容器解決方案架構師,開源專案愛好者,KubeSphere Member。
背景
在實際使用中,會有一些使用者,在不同場景中經常碰到 OpenLDAP 對接問題:
- 能否對接 LDAP?
- 對接方式都有什麼,有介面嗎?
- 能否按自己要求來對接指定賬戶,而非全部賬戶都能訪問?
- 能否批次匯入賬戶?
- 預設角色如何繫結?
在這裡可以簡單操作一下,以便來拋磚引玉,主要思路為:在 KubeSphere 中直接執行一個 LDAP Server,用 ApacheDirectoryStudio 來驗證,然後使用 KubeSphere 進行 LDAP 對接驗證。
前置條件
您需要部署一個 K8s 叢集,並在叢集中安裝 KubeSphere。有關詳細資訊,請參閱在 Linux 上安裝和在 Kubernetes 上安裝。
KubeSphere 中部署 LDAP
這裡透過應用為使用者提供完整的業務功能,由一個或多個特定功能的元件組成。來部署 OpenLDAP
部署 LDAP 應用
建立無狀態服務(演示使用)
這裡使用的映象為:bitnami/openldap:latest
docker pull bitnami/openldap:latest
# 參考 the OpenLDAP server instance 可以配置 env 在後面使用
$ docker run --detach --rm --name openldap \
--network my-network \
--env LDAP_ADMIN_USERNAME=admin \
--env LDAP_ADMIN_PASSWORD=adminpassword \
--env LDAP_USERS=customuser \
--env LDAP_PASSWORDS=custompassword \
bitnami/openldap:latest
配置 Resources 的 Request 和 Limit ,並使用預設埠:
上面所說的環境變數,可以進行批次引用(KS 很多功能,明亮簡潔又好用)。
外部訪問,這裡使用模式為:NodePort。
服務如下,透過 1389 對應的 NodePort 30598 來訪問。
ApacheDirectoryStudio 驗證 LDAP
透過 ApacheDirectoryStudio 來直接驗證,確認 OpenLDAP server instance 無問題後,再進行 KubeSphere 的對接。首先先下載 Mac 版 ApacheDirectoryStudio。
下載部署 ApacheDirectoryStudio
ApacheDirectoryStudio-2.0.0.v20210717-M17-macosx.cocoa.x86_64.dmg
安裝部署後 ApacheDirectoryStudio 如下:
ApacheDirectoryStudio 測試 LDAP
建立 CONNECTIONS:
Connection Name: LDAP4KS-admin
NetWork Parameter
HostName: 192.168.100.2
Port: 30598
Connection timeout(s): 30
Encryption method: no encryption
Authentication:
Authentication Method: Simple authentication
#參考上面時設定的 the OpenLDAP server instance 可以配置 env 在後面使用
Authentication Parameter:
Bind DB or User: cn=admin,dc=example,dc=org
Bind password: adminpassword
在 the OpenLDAP server instance 可以配置 env 在後面使用
--env LDAP_ADMIN_USERNAME=admin \
--env LDAP_ADMIN_PASSWORD=adminpassword \
--env LDAP_USERS=customuser \
--env LDAP_PASSWORDS=custompassword \
Browser Options:
# 這裡可以透過 FetchBase DNs 獲取 Base DN: dc=example,dc=org
這裡有一個小細節,如果對接認證賬戶不是 admin, 在 ApacheDirectoryStudio 中新增 Entry 時會顯示無許可權新增,所以 Studio 對接時可以選擇使用 admin , 查詢對接時可以使用其它賬戶。
建立 Ldap Search ,KS 對接時可選擇使用
這裡舉例展示,userSearchFilter 的結果集,可以根據自己業務需求,將符合條件的使用者,顯示這個 Ldap Search 中,這裡只是在 filter 中新增一個條件為:(uid=customuser001)
dc=example,dc=org - Filter: (uid=customuser001)
#在 KubeSphere 對接中,這裡顯示為:
userSearchFilter: (uid=customuser001)
KubeSphere 對接 LDAP
Harbor 的對接介面是醬紫
KubeSphere 的對接方式是醬紫
上述 Harbor 對接 LDAP 介面功能,這裡同樣可以實現。
暫時沒有介面,CRD ClusterConfiguration 中的 ks-installer:
kubectl -n kubesphere-system edit cc ks-installer
spec:
alerting:
enabled: true
auditing:
enabled: true
authentication:
jwtSecret: ""
maximumClockSkew: 10s
multipleLogin: true
oauthOptions:
accessTokenInactivityTimeout: 30m
accessTokenMaxAge: 1h
identityProviders:
- mappingMethod: auto
name: LDAP
provider:
host: ldap.middleware.svc:1389 #這裡我填寫的為 KS 叢集內部訪問方式
loginAttribute: uid
mailAttribute: mail
managerDN: cn=admin,dc=example,dc=org
managerPassword: adminpassword
userSearchBase: dc=example,dc=org
userSearchFilter: (uid=customuser001) #這裡配置userSearchFilter可根業務靈活配置
type: LDAPIdentityProvider
排錯或者檢視日誌情況:
#在 cc 裡配置好,等待 ks-installer 自動更新;或者手動重啟 ks-apiserver
#編輯ks-installer
kubectl edit cc -n kubesphere-system ks-installer
#重啟ks-installer
kubectl rollout restart -n kubesphere-system deploy ks-installer
#重啟ks-apiserver
kubectl rollout restart -n kubesphere-system deploy ks-apiserver
#檢視ks-apiserver日誌
kubectl -n kubesphere-system logs ks-apiserver-xxxxxxxxx
KubeSphere 配置驗證
http://192.168.100.2:30880/kapis/config.kubesphere.io/v1alpha2/configs/oauth
驗證配置內容已經正確更新:
如果 mappingMethod 設定為 lookup,可以執行以下命令並新增標籤來進行帳戶關聯。如果 mappingMethod 是 auto 可以跳過這個部分。
kubectl edit user <KubeSphere username>
labels:
iam.kubesphere.io/identify-provider: <LDAP service name>
iam.kubesphere.io/origin-uid: <LDAP username>
測試使用 OpenLDAP
首先我在 OpenLDAP 中 ldap search 結果顯示只有一個使用者 customuser001。
那麼就用 customuser001 這個使用者來嘗試登入試試:
#這個使用者是我在 studio 中透過介面新增的一個新使用者,customuser001,密碼為:custompassword001
customuser001
custompassword001
切換回管理員,檢視賬戶同步內容:
目前來看,預設同步的賬戶可以登入,但是沒有賦予角色,需要再人為分配下或者設定成預設角色進行匯入。
批次匯出匯入使用者資料到 KubeSphere
這裡只提供一下思路,批次指令碼可自行編寫:
#可以在 KubeSphere 中提前匯入第三方(eg.ldap)賬戶並關聯平臺角色、企業空間
cat << EOF | kubectl apply -f -
apiVersion: iam.kubesphere.io/v1alpha2
kind: User
metadata:
labels:
iam.kubesphere.io/identify-provider: <IDENTITY_PROVIDER_NAME> #這裡指配置名稱為:ldap
iam.kubesphere.io/origin-uid: <UID> #第三方賬戶的 UID
name: <USERNAME> # 關聯的 KubeSphere 賬戶名稱
spec:
email: <EMAIL> # 關聯的 KubeSphere 賬戶email
EOF
匯入賬號到 KubeSphere
#eg.賬戶資料如下
identify-provider:ldap
origin-uid:customuser002
email:custompasswordaa@ks.com
cat << EOF | kubectl apply -f -
apiVersion: iam.kubesphere.io/v1alpha2
kind: User
metadata:
labels:
iam.kubesphere.io/identify-provider: ldap
iam.kubesphere.io/origin-uid: customuser002
name: customuser002
spec:
email: custompasswordaa@ks.com
EOF
root@i-9z8gtfm9:/home/ubuntu# kubectl get user
NAME EMAIL STATUS
admin admin@kubesphere.io Active
customuser customuser@ks.com Active
customuser001 customusera@example.com Active
customuser002 custompasswordaa@ks.com Active
shl shl@163.com Active
為匯入賬號關聯平臺角色
這裡將使用者 customuser001 關聯成 platform-regular 角色:
cat << EOF | kubectl apply -f -
apiVersion: iam.kubesphere.io/v1alpha2
kind: GlobalRoleBinding
metadata:
labels:
iam.kubesphere.io/user-ref: customuser001
name: customuser001-platform-regular
roleRef:
apiGroup: iam.kubesphere.io
kind: GlobalRole
name: platform-regular #查詢平臺已有的角色
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: customuser001
EOF
執行後,查詢結果:
root@i-9z8gtfm9:/home/ubuntu# kubectl get globalrolebinding
NAME AGE
admin 139d
anonymous 139d
authenticated 139d
customuser001-platform-regular 93s
pre-registration 139d
shl-platform-regular 139d
root@i-9z8gtfm9:/home/ubuntu# kubectl get globalrolebinding customuser001-platform-regular -oyaml
apiVersion: iam.kubesphere.io/v1alpha2
kind: GlobalRoleBinding
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"iam.kubesphere.io/v1alpha2","kind":"GlobalRoleBinding","metadata":{"annotations":{},"labels":{"iam.kubesphere.io/user-ref":"customuser001"},"name":"customuser001-platform-regular"},"roleRef":{"apiGroup":"iam.kubesphere.io","kind":"GlobalRole","name":"platform-regular"},"subjects":[{"apiGroup":"rbac.authorization.k8s.io","kind":"User","name":"customuser001"}]}
creationTimestamp: "2023-01-03T08:34:23Z"
generation: 1
labels:
iam.kubesphere.io/user-ref: customuser001
kubefed.io/managed: "false"
name: customuser001-platform-regular
resourceVersion: "3436734"
uid: 9d7a18a6-b4c9-40f8-8186-7029575e5d2d
roleRef:
apiGroup: iam.kubesphere.io
kind: GlobalRole
name: platform-regular
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: customuser001
已有企業空間 / 建立企業空間
#這裡注意多叢集的企業空間差異
cat << EOF | kubectl apply -f -
apiVersion: tenant.kubesphere.io/v1alpha2
kind: WorkspaceTemplate
metadata:
name: app
spec:
# placement: {}
placement:
clusters:
- name: <CLUSTER_NAME>
template:
spec:
manager: <USERNAME>
EOF
將使用者關聯企業空間角色
cat << EOF | kubectl apply -f -
apiVersion: iam.kubesphere.io/v1alpha2
kind: WorkspaceRoleBinding
metadata:
labels:
iam.kubesphere.io/user-ref: <USERNAME>
kubesphere.io/workspace: <WORKSPACE_NAME>
name: <USERNAME>-<WORKSPACE_ROLE_NAME>
roleRef:
apiGroup: iam.kubesphere.io
kind: WorkspaceRole
name: <WORKSPACE_ROLE_NAME>
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: <USERNAME>
EOF
將使用者和上述方法進行批次化指令碼即可
# 更為高階靈活的使用方法,可以升級為定期、定時、觸發式、差異化增量/全量同步賬戶資訊
本文由部落格一文多發平臺 OpenWrite 釋出!