Un mic tutorial despre cum să utilizați Keycloak pentru a conecta Kubernetes la serverul LDAP și a configura importul de utilizatori și grupuri. Acest lucru vă va permite să configurați RBAC pentru utilizatorii dvs. și să utilizați auth-proxy pentru a proteja Kubernetes Dashboard și alte aplicații care nu știu cum să se autorizeze.
Instalare Keycloak
Să presupunem că aveți deja un server LDAP. Ar putea fi Active Directory, FreeIPA, OpenLDAP sau orice altceva. Dacă nu aveți un server LDAP, atunci, în principiu, puteți crea utilizatori direct în interfața Keycloak sau utilizați furnizori publici de oidc (Google, Github, Gitlab), rezultatul va fi aproape același.
În primul rând, să instalăm Keycloak propriu-zis, instalarea se poate face separat, sau direct în cluster-ul Kubernetes, de regulă, dacă aveți mai multe cluster-uri Kubernetes, ar fi mai ușor să îl instalați separat. Pe de altă parte, puteți utiliza oricând
Pentru a stoca datele Keycloak, veți avea nevoie de o bază de date. Valoarea implicită este h2
(toate datele sunt stocate local), dar este și posibil să fie utilizat postgres
, mysql
sau mariadb
.
Dacă tot decideți să instalați Keycloak separat, puteți găsi instrucțiuni mai detaliate în
Configurarea federației
În primul rând, să creăm un nou tărâm. Tărâmul este spațiul aplicației noastre. Fiecare aplicație poate avea propriul său domeniu cu utilizatori și setări de autorizare diferiți. Tărâmul principal este folosit chiar de Keycloak și folosirea lui pentru orice altceva este greșită.
presa Adăugați tărâm
Opțiune
Valoare
Nume si Prenume
kubernetes
Numele afisat
Kubernetes
Nume afișat HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes verifică implicit dacă e-mailul utilizatorului este confirmat sau nu. Deoarece folosim propriul nostru server LDAP, această verificare va reveni aproape întotdeauna false
. Să dezactivăm reprezentarea acestei setări în Kubernetes:
Domeniile clientului -> E-mail -> Cartografii -> e-mail verificat (Șterge)
Acum să înființăm federația, pentru asta mergem la:
Federația de utilizatori -> Adăugați furnizorul... -> ldap
Iată un exemplu de configurare pentru FreeIPA:
Opțiune
Valoare
Numele afișat al consolei
freeipa.example.org
Vânzător
Red Hat Directory Server
UUID Atribut LDAP
ipauniqueid
Adresa URL a conexiunii
ldaps://freeipa.example.org
DN utilizator
cn=users,cn=accounts,dc=example,dc=org
Leagă DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Leagă acreditările
<password>
Permiteți autentificarea Kerberos:
on
Tărâmul Kerberos:
EXAMPLE.ORG
Principalul server:
HTTP/[email protected]
fila cheie:
/etc/krb5.keytab
utilizator keycloak-svc
trebuie creat în prealabil pe serverul nostru LDAP.
În cazul Active Directory, pur și simplu selectați Furnizor: Active Directory iar setările necesare vor fi introduse automat în formular.
presa Economisiți
Acum să trecem mai departe:
Federația de utilizatori -> freeipa.example.org -> Cartografii -> Prenume
Opțiune
Valoare
Atributele Ldap
givenName
Acum activați maparea grupului:
Federația de utilizatori -> freeipa.example.org -> Cartografii -> Crea
Opțiune
Valoare
Nume si Prenume
groups
Tipul de cartografiere
group-ldap-mapper
Grupuri LDAP DN
cn=groups,cn=accounts,dc=example,dc=org
Strategia de recuperare a grupului de utilizatori
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Aceasta completează configurarea federației, să trecem la configurarea clientului.
Configurarea clientului
Să creăm un nou client (o aplicație care va primi utilizatori de la Keycloak). Să mergem:
Clienți -> Crea
Opțiune
Valoare
ID-ul clientului
kubernetes
Tipul de acces
confidenrial
Adresa URL rădăcină
http://kubernetes.example.org/
URI de redirecționare valide
http://kubernetes.example.org/*
Adresa URL de administrator
http://kubernetes.example.org/
De asemenea, vom crea un domeniu de aplicare pentru grupuri:
Domeniile clientului -> Crea
Opțiune
Valoare
Format
No template
Nume si Prenume
groups
Calea completă a grupului
false
Și configurați un mapper pentru ei:
Domeniile clientului -> Grupuri -> Cartografii -> Crea
Opțiune
Valoare
Nume si Prenume
groups
Tipul de cartografiere
Group membership
Nume de revendicare a simbolului
groups
Acum trebuie să activăm maparea grupurilor în domeniul clientului nostru:
Clienți -> Kubernetes -> Domeniile clientului -> Domeniile implicite ale clientului
selecta Grupuri в Domenii disponibile pentru clienți, presa Adăugați selectat
Acum să setăm autentificarea aplicației noastre, mergeți la:
Clienți -> Kubernetes
Opțiune
Valoare
Autorizare activată
ON
Să împingem salva și aceasta completează configurarea clientului, acum pe filă
Clienți -> Kubernetes -> scrisori de acreditare
poți obține Secret pe care o vom folosi mai târziu.
Configurarea Kubernetes
Configurarea Kubernetes pentru autorizarea OIDC este destul de banală și nu este ceva foarte complicat. Tot ce trebuie să faceți este să puneți certificatul CA al serverului dvs. OIDC /etc/kubernetes/pki/oidc-ca.pem
și adăugați opțiunile necesare pentru kube-apiserver.
Pentru a face acest lucru, actualizați /etc/kubernetes/manifests/kube-apiserver.yaml
pe toți stăpânii tăi:
...
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
...
Și, de asemenea, actualizați configurația kubeadm în cluster pentru a nu pierde aceste setări în timpul actualizării:
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
...
Aceasta completează configurarea Kubernetes. Puteți repeta acești pași în toate clusterele dvs. Kubernetes.
Autorizarea inițială
După acești pași, veți avea deja configurat un cluster Kubernetes cu autorizare OIDC. Singurul aspect este că utilizatorii dvs. nu au încă un client configurat, precum și propriul lor kubeconfig. Pentru a rezolva această problemă, trebuie să configurați emiterea automată a kubeconfig către utilizatori după autorizarea cu succes.
Pentru a face acest lucru, puteți utiliza aplicații web speciale care vă permit să autentificați utilizatorul și apoi să descărcați kubeconfig-ul finalizat. Una dintre cele mai convenabile este
Pentru a configura Kuberos, este suficient să descrii șablonul pentru kubeconfig și să-l rulezi cu următorii parametri:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
Pentru mai multe detalii vezi
De asemenea, este posibil să se utilizeze
Kubeconfig rezultat poate fi verificat pe site users[].user.auth-provider.config.id-token
de la kubeconfig la un formular de pe site și obțineți imediat transcrierea.
Configurare RBAC
Când configurați RBAC, vă puteți referi atât la numele de utilizator (câmp name
în simbolul jwt) și pentru un grup de utilizatori (câmp groups
în simbolul jwt). Iată un exemplu de setare a permisiunilor pentru un grup 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
Mai multe exemple pentru RBAC pot fi găsite în
Setarea auth-proxy
Există un proiect minunat
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
Sursa: www.habr.com