Прикручиваем LDAP-авторизацию к Kubernetes

Прикручиваем LDAP-авторизацию к Kubernetes

Majhna navodila o tem, kako lahko z uporabo Keycloaka povežete Kubernetes z vašim LDAP strežnikom in nastavite uvoz uporabnikov in skupin. To bo omogočilo nastavitev RBAC za vaše uporabnike ter uporabo auth-proxy za zaščito Kubernetes nadzorne plošče in drugih aplikacij, ki ne morejo samostojno izvajati avtorizacije.

Instalacija Keycloak-a

Recimo, da že imate LDAP strežnik. To je lahko Active Directory, FreeIPA, OpenLDAP ali karkoli drugega. Če LDAP strežnika nimate, lahko v bistvu ustvarite uporabnike neposredno v vmesniku Keycloaka ali pa uporabite javne oidc ponudnike (Google, Github, Gitlab), rezultat bo skoraj enak.

Najprej namestimo sam Keycloak, namestitev se lahko izvede posebej ali takoj v Kubernetes grozdu, običajno, če imate več Kubernetes grozdov, bi bilo lažje namestiti ga posebej. Po drugi strani pa lahko vedno uporabite uradni helm graf in ga namestite neposredno v vaš grozd.

Za shranjevanje podatkov Keycloaka potrebujete bazo podatkov. Po privzetu se uporablja h2 (vsi podatki se shranijo lokalno), vendar je mogoče tudi uporabiti postgres, mysql ili mariadb.
Če se kljub vsemu odločite namestiti Keycloak posebej, boste našli bolj podrobna navodila v uradni dokumentaciji.

Nastavitev federacije

Najprej ustvarimo nov realm. Realm je prostor naše aplikacije. Vsaka aplikacija ima lahko svoj realm z različnimi uporabniki in nastavitvami avtorizacije. Master realm se uporablja samim Keycloakom in ga ni primerno uporabljati za kaj drugega.

Kliknite Dodaj domeno

Option
Vrednost

Ime
kubernetes

Prikazno ime
Kubernetes

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

Kubernetes po privzetu preverja, ali je uporabnik potrdil svoj e-poštni naslov ali ne. Ker uporabljamo lasten LDAP strežnik, bo to preverjanje skoraj vedno vrnilo false. Izklopimo prikaz te možnosti v Kubernetesu:

Client scopes —> Email —> Mappers —> Email verified (Zbriši)

Zdaj nastavimo federacijo, zato pojdimo na:

User federation —> Dodaj ponudnika… —> ldap

Navedel bom primer nastavitve za FreeIPA:

Option
Vrednost

Console Display Name
freeipa.example.org

Vendor
Red Hat Directory Server

UUID LDAP attribute
ipauniqueid

Connection URL
ldaps://freeipa.example.org

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

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

Bind Credential
<password>

Dovoli Kerberos avtorizacijo:
on

Kerberos Realm:
EXAMPLE.ORG

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

KeyTab:
/etc/krb5.keytab

Uporabnika keycloak-svc treba ustvariti vnaprej na našem LDAP strežniku.

V primeru Active Directory je dovolj, da preprosto izberete Vendor: Active Directory in potrebne nastavitve se samodejno vstavijo v obrazec.

Kliknite Shrani

Zdaj preidemo na:

User federation —> freeipa.example.org —> Mappers —> Ime

Option
Vrednost

Ldap attribure
givenName

Sedaj vključimo skupinsko preslikavo:

User federation —> freeipa.example.org —> Mappers —> Stworzyć

Option
Vrednost

Ime
groups

Vrsta mapperja
group-ldap-mapper

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

Strategija pridobivanja uporabniških skupin
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

S tem je nastavitev federacije zaključena, preidemo na nastavitev odjemalca.

Nastavitev stranke

Ustvarimo novega odjemalca (aplikacija, ki bo pridobivala uporabnike iz Keycloak-a). Preidemo na:

Odjemalci —> Stworzyć

Option
Vrednost

Client ID
kubernetes

