Pripevňujeme autorizáciu LDAP na Kubernetes

Pripevňujeme autorizáciu LDAP na Kubernetes

Malý tutoriál o tom, ako použiť Keycloak na pripojenie Kubernetes k serveru LDAP a nastavenie importu používateľov a skupín. To vám umožní nastaviť RBAC pre vašich používateľov a použiť auth-proxy na ochranu Kubernetes Dashboard a iných aplikácií, ktoré sa nevedia autorizovať.

Inštalácia kľúčenky

Predpokladajme, že už máte server LDAP. Môže to byť Active Directory, FreeIPA, OpenLDAP alebo čokoľvek iné. Ak nemáte LDAP server, v zásade môžete vytvárať používateľov priamo v rozhraní Keycloak alebo použiť verejných poskytovateľov oidc (Google, Github, Gitlab), výsledok bude takmer rovnaký.

Najprv si nainštalujte samotný Keycloak, inštalácia môže byť vykonaná samostatne alebo priamo do klastra Kubernetes, spravidla ak máte niekoľko klastrov Kubernetes, bolo by jednoduchšie nainštalovať ho samostatne. Na druhej strane, vždy môžete použiť oficiálna tabuľka kormidla a nainštalujte ho priamo do svojho klastra.

Na ukladanie údajov Keycloak budete potrebovať databázu. Predvolená hodnota je h2 (všetky dáta sú uložené lokálne), ale je možné ho aj použiť postgres, mysql alebo mariadb.
Ak sa predsa len rozhodnete nainštalovať Keycloak samostatne, podrobnejšie pokyny nájdete v oficiálna dokumentácia.

Nastavenie federácie

Najprv si vytvorme novú sféru. Realm je priestor našej aplikácie. Každá aplikácia môže mať svoju vlastnú sféru s rôznymi používateľmi a nastaveniami autorizácie. Master realm používa samotný Keycloak a jeho použitie na čokoľvek iné je nesprávne.

lis Pridať sféru

voľba
Hodnota

Meno
kubernetes

Zobraziť meno
Kubernetes

Zobrazovaný názov HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >

Kubernetes predvolene kontroluje, či je e-mail používateľa potvrdený alebo nie. Keďže používame vlastný server LDAP, táto kontrola sa takmer vždy vráti false. Zakážme reprezentáciu tohto nastavenia v Kubernetes:

Rozsahy klientov -> E-mail -> Mapperi -> email overený (Odstrániť)

Teraz založme federáciu, ideme na to:

Používateľská federácia -> Pridať poskytovateľa… -> ldap

Tu je príklad nastavenia pre FreeIPA:

voľba
Hodnota

Zobrazovaný názov konzoly
freeipa.example.org

Predajcu
Red Hat Directory Server

Atribút UUID LDAP
ipauniqueid

Adresa URL pripojenia
ldaps://freeipa.example.org

DN používateľa
cn=users,cn=accounts,dc=example,dc=org

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

Zviazať poverenie
<password>

Povoliť overenie Kerberos:
on

Kerberos Realm:
EXAMPLE.ORG

Hlavný server:
HTTP/[email protected]

kľúčová karta:
/etc/krb5.keytab

užívateľ keycloak-svc musia byť vytvorené vopred na našom serveri LDAP.

V prípade Active Directory stačí vybrať Dodávateľ: Active Directory a potrebné nastavenia sa do formulára vložia automaticky.

lis ušetríte

Teraz poďme ďalej:

Používateľská federácia -> freeipa.example.org -> Mapperi -> Krstné meno

voľba
Hodnota

Vlastnosti Ldap
givenName

Teraz povoľte skupinové mapovanie:

Používateľská federácia -> freeipa.example.org -> Mapperi -> vytvoriť

voľba
Hodnota

Meno
groups

Typ mapovača
group-ldap-mapper

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

Stratégia získania skupiny používateľov
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Tým je nastavenie federácie dokončené, prejdime k nastaveniu klienta.

Nastavenie klienta

Vytvorme nového klienta (aplikáciu, ktorá bude prijímať používateľov z Keycloak). Poďme:

Klienti -> vytvoriť

voľba
Hodnota

ID klienta
kubernetes

Typ prístupu
confidenrial

Koreňová adresa URL
http://kubernetes.example.org/

Platné URI presmerovania
http://kubernetes.example.org/*

Adresa URL správcu
http://kubernetes.example.org/

Vytvoríme priestor aj pre skupiny:

Rozsahy klientov -> vytvoriť

voľba
Hodnota

šablóna
No template

Meno
groups

Celá skupinová cesta
false

A nastavte pre nich mapovač:

Rozsahy klientov -> skupiny -> Mapperi -> vytvoriť

voľba
Hodnota

Meno
groups

Typ mapovača
Group membership

Názov nároku na token
groups

Teraz musíme povoliť mapovanie skupín v rozsahu nášho klienta:

Klienti -> Kubernetes -> Rozsahy klientov -> Predvolené rozsahy klienta

vybrať skupiny в Dostupné rozsahy klientov, stlačte Pridať vybraté

Teraz poďme nastaviť autentifikáciu našej aplikácie, prejdite na:

Klienti -> Kubernetes

voľba
Hodnota

Autorizácia povolená
ON

Zatlačíme uložiť a tým sa dokončí nastavenie klienta, teraz na karte

Klienti -> Kubernetes -> poverovacie listiny

môžeš dostať Tajomstvo ktoré použijeme neskôr.

Konfigurácia Kubernetes

Nastavenie Kubernetes na autorizáciu OIDC je celkom triviálne a nie je to niečo veľmi zložité. Všetko, čo musíte urobiť, je vložiť certifikát CA vášho servera OIDC /etc/kubernetes/pki/oidc-ca.pem a pridajte potrebné možnosti pre kube-apiserver.
Ak to chcete urobiť, aktualizujte /etc/kubernetes/manifests/kube-apiserver.yaml na všetkých vašich pánov:

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

A tiež aktualizujte konfiguráciu kubeadm v klastri, aby ste počas aktualizácie nestratili tieto nastavenia:

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

Tým sa dokončí nastavenie Kubernetes. Tieto kroky môžete zopakovať vo všetkých klastroch Kubernetes.

Počiatočná autorizácia

Po týchto krokoch už budete mať klaster Kubernetes s nakonfigurovanou autorizáciou OIDC. Jediným bodom je, že vaši používatelia ešte nemajú nakonfigurovaného klienta, ako aj vlastný kubeconfig. Na vyriešenie tohto problému je potrebné nakonfigurovať automatické vydávanie kubeconfig používateľom po úspešnej autorizácii.

Na to môžete použiť špeciálne webové aplikácie, ktoré vám umožnia overiť používateľa a následne stiahnuť hotový kubeconfig. Jedným z najpohodlnejších je Kuberos, umožňuje vám opísať všetky klastre Kubernetes v jednej konfigurácii a jednoducho medzi nimi prepínať.

Ak chcete nakonfigurovať Kuberos, stačí opísať šablónu pre kubeconfig a spustiť ju s nasledujúcimi parametrami:

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

Viac podrobností viď Ako používať prášok CBD? na Github.

Je tiež možné použiť kublogin ak chcete autorizovať priamo na počítači používateľa. V tomto prípade používateľ otvorí prehliadač s autorizačným formulárom na localhost.

Výsledný kubeconfig je možné skontrolovať na stránke jwt.io. Stačí skopírovať hodnotu users[].user.auth-provider.config.id-token z vášho kubeconfigu do formulára na stránke a okamžite získate prepis.

Nastavenie RBAC

Pri konfigurácii RBAC sa môžete odvolávať na používateľské meno (pole name v tokene jwt) a pre skupinu používateľov (pole groups v tokene jwt). Tu je príklad nastavenia povolení pre skupinu 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

Ďalšie príklady pre RBAC nájdete v oficiálna dokumentácia Kubernetes

Nastavenie auth-proxy

Existuje úžasný projekt kľúčenka-vrátnik, ktorý vám umožňuje zabezpečiť ľubovoľnú aplikáciu tým, že používateľovi umožní autentifikáciu na serveri OIDC. Ukážem vám, ako to môžete nastaviť pomocou Kubernetes Dashboard ako príklad:

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

Zdroj: hab.com

Pridať komentár