LDAP avtorizacijo pritrdimo na Kubernetes

LDAP avtorizacijo pritrdimo na Kubernetes

Majhna vadnica o uporabi Keycloaka za povezavo Kubernetesa z vašim strežnikom LDAP in nastavitev uvoza uporabnikov in skupin. To vam bo omogočilo, da nastavite RBAC za svoje uporabnike in uporabite auth-proxy za zaščito Kubernetes Dashboard in drugih aplikacij, ki se ne znajo pooblastiti.

Namestitev Keycloak

Predpostavimo, da že imate strežnik LDAP. Lahko je Active Directory, FreeIPA, OpenLDAP ali karkoli drugega. Če nimate strežnika LDAP, lahko uporabnike načeloma ustvarite neposredno v vmesniku Keycloak ali uporabite javne ponudnike oidc (Google, Github, Gitlab), rezultat bo skoraj enak.

Najprej namestimo sam Keycloak, namestitev lahko izvedemo ločeno, ali direktno v gručo Kubernetes, praviloma, če imate več gruč Kubernetes, bi bilo lažje namestiti ločeno. Po drugi strani pa lahko vedno uporabite uradna karta krmila in ga namestite neposredno v vašo gručo.

Za shranjevanje podatkov Keycloak boste potrebovali bazo podatkov. Privzeto je h2 (vsi podatki so shranjeni lokalno), možna pa je tudi uporaba postgres, mysql ali mariadb.
Če se vseeno odločite za ločeno namestitev Keycloaka, lahko podrobnejša navodila najdete v uradna dokumentacija.

Nastavitev federacije

Najprej ustvarimo novo kraljestvo. Realm je prostor naše aplikacije. Vsaka aplikacija ima lahko svoje področje z različnimi uporabniki in nastavitvami avtorizacije. Glavno kraljestvo uporablja sam Keycloak in njegova uporaba za kar koli drugega je napačna.

Potisnite Dodaj kraljestvo

Možnost
vrednost

Ime
kubernetes

Display Name
Kubernetes

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

Kubernetes privzeto preveri, ali je e-pošta uporabnika potrjena ali ne. Ker uporabljamo lasten strežnik LDAP, se to preverjanje skoraj vedno vrne false. Onemogočimo predstavitev te nastavitve v Kubernetesu:

Obseg strank -> E-pošta -> Kartografi -> E-pošta preverjena (Izbriši)

Zdaj pa vzpostavimo zvezo; za to pojdite na:

Zveza uporabnikov -> Dodaj ponudnika ... -> ldap

Tukaj je primer nastavitev za FreeIPA:

Možnost
vrednost

Prikazno ime konzole
freeipa.example.org

Prodajalec
Red Hat Directory Server

UUID LDAP atribut
ipauniqueid

URL povezave
ldaps://freeipa.example.org

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

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

Poveži poverilnico
<password>

Dovoli preverjanje pristnosti Kerberos:
on

Območje Kerberos:
EXAMPLE.ORG

Glavni strežnik:
HTTP/[email protected]

ključni zavihek:
/etc/krb5.keytab

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

V primeru imenika Active Directory morate samo izbrati Prodajalec: Active Directory in potrebne nastavitve bodo samodejno vnesene v obrazec.

Potisnite Shrani

Zdaj pa gremo naprej:

Zveza uporabnikov -> freeipa.example.org -> Kartografi -> Ime

Možnost
vrednost

Atribut Ldap
givenName

Zdaj omogočimo skupinsko preslikavo:

Zveza uporabnikov -> freeipa.example.org -> Kartografi -> ustvarjanje

Možnost
vrednost

Ime
groups

Vrsta preslikave
group-ldap-mapper

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

Strategija pridobivanja uporabniških skupin
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Zdaj, ko je nastavitev zveze končana, pojdimo na nastavitev odjemalca.

Nastavitev odjemalca

Ustvarimo novega odjemalca (aplikacijo, ki bo sprejemala uporabnike iz Keycloaka). Gremo naprej:

Odjemalci -> ustvarjanje

Možnost
vrednost