Vrsta dostopa
zaupno

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

Veljavne preusmeritvene URI
http://kubernetes.example.org/*

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

Prav tako bomo ustvarili obseg za skupine:

Obsegi odjemalca —> Stworzyć

Option
Vrednost

Template
Brez predloge

Ime
groups

Polna pot skupine
false

In nastavimo mappers zanje:

Obsegi odjemalca —> groups —> Mappers —> Stworzyć

Option
Vrednost

Ime
groups

Vrsta mapperja
Članstvo v skupini

Ime zahteve žetona
groups

Sedaj moramo vključiti preslikavo skupin v našem obsegu odjemalca:

Odjemalci —> kubernetes —> Obsegi odjemalca —> Privzeti obsegi odjemalca

Izbiramo groups u Na voljo Client Scopes, kliknite Dodaj izbrano

Sedaj bomo nastavili avtentikacijo naše aplikacije, preidemo na:

Odjemalci —> kubernetes

Option
Vrednost

Avtorizacija omogočena
VKLJUČENO

Kliknite save in s tem je nastavitev odjemalca zaključena, zdaj na zavihku

Odjemalci —> kubernetes —> Zahteve

boste lahko pridobili Tajni ki ga bomo uporabili naprej.

Nastavitev Kubernetes

Nastavitev Kubernetes za OIDC-avtorizacijo je precej enostavna in ni zelo zapletena. Vse, kar potrebujete, je, da naložite CA-certifikat vašega OIDC strežnika v /etc/kubernetes/pki/oidc-ca.pem in dodate potrebne možnosti za kube-apiserver.
Zato posodobite /etc/kubernetes/manifests/kube-apiserver.yaml na vseh vaših masterih:

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

Prav tako posodobite kubeadm konfiguracijo v klasterju, da ne izgubite teh nastavitev pri posodobitvah:

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

S tem je nastavitev Kubernetes zaključena. Te iste korake lahko ponovite v vseh vaših Kubernetes klasterjih.

Začetna avtentikacija

Po teh korakih boste imeli Kubernetes klaster z nastavljeno OIDC-avtorizacijo. Edina zadeva je, da vaši uporabniki trenutno nimajo nastavljene stranke, prav tako niti svojega kubeconfig. Da bi to težavo rešili, je treba nastaviti samodejno izdajo kubeconfiga uporabnikom po uspešni avtentikaciji.

Za to lahko uporabite posebne spletne aplikacije, ki omogočajo avtentikacijo uporabnika in nato prenos pripravljenega kubeconfiga. Ena izmed najbolj priročnih je Kuberos, ki omogoča opis vseh Kubernetes klasterjev v eni konfiguraciji in enostavno preklapljanje med njimi.

Za nastavitev Kuberos je dovolj, da opišete predlogo za kubeconfig in zaženete z naslednjimi parametri:

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

Za podrobnejše informacije si oglejte Usage na Githubu.

Prav tako je mogoče uporabiti kubelogin če želite izvesti avtentikacijo neposredno na uporabnikovem računalniku. V tem primeru se bo uporabniku odprl brskalnik s prijavno formo na localhost.

Prejeti kubeconfig lahko preverite na spletni strani jwt.io. Preprosto kopirajte vrednost users[].user.auth-provider.config.id-token iz vašega kubeconfiga v obrazec na spletu in takoj prejmite razlago.

Nastavitev RBAC

Pri nastavitvi RBAC se lahko sklicujete tako na uporabniško ime (polje name v jwt-tokenu), kot tudi na skupino uporabnikov (polje groups v jwt-tokenu). Tukaj je primer nastavitve pravic za skupino 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

Več primerov za RBAC lahko najdete v službene dokumentacije Kubernetes-a

Настройка auth-proxy

Obstaja odličen projekt keycloak-gatekeeper, ki omogoča zaščito katere koli aplikacije, tako da uporabniku omogoči avtentikacijo na OIDC-strežniku. Pokažem vam, kako ga nastaviti na primeru Kubernetes Dashboard:

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 zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster