LDAP autorizaciju pričvršćujemo za Kubernetes

LDAP autorizaciju pričvršćujemo za Kubernetes

Mali vodič o tome kako koristiti Keycloak za povezivanje Kubernetesa sa vašim LDAP serverom i postavljanje uvoza korisnika i grupa. Ovo će vam omogućiti da postavite RBAC za svoje korisnike i koristite auth-proxy da zaštitite Kubernetes Dashboard i druge aplikacije koje ne znaju kako da se autoriziraju.

Keycloak Installation

Pretpostavimo da već imate LDAP server. To može biti Active Directory, FreeIPA, OpenLDAP ili bilo šta drugo. Ako nemate LDAP server, onda u principu možete kreirati korisnike direktno u Keycloak interfejsu, ili koristiti javne oidc provajdere (Google, Github, Gitlab), rezultat će biti skoro isti.

Prije svega, instalirajmo sam Keycloak, instalacija se može izvršiti zasebno, ili direktno u Kubernetes klaster, po pravilu, ako imate više Kubernetes klastera, bilo bi lakše instalirati ga zasebno. S druge strane, uvijek možete koristiti zvanična karta kormila i instalirajte ga direktno u svoj klaster.

Da biste pohranili Keycloak podatke, trebat će vam baza podataka. Podrazumevano je h2 (svi podaci se pohranjuju lokalno), ali je također moguće koristiti postgres, mysql ili mariadb.
Ako se ipak odlučite zasebno instalirati Keycloak, detaljnije upute možete pronaći u službena dokumentacija.

Postavljanje federacije

Pre svega, hajde da stvorimo novo carstvo. Realm je prostor naše aplikacije. Svaka aplikacija može imati svoje područje s različitim korisnicima i postavkama autorizacije. Glavno područje koristi sam Keycloak i njegovo korištenje za bilo šta drugo je pogrešno.

Pritisni Dodaj carstvo

opcija
vrijednost

Ime
kubernetes

Display Name
Kubernetes

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

Kubernetes po defaultu provjerava da li je email korisnika potvrđen ili ne. Pošto koristimo sopstveni LDAP server, ova provera će se skoro uvek vratiti false. Hajde da onemogućimo predstavljanje ove postavke u Kubernetesu:

Opsezi klijenta -> E-mail -> Maperi -> email verifikovan (Izbriši)

Sada postavimo federaciju, za ovo idemo na:

Korisnička federacija -> Dodaj provajdera… -> ldap

Evo primjera podešavanja za FreeIPA:

opcija
vrijednost

Ime za prikaz konzole
freeipa.example.org

Prodavac
Red Hat Directory Server

UUID LDAP atribut
ipauniqueid

URL veze
ldaps://freeipa.example.org

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

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

Povežite akreditiv
<password>

Dozvoli Kerberos autentifikaciju:
on

Kerberos carstvo:
EXAMPLE.ORG

Direktor servera:
HTTP/[email protected]

ključna kartica:
/etc/krb5.keytab

Korisnik keycloak-svc moraju biti kreirani unaprijed na našem LDAP serveru.

U slučaju Active Directory, jednostavno odaberite Dobavljač: Active Directory a potrebna podešavanja će se automatski ubaciti u obrazac.

Pritisni Save

Sada idemo dalje:

Korisnička federacija -> freeipa.example.org -> Maperi -> Ime

opcija
vrijednost

Ldap atributi
givenName

Sada omogućite grupno mapiranje:

Korisnička federacija -> freeipa.example.org -> Maperi -> stvoriti

opcija
vrijednost

Ime
groups

Tip mapera
group-ldap-mapper

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

Strategija preuzimanja korisničke grupe
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Ovim je završeno podešavanje federacije, idemo dalje na postavljanje klijenta.

Podešavanje klijenta

Kreirajmo novog klijenta (aplikaciju koja će primati korisnike iz Keycloaka). Idemo:

Klijenata -> stvoriti

