iT邦幫忙

2021 iThome 鐵人賽

DAY 28
1
自我挑戰組

HomeLab 30天,胡搞瞎搞亂弄一通。系列 第 28

Day28,使用Dex、OIDC為你的Kubernetes再上一道鎖 (1/2)

正文

過去我們在使用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

那這邊設定完後,明天就會來進行驗證的工作了。

閒聊

一不小心篇幅弄得有點長,想想還是分成兩篇好了......


上一篇
Day27,Kubesphere 體驗
下一篇
Day29,使用Dex、OIDC為你的Kubernetes再上一道鎖 (2/2)
系列文
HomeLab 30天,胡搞瞎搞亂弄一通。30

尚未有邦友留言

立即登入留言