KubeSphere 使用 OpenLDAP 進行統一認證完全指南

KubeSphere發表於2023-01-10
作者:申紅磊,青雲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 釋出!

相關文章