
Malý návod, jak pomocí Keycloak připojit Kubernetes k vašemu serveru LDAP a nastavit import uživatelů a skupin. To vám umožní nastavit RBAC pro vaše uživatele a používat auth-proxy k ochraně Kubernetes Dashboard a dalších aplikací, které nevědí, jak se autorizovat.
Instalace krytu na klíče
Předpokládejme, že již máte server LDAP. Může to být Active Directory, FreeIPA, OpenLDAP nebo cokoliv jiného. Pokud nemáte LDAP server, tak v zásadě můžete vytvářet uživatele přímo v rozhraní Keycloak, nebo použít veřejné oidc poskytovatele (Google, Github, Gitlab), výsledek bude téměř stejný.
Nejprve si nainstalujme samotný Keycloak, instalaci lze provést samostatně, nebo přímo do clusteru Kubernetes, zpravidla pokud máte více clusterů Kubernetes, bylo by jednodušší jej nainstalovat samostatně. Na druhou stranu můžete použít vždy a nainstalujte jej přímo do vašeho clusteru.
K ukládání dat Keycloak budete potřebovat databázi. Výchozí nastavení je h2 (všechna data jsou uložena lokálně), ale je také možné použít postgres, mysql nebo mariadb.
Pokud se přesto rozhodnete nainstalovat Keycloak samostatně, podrobnější pokyny naleznete v .
Nastavení federace
Nejprve si vytvořte novou sféru. Realm je prostor naší aplikace. Každá aplikace může mít svou vlastní sféru s různými uživateli a nastavením oprávnění. Hlavní sféru používá samotný Keycloak a její použití pro cokoli jiného je špatné.
Klikněte zde Přidat sféru
Volba
Hodnota
Jméno
kubernetes
Display Name
Kubernetes
Zobrazovaný název HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes ve výchozím nastavení kontroluje, zda je e-mail uživatele potvrzen nebo ne. Protože používáme vlastní server LDAP, tato kontrola se téměř vždy vrátí false. Pojďme zakázat reprezentaci tohoto nastavení v Kubernetes:
Rozsahy klientů -> Email -> Mapovači -> email ověřen (Vymazat)
Nyní pojďme nastavit federaci, za tímto účelem jdeme na:
Federace uživatelů -> Přidat poskytovatele… -> LDAP
Zde je příklad nastavení pro FreeIPA:
Volba
Hodnota
Zobrazovaný název konzoly
freeipa.example.org
Prodejce
Red Hat Directory Server
Atribut UUID LDAP
ipauniqueid
Adresa URL připojení
ldaps://freeipa.example.org
DN uživatele
cn=users,cn=accounts,dc=example,dc=org
Vazba DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Svázat pověření
<password>
Povolit ověřování Kerberos:
on
Kerberos Realm:
EXAMPLE.ORG
Ředitel serveru:
HTTP/freeipa.example.org@EXAMPLE.ORG
klíčová karta:
/etc/krb5.keytab
Uživatel keycloak-svc musí být vytvořen předem na našem serveru LDAP.
V případě Active Directory stačí vybrat Dodavatel: Active Directory a potřebná nastavení se do formuláře vloží automaticky.
Klikněte zde Uložit
Nyní pojďme dál:
Federace uživatelů -> freeipa.example.org -> Mapovači -> Jméno
Volba
Hodnota
Atributy Ldap
givenName
Nyní povolte mapování skupin:
Federace uživatelů -> freeipa.example.org -> Mapovači -> Vytvořit
Volba
Hodnota
Jméno
groups
Typ mapovače
group-ldap-mapper
LDAP Groups DN
cn=groups,cn=accounts,dc=example,dc=org
Strategie načtení uživatelské skupiny
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Tím je nastavení federace dokončeno, přejdeme k nastavení klienta.
Nastavení klienta
Vytvořme nového klienta (aplikaci, která bude přijímat uživatele z Keycloak). Pojďme:
Klienti -> Vytvořit
Volba
Hodnota
ID zákazníka
kubernetes
Typ přístupu
confidenrial
Kořenová adresa URL
http://kubernetes.example.org/
Platné URI přesměrování
http://kubernetes.example.org/*
Adresa URL správce
http://kubernetes.example.org/
Vytvoříme také prostor pro skupiny:
Rozsahy klientů -> Vytvořit
Volba
Hodnota
Šablona
No template
Jméno
groups
Celá skupinová cesta
false
A nastavte pro ně mapovač:
Rozsahy klientů -> skupiny -> Mapovači -> Vytvořit
Volba
Hodnota
Jméno
groups
Typ mapovače
Group membership
Název nároku na token
groups
Nyní musíme povolit mapování skupin v rozsahu našeho klienta:
Klienti -> guvernéři -> Rozsahy klientů -> Výchozí rozsahy klienta
vybrat skupiny в Dostupné klientské rozsahyklikněte Přidat vybrané
Nyní nastavíme ověřování naší aplikace, přejděte na:
Klienti -> guvernéři
Volba
Hodnota
Autorizace povolena
ON
Pojďme tlačit uložit a tím je nastavení klienta dokončeno, nyní na kartě
Klienti -> guvernéři -> pověřovací listiny
můžeš dostat Tajemství které použijeme později.
Konfigurace Kubernetes
Nastavení Kubernetes pro autorizaci OIDC je docela triviální a není to nic moc složitého. Vše, co musíte udělat, je vložit certifikát CA vašeho OIDC serveru /etc/kubernetes/pki/oidc-ca.pem a přidejte potřebné možnosti pro kube-apiserver.
Chcete-li to provést, aktualizujte /etc/kubernetes/manifests/kube-apiserver.yaml na všechny vaše pány:
...
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
...A také aktualizujte konfiguraci kubeadm v clusteru, abyste během aktualizace neztratili tato nastavení:
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
...Tím je nastavení Kubernetes dokončeno. Tyto kroky můžete opakovat ve všech clusterech Kubernetes.
Počáteční autorizace
Po těchto krocích již budete mít cluster Kubernetes s nakonfigurovanou autorizací OIDC. Jediným bodem je, že vaši uživatelé ještě nemají nakonfigurovaného klienta a také svůj vlastní kubeconfig. Chcete-li tento problém vyřešit, musíte nakonfigurovat automatické vydávání kubeconfig uživatelům po úspěšné autorizaci.
K tomu můžete použít speciální webové aplikace, které vám umožní ověřit uživatele a následně stáhnout hotový kubeconfig. Jedním z nejpohodlnějších je , umožňuje popsat všechny clustery Kubernetes v jedné konfiguraci a snadno mezi nimi přepínat.
Ke konfiguraci Kuberosu stačí popsat šablonu pro kubeconfig a spustit ji s následujícími parametry:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templateDalší podrobnosti viz na Github.
Je také možné použít pokud chcete autorizovat přímo na počítači uživatele. V tomto případě uživatel otevře prohlížeč s autorizačním formulářem na localhost.
Výsledný kubeconfig lze zkontrolovat na webu . Stačí zkopírovat hodnotu users[].user.auth-provider.config.id-token z vašeho kubeconfig do formuláře na webu a okamžitě získejte přepis.
Nastavení RBAC
Při konfiguraci RBAC se můžete odkázat na uživatelské jméno (pole name v tokenu jwt) a pro skupinu uživatelů (pole groups v tokenu jwt). Zde je příklad nastavení oprávnění 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-adminsDalší příklady pro RBAC lze nalézt v
Nastavení auth-proxy
Existuje úžasný projekt , který vám umožňuje zabezpečit jakoukoli aplikaci tím, že umožňuje uživateli autentizovat se na serveru OIDC. Ukážu vám, jak to můžete nastavit pomocí Kubernetes Dashboard jako příklad:
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=<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: ClusterIPZdroj: www.habr.com
