過去我們在使用Kubernetes的權限,往往可能就是用admin.conf,或是serviceaccount搭配clusterrole、clusterrolebinding、role、rolebinding,再配合token產出kubeconfig,而這樣子的配置對於安全性來說可能有些不洽當(例如保留在本機的token也許不會過期之類的),而且當想要直接kubectl access cluster的人一多起來,管理也會變得相對混亂。這次要來介紹使用Dex與Gitlab OIDC並搭配kubelogin進行身分控管。
簡單來看一下dex connector的架構,我們使用者存取某項應用時,這項應用他需要外部IdP的身分認證才能夠執行的時候,我們就可以透過dex server作為中介傳遞,這邊的最大的好處我想就是在當有多個外部IdP的時候,可以有效減少程式的開發,透過dex server能夠達到multiple connectors的功能,而程式端僅需專注在與dex server的應對。
眼尖的朋友應該有發現,ArgoCD SSO那章節那邊也是基於dex server來實作的
另外dex本身也是一個IdP的實作,透過設定可以開啟local帳號的功能。
圖片來自dex官方github
在開始安裝dex server前,我們先產一下自簽憑證,CA的部分我們則偷懶直接使用kubernetes相同的CA,host的部分指定為192.168.1.241這之後會是我們dex server使用的IP
在/etc/kubernetes/ssl底下,實務上請不要這樣做唷,最好是用真的憑證+domain,不然也換一個CA&自簽憑證。
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"Homelab": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
EOF
cat > homelab-dex-csr.json << EOF
{
"CN": "dex-server",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "TW",
"L": "Taipei",
"O": "Homelab",
"OU": "Homelab CA",
"ST": "Xizhi"
}
],
"hosts": [
"192.168.1.241"
]
}
EOF
cfssl gencert -ca ca.crt -ca-key ca.key -config ca-config.json -profile=Homelab homelab-dex-csr.json | cfssljson -bare homelab-dex
執行完後目錄底下就會有ca、homelab-dex的憑證與key,接著我們建一個dex的namespace並將tls放入kubernetes的secret當中。
kubectl create ns dex
kubectl create secret tls dex-tls --cert=homelab-dex.pem --key=homelab-dex-key.pem -n dex
再來我們一樣打開gitlab的group,創建applications,設定callback URL為https://192.168.1.241/callback
將這邊的application ID、client secret記起來等等會使用。
接著我們一樣透過helm佈署dex,先產出value.yml
helm repo add dex https://charts.dexidp.io
helm repo update
helm show values dex/dex --version 0.6.3 > values.yml
修改values.yml,我將大致上的yaml內容標記出來
https: ##開啟https
enabled: true
.
.
.
config: ##config這邊都要自己設定,可以參考dex官方
storage:
type: kubernetes
config:
inCluster: true
connectors: ##設定gitlab IdP connector
- config:
baseURL: https://gitlab.com
clientID: xxxxx
clientSecret: xxxxx
redirectURI: https://192.168.1.241/callback
groups:
- gurubear-ithome-13th ##設定白名單group
id: gitlab
name: gitlab
type: gitlab
issuer: https://192.168.1.241
web:
https: 0.0.0.0:5554
tlsCert: /etc/dex/tls/tls.crt ##要指定給他憑證的位置
tlsKey: /etc/dex/tls/tls.key
oauth2:
skipApprovalScreen: true
staticClients: ## 後續kubelogin使用的
- id: kubernetes
name: kubernetes
redirectURIs:
- http://localhost:8000
secret: qwertasdfg ## secret為自訂變數
.
.
.
volumes: ##我們要將憑證mount給dex server
- name: dex-secret
secret:
secretName: dex-tls
volumeMounts:
- name: dex-secret
mountPath: /etc/dex/tls
.
.
.
service: ## 設定成openELB的loadBalancer模式
annotations:
lb.kubesphere.io/v1alpha1: porter
protocol.porter.kubesphere.io/v1alpha1: layer2
eip.porter.kubesphere.io/v1alpha2: porter-layer2-eip
type: LoadBalancer
clusterIP: ""
ports:
http:
port: 80
nodePort:
https:
port: 443
nodePort:
grpc:
port: 5557
接著就佈署
helm install homelab-dex dex/dev -f values.yml --version 0.6.3 --namespace dex
佈署的內容相對單純
接下來我們必須要前往master節點上調整kube-apiserver的參數內容,加入oidc驗證的環節。前往master由於我們的component是以static pod方式建立在/etc/kubernetes/manifest
底下,我們就前往修改各master底下的kube-apiserver.yml,添加下列的flag,告訴kube-Apiserver我的oidc issuer(dex server設定的)與預計的username claim(email)。
- --oidc-issuer-url=https://192.168.1.241
- --oidc-client-id=kubernetes
- --oidc-ca-file=/etc/kubernetes/ssl/ca.crt
- --oidc-username-claim=email
- --oidc-groups-claim=groups
那這邊設定完後,明天就會來進行驗證的工作了。
一不小心篇幅弄得有點長,想想還是分成兩篇好了......