
Keycloakã䜿çšããŠKubernetesãLDAPãµãŒããŒã«æ¥ç¶ãããŠãŒã¶ãŒãšã°ã«ãŒãã®ã€ã³ããŒããèšå®ããæ¹æ³ã«é¢ããå°ããªãã¥ãŒããªã¢ã«ã ããã«ããããŠãŒã¶ãŒã«å¯Ÿã㊠RBAC ãèšå®ããèªèšŒãããã·ã䜿çšã㊠Kubernetes ããã·ã¥ããŒãããèªèº«ãèªèšŒããæ¹æ³ãããããªããã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ãä¿è·ã§ããããã«ãªããŸãã
Keycloakã®ã€ã³ã¹ããŒã«
ãã§ã« LDAP ãµãŒããŒããããšä»®å®ããŸãã Active DirectoryãFreeIPAãOpenLDAP ãªã©ã®å¯èœæ§ããããŸãã LDAP ãµãŒããŒããªãå Žåã¯ãååãšããŠãKeycloak ã€ã³ã¿ãŒãã§ãŒã¹ã§çŽæ¥ãŠãŒã¶ãŒãäœæããããšãããããªã㯠oidc ãããã€ã㌠(GoogleãGithubãGitlab) ã䜿çšããããšãã§ããçµæã¯ã»ãŒåãã«ãªããŸãã
ãŸããKeycloak èªäœãã€ã³ã¹ããŒã«ããŸããããã€ã³ã¹ããŒã«ã¯åå¥ã«å®è¡ããããšããKubernetes ã¯ã©ã¹ã¿ãŒã«çŽæ¥å®è¡ããããšãã§ããŸããååãšããŠãè€æ°ã® Kubernetes ã¯ã©ã¹ã¿ãŒãããå Žåã¯ãåå¥ã«ã€ã³ã¹ããŒã«ããæ¹ãç°¡åã§ãã äžæ¹ã§ããã€ã§ã䜿çšã§ããŸã ãããã¯ã©ã¹ã¿ãŒã«çŽæ¥ã€ã³ã¹ããŒã«ããŸãã
Keycloak ããŒã¿ãä¿åããã«ã¯ãããŒã¿ããŒã¹ãå¿
èŠã§ãã ããã©ã«ã㯠h2 (ãã¹ãŠã®ããŒã¿ã¯ããŒã«ã«ã«ä¿åãããŸã) ã䜿çšããããšãã§ããŸãã postgres, mysql ãŸã㯠mariadb.
ããã§ã Keycloak ãåå¥ã«ã€ã³ã¹ããŒã«ããå Žåã¯ãããè©³çŽ°ãªæé ãåç
§ããŠãã ããã .
ãã§ãã¬ãŒã·ã§ã³ã®ã»ããã¢ãã
ãŸããæ°ããã¬ã«ã ãäœæããŸãããã ã¬ã«ã ã¯ã¢ããªã±ãŒã·ã§ã³ã®ç©ºéã§ãã åã¢ããªã±ãŒã·ã§ã³ã¯ãç°ãªããŠãŒã¶ãŒãšèªèšŒèšå®ãæã€ç¬èªã®ã¬ã«ã ãæã€ããšãã§ããŸãã ãã¹ã¿ãŒã¬ã«ã ã¯Keycloakèªäœã«ãã£ãŠäœ¿çšãããŠããããããä»ã®çšéã«äœ¿çšããããšã¯ééã£ãŠããŸãã
ã¯ãªã㯠ã¬ã«ã ã®è¿œå
ãªãã·ã§ã³
å€
åå
kubernetes
衚瀺å
Kubernetes
HTML衚瀺å
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes ã¯ããã©ã«ãã§ããŠãŒã¶ãŒã®é»åã¡ãŒã«ã確èªããããã©ããããã§ãã¯ããŸãã ç¬èªã® LDAP ãµãŒããŒã䜿çšããŠããããããã®ãã§ãã¯ã§ã¯ã»ãšãã©ã®å Žå次ã®çµæãè¿ãããŸãã falseã Kubernetes ã§ã®ãã®èšå®ã®è¡šçŸãç¡å¹ã«ããŠã¿ãŸãããã
ã¯ã©ã€ã¢ã³ãã¹ã³ãŒã -> ã¡ãŒã«ã¢ãã¬ã¹ -> ããã㌠-> ã¡ãŒã«èªèšŒæžã¿ ïŒæ¶å»ïŒ
次ã«ããã§ãã¬ãŒã·ã§ã³ãèšå®ããŸãããããã®ããã«ãæ¬¡ã®æé ã«é²ã¿ãŸãã
ãŠãŒã¶ãŒé£å -> ãããã€ããŒã远å ⊠-> LDAP
FreeIPA ã®ã»ããã¢ããäŸã次ã«ç€ºããŸãã
ãªãã·ã§ã³
å€
ã³ã³ãœãŒã«ã®è¡šç€ºå
freeipa.example.org
ãã³ããŒ
Red Hat Directory Server
UUID LDAP 屿§
ipauniqueid
æ¥ç¶URL
ldaps://freeipa.example.org
ãŠãŒã¶ãŒDN
cn=users,cn=accounts,dc=example,dc=org
ãã€ã³ãDN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
èªèšŒæ
å ±ã®ãã€ã³ã
<password>
Kerberos èªèšŒãèš±å¯ããŸãã
on
ã±ã«ããã¹ã¬ã«ã :
EXAMPLE.ORG
ãµãŒããŒããªã³ã·ãã«:
HTTP/freeipa.example.org@EXAMPLE.ORG
ããŒã¿ã:
/etc/krb5.keytab
䜿çšè
keycloak-svc äºåã«åŒç€Ÿã®LDAPãµãŒããŒäžã«äœæããŠããå¿
èŠããããŸãã
Active Directory ã®å Žåã¯ãåã«éžæããã ãã§ã ãã³ããŒ: Active Directory å¿ èŠãªèšå®ããã©ãŒã ã«èªåçã«æ¿å ¥ãããŸãã
ã¯ãªã㯠Save
次ã«é²ã¿ãŸããã:
ãŠãŒã¶ãŒé£å -> freeipa.example.org -> ããã㌠-> å
ãªãã·ã§ã³
å€
LDAP 屿§
givenName
次ã«ãã°ã«ãŒã ãããã³ã°ãæå¹ã«ããŸãã
ãŠãŒã¶ãŒé£å -> freeipa.example.org -> ããã㌠-> åµé ãã
ãªãã·ã§ã³
å€
åå
groups
ããããŒã®çš®é¡
group-ldap-mapper
LDAPã°ã«ãŒãDN
cn=groups,cn=accounts,dc=example,dc=org
ãŠãŒã¶ãŒã°ã«ãŒãã®ååŸæŠç¥
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
ããã§ãã§ãã¬ãŒã·ã§ã³ã®ã»ããã¢ããã¯å®äºã§ããã¯ã©ã€ã¢ã³ãã®ã»ããã¢ããã«é²ã¿ãŸãããã
ã¯ã©ã€ã¢ã³ãã®ã»ããã¢ãã
æ°ããã¯ã©ã€ã¢ã³ã (Keycloak ãããŠãŒã¶ãŒãåãåãã¢ããªã±ãŒã·ã§ã³) ãäœæããŸãããã ããè¡ããïŒ
ååŒå®çžŸ -> åµé ãã
ãªãã·ã§ã³
å€
顧客ID
kubernetes
ã¢ã¯ã»ã¹ã¿ã€ã
confidenrial
ã«ãŒãURL
http://kubernetes.example.org/
æå¹ãªãªãã€ã¬ã¯ã URI
http://kubernetes.example.org/*
管çè
URL
http://kubernetes.example.org/
ã°ã«ãŒãã®ã¹ã³ãŒããäœæããŸãã
ã¯ã©ã€ã¢ã³ãã¹ã³ãŒã -> åµé ãã
ãªãã·ã§ã³
å€
ãã³ãã¬ãŒã
No template
åå
groups
å®å
šãªã°ã«ãŒããã¹
false
ãããŠããããã®ããã«ããããŒãã»ããã¢ããããŸãã
ã¯ã©ã€ã¢ã³ãã¹ã³ãŒã -> ã°ã«ãŒãããã -> ããã㌠-> åµé ãã
ãªãã·ã§ã³
å€
åå
groups
ããããŒã®ã¿ã€ã
Group membership
ããŒã¯ã³èŠæ±å
groups
次ã«ãã¯ã©ã€ã¢ã³ã ã¹ã³ãŒãã§ã°ã«ãŒã ãããã³ã°ãæå¹ã«ããå¿ èŠããããŸãã
ååŒå®çžŸ -> ã¯ãã«ããã¹ -> ã¯ã©ã€ã¢ã³ãã¹ã³ãŒã -> ããã©ã«ãã®ã¯ã©ã€ã¢ã³ãã¹ã³ãŒã
éžæããŸã ã°ã«ãŒãããã в å©çšå¯èœãªã¯ã©ã€ã¢ã³ã ã¹ã³ãŒãã ãã¬ã¹ éžæãããã®ã远å
次ã«ãã¢ããªã±ãŒã·ã§ã³ã®èªèšŒãèšå®ããŸããããæ¬¡ã®å Žæã«é²ã¿ãŸãã
ååŒå®çžŸ -> ã¯ãã«ããã¹
ãªãã·ã§ã³
å€
èªèšŒãæå¹ã§ã
ON
æŒããŠã¿ãŸããã ä¿å ããã§ã¯ã©ã€ã¢ã³ãã®ã»ããã¢ãããå®äºããã¿ãäžã«è¡šç€ºãããŸã
ååŒå®çžŸ -> ã¯ãã«ããã¹ -> Credentials
åŸããã ç§å¯ ããã¯åŸã§äœ¿çšããŸãã
Kubernetesã®æ§æ
OIDC èªèšŒçšã« Kubernetes ãã»ããã¢ããããã®ã¯éåžžã«ç°¡åã§ãããã»ã©è€éãªãã®ã§ã¯ãããŸããã OIDC ãµãŒããŒã® CA èšŒææžã /etc/kubernetes/pki/oidc-ca.pem ãããŠãkube-apiserver ã«å¿
èŠãªãªãã·ã§ã³ã远å ããŸãã
ãããè¡ãã«ã¯ãæŽæ°ããŸã /etc/kubernetes/manifests/kube-apiserver.yaml ãã¹ãŠã®ãã¹ã¿ãŒäžã§:
...
spec:
containers:
- command:
- kube-apiserver
...
- --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem
- --oidc-client-id=kubernetes
- --oidc-groups-claim=groups
- --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
- --oidc-username-claim=email
...ãŸããæŽæ°äžã«ãããã®èšå®ã倱ãããªãããã«ãã¯ã©ã¹ã¿ãŒå ã® kubeadm æ§æãæŽæ°ããŸãã
kubectl edit -n kube-system configmaps kubeadm-config...
data:
ClusterConfiguration: |
apiServer:
extraArgs:
oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem
oidc-client-id: kubernetes
oidc-groups-claim: groups
oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
oidc-username-claim: email
...ããã§Kubernetesã®ã»ããã¢ããã¯å®äºã§ãã ãã¹ãŠã® Kubernetes ã¯ã©ã¹ã¿ãŒã§ãããã®æé ãç¹°ãè¿ãããšãã§ããŸãã
åæèªèšŒ
ãããã®æé ãå®äºãããšãOIDC èªèšŒãæ§æããã Kubernetes ã¯ã©ã¹ã¿ãŒããã§ã«äœæãããŠããŸãã å¯äžã®ãã€ã³ãã¯ããŠãŒã¶ãŒããŸã ã¯ã©ã€ã¢ã³ããšç¬èªã® kubeconfig ãæ§æããŠããªãããšã§ãã ãã®åé¡ã解決ããã«ã¯ãæ¿èªãæåããåŸã«ãŠãŒã¶ãŒã« kubeconfig ãèªåçºè¡ããããã«æ§æããå¿ èŠããããŸãã
ãããè¡ãã«ã¯ããŠãŒã¶ãŒãèªèšŒããŠå®æãã kubeconfig ãããŠã³ããŒãã§ããç¹å¥ãª Web ã¢ããªã±ãŒã·ã§ã³ã䜿çšã§ããŸãã æã䟿å©ãªãã®ã® XNUMX ã€ã¯ã ã䜿çšãããšããã¹ãŠã® Kubernetes ã¯ã©ã¹ã¿ãŒã XNUMX ã€ã®æ§æã§èšè¿°ããããããç°¡åã«åãæ¿ããããšãã§ããŸãã
Kuberos ãæ§æããã«ã¯ãkubeconfig ã®ãã³ãã¬ãŒããèšè¿°ããæ¬¡ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠå®è¡ããã ãã§ååã§ãã
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template詳现ã«ã€ããŠã¯ããåç §ããŠãã ããã Githubã§ã
ã䜿çšããããšãå¯èœã§ã ãŠãŒã¶ãŒã®ã³ã³ãã¥ãŒã¿äžã§çŽæ¥èªèšŒãããå Žåã ãã®å ŽåããŠãŒã¶ãŒã¯ããŒã«ã«ãã¹ãäžã®èªèšŒãã©ãŒã ã䜿çšããŠãã©ãŠã¶ãéããŸãã
çµæã®kubeconfigã¯ãµã€ãã§ç¢ºèªã§ããŸã ã å€ãã³ããŒããã ãã§ã users[].user.auth-provider.config.id-token kubeconfig ãããµã€ãäžã®ãã©ãŒã ã«ã³ããŒãããã©ã³ã¹ã¯ãªãããããã«ååŸããŸãã
RBAC ã»ããã¢ãã
RBAC ãèšå®ããå ŽåããŠãŒã¶ãŒå (ãã£ãŒã«ã) ã®äž¡æ¹ãåç
§ã§ããŸãã name jwt ããŒã¯ã³å
) ããã³ãŠãŒã¶ãŒã®ã°ã«ãŒã (ãã£ãŒã«ã groups jwtããŒã¯ã³å
ïŒã ã°ã«ãŒãã®æš©éãèšå®ããäŸã次ã«ç€ºããŸãã kubernetes-default-namespace-admins:
kubernetes-default-namespace-admins.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: default-admins
namespace: default
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kubernetes-default-namespace-admins
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: default-admins
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: kubernetes-default-namespace-adminsRBAC ã®ãã®ä»ã®äŸã¯ã次ã®å Žæã«ãããŸãã
èªèšŒãããã·ã®èšå®
çŽ æŽããããããžã§ã¯ãããããŸã ããã«ããããŠãŒã¶ãŒã OIDC ãµãŒããŒã«å¯ŸããŠèªèšŒã§ããããã«ããããšã§ãããããã¢ããªã±ãŒã·ã§ã³ãä¿è·ã§ããŸãã äŸãšããŠãKubernetes ããã·ã¥ããŒãã䜿çšããŠã»ããã¢ããããæ¹æ³ã瀺ããŸãã
ããã·ã¥ããŒããããã·.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kubernetes-dashboard-proxy
spec:
replicas: 1
template:
metadata:
labels:
app: kubernetes-dashboard-proxy
spec:
containers:
- args:
- --listen=0.0.0.0:80
- --discovery-url=https://keycloak.example.org/auth/realms/kubernetes
- --client-id=kubernetes
- --client-secret=<your-client-secret-here>
- --redirection-url=https://kubernetes-dashboard.example.org
- --enable-refresh-tokens=true
- --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh
- --upstream-url=https://kubernetes-dashboard.kube-system
- --resources=uri=/*
image: keycloak/keycloak-gatekeeper
name: kubernetes-dashboard-proxy
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /oauth/health
port: 80
initialDelaySeconds: 3
timeoutSeconds: 2
readinessProbe:
httpGet:
path: /oauth/health
port: 80
initialDelaySeconds: 3
timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
name: kubernetes-dashboard-proxy
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: kubernetes-dashboard-proxy
type: ClusterIPåºæïŒ habr.com
