Fixăm autorizarea LDAP la Kubernetes

Fixăm autorizarea LDAP la Kubernetes

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 graficul oficial al cârmei și instalați-l direct în clusterul dvs.

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 documentație oficială.

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 Kuberos, vă permite să descrieți toate clusterele Kubernetes într-o singură configurație și să comutați cu ușurință între ele.

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 Folosire pe Github.

De asemenea, este posibil să se utilizeze kubelogin dacă doriți să autorizați direct pe computerul utilizatorului. În acest caz, utilizatorul va deschide un browser cu un formular de autorizare pe localhost.

Kubeconfig rezultat poate fi verificat pe site jwt.io. Doar copiați valoarea 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 documentația oficială Kubernetes

Setarea auth-proxy

Există un proiect minunat chei-pătar, care vă permite să securizați orice aplicație, permițând utilizatorului să se autentifice pe serverul OIDC. Vă voi arăta cum îl puteți configura folosind Kubernetes Dashboard ca exemplu:

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

Adauga un comentariu