Integracija LDAP autorizacije s Kubernetesom

Integracija LDAP autorizacije s Kubernetesom

Kratki vodič o tome kako povezati Kubernetes s vašim LDAP poslužiteljem koristeći Keycloak i postaviti uvoz korisnika i grupa. To će omogućiti konfiguraciju RBAC-a za vaše korisnike i korištenje auth-proxy-a za zaštitu Kubernetes Dashboards i drugih aplikacija koje ne mogu samostalno provesti autorizaciju.

Instalacija Keycloak-a

Pretpostavimo da već imate LDAP poslužitelj. To može biti Active Directory, FreeIPA, OpenLDAP ili nešto drugo. Ako nemate LDAP poslužitelj, možete stvarati korisnike izravno u sučelju Keycloak-a ili koristiti javne oidc pružatelje (Google, Github, Gitlab), rezultat će biti gotovo isti.

Prvo ćemo instalirati sam Keycloak, instalacija se može obaviti odvojeno ili odmah u Kubernetes klasteru. Ako imate više Kubernetes klastera, obično bi bilo lakše instalirati ga odvojeno. S druge strane, uvijek možete koristiti službeni helm chart i instalirati ga izravno u vaš klaster.

Za pohranu podataka Keycloak-a bit će vam potrebna baza podataka. Po defaultu se koristi h2 (svi podaci se čuvaju lokalno), ali također možete koristiti postgres, mysql ili mariadb.
Ako ste se odlučili instalirati Keycloak odvojeno, detaljnije upute možete pronaći u službene dokumentacije.

Postavljanje federacije

Prvo ćemo stvoriti novo kraljevstvo. Kraljevstvo je prostor naše aplikacije. Svaka aplikacija može imati svoje kraljevstvo s različitim korisnicima i postavkama autorizacije. Master kraljevstvo koristi sam Keycloak i pogrešno je koristiti ga za nešto drugo.

Kliknemo Dodaj kraljevstvo

Opcija
Vrijednost

Name
kubernetes

Prikazno ime
Kubernetes

HTML Prikazno ime
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >

Kubernetes standardno provjerava je li korisnik potvrdio svoj email. Budući da koristimo vlastiti LDAP poslužitelj, ova provjera će gotovo uvijek vraćati false. Isključimo prikaz ove postavke u Kubernetes-u:

Klijentske sfere -> Email -> Mapperi -> Email potvrđen (Izbriši)

Sada ćemo postaviti federaciju, za to idemo na:

Federacija korisnika -> Dodaj pružatelja… -> ldap

Dajem primjer postavke za FreeIPA:

Opcija
Vrijednost

Naziv prikaza konzole
freeipa.example.org

Dobavljač
Red Hat Directory Server

UUID LDAP atribut
ipauniqueid

URL veze
ldaps://freeipa.example.org

DN korisnika
cn=users,cn=accounts,dc=example,dc=org

Bind DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org

Bind vjerodajnica
<password>

Dopusti Kerberos autentifikaciju:
uključeno

Kerberos kraljevstvo:
EXAMPLE.ORG

Server Principal:
HTTP/freeipa.example.org@EXAMPLE.ORG

KeyTab:
/etc/krb5.keytab

Korisnika keycloak-svc treba prethodno stvoriti na našem LDAP poslužitelju.

U slučaju Active Directory, dovoljno je samo odabrati Dobavljač: Active Directory i potrebne postavke će se automatski unijeti u obrazac.

Kliknemo Spremi

Sada idemo na:

Federacija korisnika -> freeipa.example.org -> Mapperi -> Ime

Opcija
Vrijednost

Ldap atribut
givenName

Sada ćemo uključiti mapiranje grupa:

Federacija korisnika -> freeipa.example.org -> Mapperi -> Create

Opcija
Vrijednost

Name
groups

Tip mappera
group-ldap-mapper

LDAP Grupe DN
cn=groups,cn=accounts,dc=example,dc=org

Strategija dobivanja korisničkih grupa
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Time je postavljanje federacije završeno, pređimo na postavku klijenta.

Postavka klijenta

Stvorimo novog klijenta (aplikacija koja će primati korisnike iz Keycloak-a). Idemo na:

Klijenti -> Create

Opcija
Vrijednost

Client ID
kubernetes

Tip pristupa
confidenrial

Osnovni URL
http://kubernetes.example.org/

Valjane URI preusmjeravanja
http://kubernetes.example.org/*

Admin URL
http://kubernetes.example.org/

Također ćemo stvoriti scope za grupe:

Scopes klijenta -> Create

Opcija
Vrijednost

Predložak
Nema predloška

Name
groups

Puni put do grupe
false

I postavićemo mapper za njih:

Scopes klijenta -> groups -> Mapperi -> Create

Opcija
Vrijednost

Name
groups

Tip mappera
Članstvo u grupi

Ime tokenovog zahtjeva
groups

Sada trebamo omogućiti mapiranje grupa u našem client scope-u:

Klijenti -> kubernetes -> Scopes klijenta -> Zadani client scope-ovi

Biramo groups u Dostupni client scope-ovi, kliknite Dodaj odabrano

Sada ćemo postaviti autentifikaciju naše aplikacije, idemo na:

Klijenti -> kubernetes

Opcija
Vrijednost

Autorizacija omogućena
ON

Kliknite spremi i time je postavka klijenta završena, sada na kartici

Klijenti -> kubernetes -> Akreditivi

možete dobiti Tajna koju ćemo koristiti u nastavku.

Postavka Kubernetes-a

Postavka Kubernetes-a za OIDC-autorizaciju je relativno trivijalna i nije jako složena. Sve što trebate je staviti CA-certifikat vašeg OIDC-servera u /etc/kubernetes/pki/oidc-ca.pem i dodati potrebne opcije za kube-apiserver.
Za to ažurirajte /etc/kubernetes/manifests/kube-apiserver.yaml na svim vašim majstorima:

...
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
...

Također ažurirajte kubeadm konfiguraciju u klasteru kako ne biste izgubili te postavke prilikom ažuriranja:

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
...

Time je postavka Kubernetes-a završena. Možete ponoviti iste radnje u svim vašim Kubernetes klasterima.

Početna autorizacija

Nakon tih radnji već ćete imati Kubernetes klaster sa postavljenom OIDC-autorizacijom. Jedina stvar je da vaši korisnici još nemaju postavljenog klijenta kao ni vlastiti kubeconfig. Da biste riješili ovaj problem potrebno je postaviti automatsko izdavanje kubeconfig-a korisnicima nakon uspješne autorizacije.

Za to možete koristiti posebne web-aplikacije koje omogućuju autentifikaciju korisnika, a zatim preuzimanje gotovog kubeconfiga. Jedna od najpraktičnijih je Kuberos, koja omogućuje opisivanje svih Kubernetes klastera u jednoj konfiguraciji i jednostavno prebacivanje između njih.

Za postavljanje Kuberosa dovoljno je opisati predložak za kubeconfig i pokrenuti s sljedećim parametrima:

kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template

Za detaljnije informacije pogledajte Korištenje na Githubu.

Također je moguće koristiti kubelogin ako želite provesti autorizaciju izravno na korisničkom računalu. U tom slučaju korisniku će se otvoriti preglednik s obrascem za autorizaciju na localhostu.

Dobiveni kubeconfig možete provjeriti na web stranici jwt.io. Jednostavno kopirajte vrijednost users[].user.auth-provider.config.id-token iz vašeg kubeconfiga u obrazac na web stranici i odmah ćete dobiti dešifriranje.

Postavljanje RBAC-a

Prilikom postavljanja RBAC-a možete se pozvati kako na ime korisnika (polje ime u jwt-tokenu), tako i na grupu korisnika (polje groups u jwt-tokenu). Evo primjera postavke prava za grupu 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

Više primjera za RBAC možete pronaći u službenoj dokumentaciji Kubernetes

Postavljanje auth-proxy-a

Postoji odličan projekt keycloak-gatekeeper, koji omogućuje zaštitu bilo koje aplikacije, dajući korisniku mogućnost autentifikacije na OIDC poslužitelju. Pokazat ću kako ga postaviti na primjeru Kubernetes Dashborda:

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: ClusterIP

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster