过去我们在使用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
那这边设定完後,明天就会来进行验证的工作了。
一不小心篇幅弄得有点长,想想还是分成两篇好了......
云端服务的一项重点服务是资料储存,今天让我们一起来瞧瞧AWS上的资料储存服务-S3。 1. 为何要用...
一日客语:中文:凤梨 客语:vong(三声)李(黄梨) 介绍promise 简化非同步程序设计的一项...
对於一个 Gradle 专案来说,一切设定与运作的核心都纪录在 Build Script 里。为了让...
为电子书阅读器而开发的浏览器 APP,在绕了一大圈之後,终於又绕回了电子书本身。原本的实作就已经可以...
环境 Windows 10 21H1 ETW 介绍 历史 ETW (Event Tracing fo...