ID stranke
kubernetes

Vrsta dostopa
confidenrial

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

Veljavni URI preusmeritve
http://kubernetes.example.org/*

Skrbniški URL
http://kubernetes.example.org/

Ustvarimo tudi obseg za skupine:

Obseg odjemalca -> ustvarjanje

Možnost
vrednost

predloga
No template

Ime
groups

Celotna skupinska pot
false

In jim nastavite preslikavo:

Obseg odjemalca -> skupine -> Kartografi -> ustvarjanje

Možnost
vrednost

Ime
groups

Vrsta preslikave
Group membership

Ime zahtevka žetona
groups

Zdaj moramo omogočiti skupino preslikav v našem obsegu odjemalca:

Odjemalci -> Kubernetes -> Obseg odjemalca -> Privzeti obsegi odjemalca

Izberite skupine в Razpoložljivi obsegi strank, pritisnite Dodaj izbrano

Zdaj pa konfigurirajmo avtentikacijo naše aplikacije, pojdite na:

Odjemalci -> Kubernetes

Možnost
vrednost

Avtorizacija omogočena
ON

Pritisnemo shranjevanje in s tem je nastavitev odjemalca končana, zdaj na zavihku

Odjemalci -> Kubernetes -> Mandatno

lahko dobiš skrivnost ki jih bomo še naprej uporabljali.

Konfiguriranje Kubernetesa

Nastavitev Kubernetesa za avtorizacijo OIDC je precej trivialna in ni nekaj zelo zapletenega. Vse kar morate storiti je, da vstavite potrdilo CA vašega strežnika OIDC /etc/kubernetes/pki/oidc-ca.pem in dodajte potrebne možnosti za kube-apiserver.
Če želite to narediti, posodobite /etc/kubernetes/manifests/kube-apiserver.yaml na vse svoje mojstre:

...
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 konfiguracijo kubeadm v gruči, da ne izgubite teh nastavitev pri posodabljanju:

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 konfiguracija Kubernetes zaključena. Te korake lahko ponovite v vseh svojih gručah Kubernetes.

Začetna avtorizacija

Po teh korakih boste že imeli gručo Kubernetes s konfiguriranim pooblastilom OIDC. Edina stvar je, da vaši uporabniki še nimajo konfiguriranega odjemalca ali lastnega kubeconfiga. Če želite rešiti to težavo, morate po uspešni avtorizaciji konfigurirati samodejno distribucijo kubeconfig uporabnikom.

Če želite to narediti, lahko uporabite posebne spletne aplikacije, ki vam omogočajo avtentikacijo uporabnika in nato prenesete končni kubeconfig. Eden najbolj priročnih je Kuberos, vam omogoča, da opišete vse gruče Kubernetes v eni konfiguraciji in preprosto preklapljate med njimi.

Če želite konfigurirati Kuberos, samo opišite predlogo za kubeconfig in jo zaženite z naslednjimi parametri:

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

Za podrobnejše informacije glejte Uporaba na Githubu.

Možna je tudi uporaba kubelogin če želite avtorizirati neposredno na uporabnikovem računalniku. V tem primeru bo uporabnik odprl brskalnik z avtorizacijskim obrazcem na localhost.

Nastali kubeconfig lahko preverite na spletni strani jwt.io. Samo kopirajte vrednost users[].user.auth-provider.config.id-token iz vašega kubeconfiga v obrazec na spletnem mestu in takoj prejmete prepis.

Nastavitev RBAC

Ko konfigurirate RBAC, se lahko sklicujete na uporabniško ime (polje name v žetonu jwt) in na skupino uporabnikov (polje groups v žetonu jwt). 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 najdete v uradna dokumentacija Kubernetes

Nastavitev auth-proxyja

Obstaja čudovit projekt keycloak-vratar, ki vam omogoča zaščito katere koli aplikacije tako, da uporabniku omogoči avtentikacijo na strežniku OIDC. Pokazal vam bom, kako ga konfigurirate na primeru nadzorne plošče Kubernetes:

nadzorna plošča-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

Vir: www.habr.com

Dodaj komentar