opcija
vrijednost

ID klijenta
kubernetes

Vrsta pristupa
confidenrial

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

Važeći URI za preusmjeravanje
http://kubernetes.example.org/*

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

Takođe ćemo kreirati prostor za grupe:

Opsezi klijenta -> stvoriti

opcija
vrijednost

šablon
No template

Ime
groups

Puna putanja grupe
false

I postavite maper za njih:

Opsezi klijenta -> grupe -> Maperi -> stvoriti

opcija
vrijednost

Ime
groups

Mapper Type
Group membership

Naziv potraživanja tokena
groups

Sada moramo omogućiti grupno mapiranje u našem opsegu klijenta:

Klijenata -> kubernetes -> Opsezi klijenta -> Zadani opseg klijenta

Odaberite grupe в Dostupni opseg klijenta, pritisnite Dodaj odabrano

Sada postavimo autentifikaciju naše aplikacije, idite na:

Klijenata -> kubernetes

opcija
vrijednost

Autorizacija je omogućena
ON

Hajde da guramo štedi i time se završava podešavanje klijenta, sada na kartici

Klijenata -> kubernetes -> akreditiv

Možeš dobiti tajna koje ćemo kasnije koristiti.

Konfigurisanje Kubernetesa

Podešavanje Kubernetesa za OIDC autorizaciju je prilično trivijalno i nije nešto previše komplikovano. Sve što treba da uradite je da ubacite CA sertifikat vašeg OIDC servera /etc/kubernetes/pki/oidc-ca.pem i dodajte potrebne opcije za kube-apiserver.
Da biste to učinili, ažurirajte /etc/kubernetes/manifests/kube-apiserver.yaml na svim tvojim 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 ove postavke tokom 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
...

Ovim je završeno podešavanje Kubernetesa. Možete ponoviti ove korake u svim svojim Kubernetes klasterima.

Inicijalna autorizacija

Nakon ovih koraka, već ćete imati konfiguriranu Kubernetes klaster s OIDC autorizacijom. Jedina stvar je da vaši korisnici još nemaju konfiguriran klijent, kao ni vlastitu kubeconfig. Da biste riješili ovaj problem, morate konfigurirati automatsko izdavanje kubeconfig korisnicima nakon uspješne autorizacije.

Da biste to učinili, možete koristiti posebne web aplikacije koje vam omogućavaju autentifikaciju korisnika, a zatim preuzeti gotovu kubeconfig. Jedan od najpovoljnijih je Kuberos, omogućava vam da opišete sve Kubernetes klastere u jednoj konfiguraciji i lako prelazite između njih.

Za konfiguraciju Kuberosa, dovoljno je opisati predložak za kubeconfig i pokrenuti ga sa sljedećim parametrima:

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

Za više detalja pogledajte upotreba na Githubu.

Također je moguće koristiti kubelogin ako želite da autorizujete direktno na računaru korisnika. U ovom slučaju, korisnik će otvoriti pretraživač sa formularom za autorizaciju na lokalnom hostu.

Dobijeni kubeconfig se može provjeriti na web stranici jwt.io. Samo kopirajte vrijednost users[].user.auth-provider.config.id-token sa vašeg kubeconfig-a na obrazac na stranici i odmah preuzmite transkript.

RBAC podešavanje

Kada konfigurišete RBAC, možete se pozvati i na korisničko ime (polje name u jwt tokenu) i za grupu korisnika (polje groups u jwt tokenu). Evo primjera postavljanja dozvola 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 zvanična Kubernetes dokumentacija

Postavljanje auth-proxy

Postoji divan projekat keycloak-gatekeeper, koji vam omogućava da osigurate bilo koju aplikaciju dozvoljavajući korisniku da se autentifikuje na OIDC serveru. Pokazat ću vam kako ga možete postaviti koristeći Kubernetes Dashboard kao primjer:

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

izvor: www.habr.com

Dodajte komentar