
Krátká příručka o tom, jak pomocí Keycloak propojit Kubernetes s vaším LDAP serverem a nastavit import uživatelů a skupin. To umožní nastavit RBAC pro vaše uživatele a používat auth-proxy k zabezpečení Kubernetes Dashboardu a dalších aplikací, které nejsou samostatně schopny provádět autorizaci.
Instalace Keycloak
Předpokládáme, že již máte LDAP server. Může to být Active Directory, FreeIPA, OpenLDAP nebo něco jiného. Pokud LDAP server nemáte, můžete uživatele vytvářet přímo v rozhraní Keycloak, nebo použít veřejné OIDC poskytovatele (Google, Github, Gitlab), výsledek bude téměř stejný.
Nejprve nainstalujeme samotný Keycloak, instalace může být provedena jak samostatně, tak přímo v Kubernetes clusteru, obvykle je jednodušší nainstalovat ho samostatně, pokud máte více Kubernetes clusterů. Na druhou stranu můžete vždy použít a nainstalovat ho přímo do vašeho clusteru.
Pro ukládání dat Keycloak budete potřebovat databázi. Ve výchozím nastavení se používá h2 (všechna data jsou uložena lokálně), ale je také možné použít Postgres, mysql nebo mariadb.
Pokud se přece jen rozhodnete nainstalovat Keycloak samostatně, podrobnější pokyny najdete v .
Nastavení federace
Nejprve vytvoříme nový realm. Realm je prostor naší aplikace. Každá aplikace může mít svůj vlastní realm s různými uživateli a nastavením autorizace. Master realm používá samotný Keycloak a není správné ho používat k něčemu jinému.
Klikneme Přidat realm
Možnost
Hodnota
Název
kubernetes
Zobrazovaný název
Kubernetes
HTML Zobrazovaný název
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes ve výchozím nastavení kontroluje, zda má uživatel ověřený email. Protože používáme vlastní LDAP server, bude tato kontrola téměř vždy vracet false. Pojďme zakázat zobrazení této možnosti v Kubernetes:
Klientské rozsahy —> E-mail —> Mappery —> Ověření emailu (Smazat)
Nyní nastavíme federaci, k tomu přejdeme na:
Uživatelská federace —> Přidat poskytovatele… —> ldap
Uvedu příklad nastavení pro FreeIPA:
Možnost
Hodnota
Zobrazovaný název konzole
freeipa.example.org
Dodavatel
Red Hat Directory Server
UUID LDAP atribut
ipauniqueid
URL připojení
ldaps://freeipa.example.org
Uživatelé DN
cn=users,cn=accounts,dc=example,dc=org
Bind DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Bind Credential
<password>
Povolit Kerberos autentizaci:
on
Kerberos Realm:
EXAMPLE.ORG
Server Principal:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
Uživatel keycloak-svc musí být předem vytvořen na našem LDAP serveru.
V případě Active Directory stačí jednoduše vybrat Dodavatel: Active Directory a potřebná nastavení se automaticky vyplní do formuláře.
Klikneme Uložit
Teď přejdeme:
Uživatelská federace —> freeipa.example.org —> Mappery —> Jméno
Možnost
Hodnota
Ldap atribut
givenName
Teď zapneme mapování skupin:
Uživatelská federace —> freeipa.example.org —> Mappery —> Vytvořit
Možnost
Hodnota
Název
groups
Typ mapperu
group-ldap-mapper
DN LDAP skupin
cn=groups,cn=accounts,dc=example,dc=org
Strategie získávání uživatelských skupin
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
S nastavením federace máme hotovo, přejdeme k nastavení klienta.
Nastavení klienta
Vytvoříme nového klienta (aplikaci, která bude získávat uživatele z Keycloak). Přejdeme:
Klienti —> Vytvořit
Možnost
Hodnota
Client ID
kubernetes
Typ přístupu
confidenrial
Kořenová URL
http://kubernetes.example.org/
Platné přesměrovací URI
http://kubernetes.example.org/*
Admin URL
http://kubernetes.example.org/
Také vytvoříme rozsah pro skupiny:
Rozsahy klientů —> Vytvořit
Možnost
Hodnota
Šablona
Žádná šablona
Název
groups
Celá cesta skupiny
false
A nastavíme pro ně mapper:
Rozsahy klientů —> groups —> Mappery —> Vytvořit
Možnost
Hodnota
Název
groups
Typ mapperu
Členství ve skupině
Název tokenu claim
groups
Teď musíme zapnout mapování skupin v našem rozsahu klienta:
Klienti —> kubernetes —> Rozsahy klientů —> Výchozí klientské rozsahy
Vyberte groups v Dostupné klientské rozsahy, klikněte na Přidat vybrané
Teď nastavíme autentizaci naší aplikace, přejdeme:
Klienti —> kubernetes
Možnost
Hodnota
Povolená autorizace
NA
Klikneme na uložit a tím je nastavení klienta dokončeno, nyní na kartě
Klienti —> kubernetes —> Ověření
budete moci získat Secret který budeme používat dále.
Nastavení Kubernetes
Nastavení Kubernetes pro OIDC autorizaci je dost triviální a není příliš složité. Vše, co potřebujete, je umístit CA certifikát vašeho OIDC serveru do /etc/kubernetes/pki/oidc-ca.pem a přidat potřebné možnosti pro kube-apiserver.
K tomu aktualizujte /etc/kubernetes/manifests/kube-apiserver.yaml na všech vašich majstrtech:
...
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
...Také aktualizujte kubeadm konfiguraci v clusteru, abyste neztratili tato nastavení při aktualizaci:
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
...S nastavením Kubernetes máme hotovo. Můžete opakovat tyto akce ve všech vašich Kubernetes clusterech.
Počáteční autorizace
Po těchto krocích již budete mít Kubernetes cluster se nastavenou OIDC autorizací. Jediný problém je, že vaši uživatelé zatím nemají nastaveného klienta ani vlastní kubeconfig. Abychom tento problém vyřešili, je nutné nastavit automatické vydávání kubeconfig uživatelům po úspěšné autorizaci.
K tomu můžete použít speciální webové aplikace, které umožňují autentizaci uživatele a poté stáhnout hotový kubeconfig. Jedna z nejpohodlnějších je , umožňuje v jednom konfigu popsat všechny Kubernetes clustery a snadno mezi nimi přepínat.
Pro nastavení Kuberos stačí popsat šablonu pro kubeconfig a spustit s těmito parametry:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templatePro podrobnější informace se podívejte na na Githubu.
Je také možné použít pokud chcete provádět autentizaci přímo na počítači uživatele. V tomto případě se uživateli otevře prohlížeč s formulářem pro autentizaci na localhost.
Získaný kubeconfig můžete zkontrolovat na stránkách . Stačí zkopírovat hodnotu users[].user.auth-provider.config.id-token z vašeho kubeconfigu do formuláře na webu a okamžitě získáte dešifrování.
Nastavení RBAC
Při nastavení RBAC se můžete odkazovat jak na jméno uživatele (pole name v jwt tokenu), tak na skupinu uživatelů (pole groups v jwt tokenu). Zde je příklad nastavení práv pro skupinu 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-adminsVíce příkladů pro RBAC naleznete v
Nastavení auth-proxy
Existuje skvělý projekt , který umožňuje zabezpečit jakoukoli aplikaci, a dává uživateli možnost se autentizovat na OIDC serveru. Ukážu, jak ho nastavit na příkladu Kubernetes Dashboard:
dashboard-proxy.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=
- --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: ClusterIPZdroj: habr.com
