Malý tutoriál o tom, ako použiť Keycloak na pripojenie Kubernetes k serveru LDAP a nastavenie importu používateľov a skupín. To vám umožní nastaviť RBAC pre vašich používateľov a použiť auth-proxy na ochranu Kubernetes Dashboard a iných aplikácií, ktoré sa nevedia autorizovať.
Inštalácia kľúčenky
Predpokladajme, že už máte server LDAP. Môže to byť Active Directory, FreeIPA, OpenLDAP alebo čokoľvek iné. Ak nemáte LDAP server, v zásade môžete vytvárať používateľov priamo v rozhraní Keycloak alebo použiť verejných poskytovateľov oidc (Google, Github, Gitlab), výsledok bude takmer rovnaký.
Najprv si nainštalujte samotný Keycloak, inštalácia môže byť vykonaná samostatne alebo priamo do klastra Kubernetes, spravidla ak máte niekoľko klastrov Kubernetes, bolo by jednoduchšie nainštalovať ho samostatne. Na druhej strane, vždy môžete použiť
Na ukladanie údajov Keycloak budete potrebovať databázu. Predvolená hodnota je h2
(všetky dáta sú uložené lokálne), ale je možné ho aj použiť postgres
, mysql
alebo mariadb
.
Ak sa predsa len rozhodnete nainštalovať Keycloak samostatne, podrobnejšie pokyny nájdete v
Nastavenie federácie
Najprv si vytvorme novú sféru. Realm je priestor našej aplikácie. Každá aplikácia môže mať svoju vlastnú sféru s rôznymi používateľmi a nastaveniami autorizácie. Master realm používa samotný Keycloak a jeho použitie na čokoľvek iné je nesprávne.
lis Pridať sféru
voľba
Hodnota
Meno
kubernetes
Zobraziť meno
Kubernetes
Zobrazovaný názov HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes predvolene kontroluje, či je e-mail používateľa potvrdený alebo nie. Keďže používame vlastný server LDAP, táto kontrola sa takmer vždy vráti false
. Zakážme reprezentáciu tohto nastavenia v Kubernetes:
Rozsahy klientov -> E-mail -> Mapperi -> email overený (Odstrániť)
Teraz založme federáciu, ideme na to:
Používateľská federácia -> Pridať poskytovateľa… -> ldap
Tu je príklad nastavenia pre FreeIPA:
voľba
Hodnota
Zobrazovaný názov konzoly
freeipa.example.org
Predajcu
Red Hat Directory Server
Atribút UUID LDAP
ipauniqueid
Adresa URL pripojenia
ldaps://freeipa.example.org
DN používateľa
cn=users,cn=accounts,dc=example,dc=org
Zviazať DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Zviazať poverenie
<password>
Povoliť overenie Kerberos:
on
Kerberos Realm:
EXAMPLE.ORG
Hlavný server:
HTTP/[email protected]
kľúčová karta:
/etc/krb5.keytab
užívateľ keycloak-svc
musia byť vytvorené vopred na našom serveri LDAP.
V prípade Active Directory stačí vybrať Dodávateľ: Active Directory a potrebné nastavenia sa do formulára vložia automaticky.
lis ušetríte
Teraz poďme ďalej:
Používateľská federácia -> freeipa.example.org -> Mapperi -> Krstné meno
voľba
Hodnota
Vlastnosti Ldap
givenName
Teraz povoľte skupinové mapovanie:
Používateľská federácia -> freeipa.example.org -> Mapperi -> vytvoriť
voľba
Hodnota
Meno
groups
Typ mapovača
group-ldap-mapper
LDAP Groups DN
cn=groups,cn=accounts,dc=example,dc=org
Stratégia získania skupiny používateľov
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Tým je nastavenie federácie dokončené, prejdime k nastaveniu klienta.
Nastavenie klienta
Vytvorme nového klienta (aplikáciu, ktorá bude prijímať používateľov z Keycloak). Poďme:
Klienti -> vytvoriť
voľba
Hodnota
ID klienta
kubernetes
Typ prístupu
confidenrial
Koreňová adresa URL
http://kubernetes.example.org/
Platné URI presmerovania
http://kubernetes.example.org/*
Adresa URL správcu
http://kubernetes.example.org/
Vytvoríme priestor aj pre skupiny:
Rozsahy klientov -> vytvoriť
voľba
Hodnota
šablóna
No template
Meno
groups
Celá skupinová cesta
false
A nastavte pre nich mapovač:
Rozsahy klientov -> skupiny -> Mapperi -> vytvoriť
voľba
Hodnota
Meno
groups
Typ mapovača
Group membership
Názov nároku na token
groups
Teraz musíme povoliť mapovanie skupín v rozsahu nášho klienta:
Klienti -> Kubernetes -> Rozsahy klientov -> Predvolené rozsahy klienta
vybrať skupiny в Dostupné rozsahy klientov, stlačte Pridať vybraté
Teraz poďme nastaviť autentifikáciu našej aplikácie, prejdite na:
Klienti -> Kubernetes
voľba
Hodnota
Autorizácia povolená
ON
Zatlačíme uložiť a tým sa dokončí nastavenie klienta, teraz na karte
Klienti -> Kubernetes -> poverovacie listiny
môžeš dostať Tajomstvo ktoré použijeme neskôr.
Konfigurácia Kubernetes
Nastavenie Kubernetes na autorizáciu OIDC je celkom triviálne a nie je to niečo veľmi zložité. Všetko, čo musíte urobiť, je vložiť certifikát CA vášho servera OIDC /etc/kubernetes/pki/oidc-ca.pem
a pridajte potrebné možnosti pre kube-apiserver.
Ak to chcete urobiť, aktualizujte /etc/kubernetes/manifests/kube-apiserver.yaml
na všetkých vašich pánov:
...
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 tiež aktualizujte konfiguráciu kubeadm v klastri, aby ste počas aktualizácie nestratili tieto nastavenia:
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 sa dokončí nastavenie Kubernetes. Tieto kroky môžete zopakovať vo všetkých klastroch Kubernetes.
Počiatočná autorizácia
Po týchto krokoch už budete mať klaster Kubernetes s nakonfigurovanou autorizáciou OIDC. Jediným bodom je, že vaši používatelia ešte nemajú nakonfigurovaného klienta, ako aj vlastný kubeconfig. Na vyriešenie tohto problému je potrebné nakonfigurovať automatické vydávanie kubeconfig používateľom po úspešnej autorizácii.
Na to môžete použiť špeciálne webové aplikácie, ktoré vám umožnia overiť používateľa a následne stiahnuť hotový kubeconfig. Jedným z najpohodlnejších je
Ak chcete nakonfigurovať Kuberos, stačí opísať šablónu pre kubeconfig a spustiť ju s nasledujúcimi parametrami:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
Viac podrobností viď
Je tiež možné použiť
Výsledný kubeconfig je možné skontrolovať na stránke users[].user.auth-provider.config.id-token
z vášho kubeconfigu do formulára na stránke a okamžite získate prepis.
Nastavenie RBAC
Pri konfigurácii RBAC sa môžete odvolávať na používateľské meno (pole name
v tokene jwt) a pre skupinu používateľov (pole groups
v tokene jwt). Tu je príklad nastavenia povolení pre 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-admins
Ďalšie príklady pre RBAC nájdete v
Nastavenie auth-proxy
Existuje úžasný projekt
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: ClusterIP
Zdroj: hab.com