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

那这边设定完後,明天就会来进行验证的工作了。

闲聊

一不小心篇幅弄得有点长,想想还是分成两篇好了......


<<:  Day20 常用设定参数

>>:  管理API 变化之API version

Day 03 - 任你存S3

云端服务的一项重点服务是资料储存,今天让我们一起来瞧瞧AWS上的资料储存服务-S3。 1. 为何要用...

初学者跪着学JavaScript Day27 : 渣男给不完的promise

一日客语:中文:凤梨 客语:vong(三声)李(黄梨) 介绍promise 简化非同步程序设计的一项...

第十三天:初探 Gradle Build Script

对於一个 Gradle 专案来说,一切设定与运作的核心都纪录在 Build Script 里。为了让...

电子书阅读器上的浏览器 [Day15] 网页汇出成 epub 档案 (I)

为电子书阅读器而开发的浏览器 APP,在绕了一大圈之後,终於又绕回了电子书本身。原本的实作就已经可以...

【Day 23】为美好的 Windows 献上 ETW - Event Tracing for Windows

环境 Windows 10 21H1 ETW 介绍 历史 ETW (Event Tracing fo...