Připojujeme LDAP autorizaci k Kubernetes.

Připojujeme LDAP autorizaci k Kubernetes.

Krátká příručka o tom, jak pomocí Keycloak propojit Kubernetes s vaším LDAP serverem a nastavit import uživatelů a skupin. To umožní nastavit RBAC pro vaše uživatele a používat auth-proxy k zabezpečení Kubernetes Dashboardu a dalších aplikací, které nejsou samostatně schopny provádět autorizaci.

Instalace Keycloak

Předpokládáme, že již máte LDAP server. Může to být Active Directory, FreeIPA, OpenLDAP nebo něco jiného. Pokud LDAP server nemáte, můžete uživatele vytvářet přímo v rozhraní Keycloak, nebo použít veřejné OIDC poskytovatele (Google, Github, Gitlab), výsledek bude téměř stejný.

Nejprve nainstalujeme samotný Keycloak, instalace může být provedena jak samostatně, tak přímo v Kubernetes clusteru, obvykle je jednodušší nainstalovat ho samostatně, pokud máte více Kubernetes clusterů. Na druhou stranu můžete vždy použít oficiální helm chart a nainstalovat ho přímo do vašeho clusteru.

Pro ukládání dat Keycloak budete potřebovat databázi. Ve výchozím nastavení se používá h2 (všechna data jsou uložena lokálně), ale je také možné použít Postgres, mysql nebo mariadb.
Pokud se přece jen rozhodnete nainstalovat Keycloak samostatně, podrobnější pokyny najdete v oficiální dokumentaci.

Nastavení federace

Nejprve vytvoříme nový realm. Realm je prostor naší aplikace. Každá aplikace může mít svůj vlastní realm s různými uživateli a nastavením autorizace. Master realm používá samotný Keycloak a není správné ho používat k něčemu jinému.

Klikneme Přidat realm

Možnost
Hodnota

Název
kubernetes

Zobrazovaný název
Kubernetes

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

Kubernetes ve výchozím nastavení kontroluje, zda má uživatel ověřený email. Protože používáme vlastní LDAP server, bude tato kontrola téměř vždy vracet false. Pojďme zakázat zobrazení této možnosti v Kubernetes:

Klientské rozsahy —> E-mail —> Mappery —> Ověření emailu (Smazat)

Nyní nastavíme federaci, k tomu přejdeme na:

Uživatelská federace —> Přidat poskytovatele… —> ldap

Uvedu příklad nastavení pro FreeIPA:

Možnost
Hodnota

Zobrazovaný název konzole
freeipa.example.org

Dodavatel
Red Hat Directory Server

UUID LDAP atribut
ipauniqueid

URL připojení
ldaps://freeipa.example.org

Uživatelé 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>

Povolit Kerberos autentizaci:
on

Kerberos Realm:
EXAMPLE.ORG

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

KeyTab:
/etc/krb5.keytab

Uživatel keycloak-svc musí být předem vytvořen na našem LDAP serveru.

V případě Active Directory stačí jednoduše vybrat Dodavatel: Active Directory a potřebná nastavení se automaticky vyplní do formuláře.

Klikneme Uložit

Teď přejdeme:

Uživatelská federace —> freeipa.example.org —> Mappery —> Jméno

Možnost
Hodnota

Ldap atribut
givenName

Teď zapneme mapování skupin:

Uživatelská federace —> freeipa.example.org —> Mappery —> Vytvořit

Možnost
Hodnota

Název
groups

Typ mapperu
group-ldap-mapper

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

Strategie získávání uživatelských skupin
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

S nastavením federace máme hotovo, přejdeme k nastavení klienta.

Nastavení klienta

Vytvoříme nového klienta (aplikaci, která bude získávat uživatele z Keycloak). Přejdeme:

Klienti —> Vytvořit

Možnost
Hodnota

Client ID
kubernetes

Typ přístupu
confidenrial

Kořenová URL
http://kubernetes.example.org/

Platné přesměrovací URI
http://kubernetes.example.org/*

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

Také vytvoříme rozsah pro skupiny:

Rozsahy klientů —> Vytvořit

Možnost
Hodnota

Šablona
Žádná šablona

Název
groups

Celá cesta skupiny
false

A nastavíme pro ně mapper:

Rozsahy klientů —> groups —> Mappery —> Vytvořit

Možnost
Hodnota

Název
groups

Typ mapperu
Členství ve skupině

Název tokenu claim
groups

Teď musíme zapnout mapování skupin v našem rozsahu klienta:

Klienti —> kubernetes —> Rozsahy klientů —> Výchozí klientské rozsahy

Vyberte groups v Dostupné klientské rozsahy, klikněte na Přidat vybrané

Teď nastavíme autentizaci naší aplikace, přejdeme:

Klienti —> kubernetes

Možnost
Hodnota

Povolená autorizace
NA

Klikneme na uložit a tím je nastavení klienta dokončeno, nyní na kartě

Klienti —> kubernetes —> Ověření

budete moci získat Secret který budeme používat dále.

Nastavení Kubernetes

Nastavení Kubernetes pro OIDC autorizaci je dost triviální a není příliš složité. Vše, co potřebujete, je umístit CA certifikát vašeho OIDC serveru do /etc/kubernetes/pki/oidc-ca.pem a přidat potřebné možnosti pro kube-apiserver.
K tomu aktualizujte /etc/kubernetes/manifests/kube-apiserver.yaml na všech vašich majstrtech:

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

Také aktualizujte kubeadm konfiguraci v clusteru, abyste neztratili tato nastavení při aktualizaci:

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 nastavením Kubernetes máme hotovo. Můžete opakovat tyto akce ve všech vašich Kubernetes clusterech.

Počáteční autorizace

Po těchto krocích již budete mít Kubernetes cluster se nastavenou OIDC autorizací. Jediný problém je, že vaši uživatelé zatím nemají nastaveného klienta ani vlastní kubeconfig. Abychom tento problém vyřešili, je nutné nastavit automatické vydávání kubeconfig uživatelům po úspěšné autorizaci.

K tomu můžete použít speciální webové aplikace, které umožňují autentizaci uživatele a poté stáhnout hotový kubeconfig. Jedna z nejpohodlnějších je Kuberos, umožňuje v jednom konfigu popsat všechny Kubernetes clustery a snadno mezi nimi přepínat.

Pro nastavení Kuberos stačí popsat šablonu pro kubeconfig a spustit s těmito parametry:

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

Pro podrobnější informace se podívejte na Použití na Githubu.

Je také možné použít kubelogin pokud chcete provádět autentizaci přímo na počítači uživatele. V tomto případě se uživateli otevře prohlížeč s formulářem pro autentizaci na localhost.

Získaný kubeconfig můžete zkontrolovat na stránkách jwt.io. Stačí zkopírovat hodnotu users[].user.auth-provider.config.id-token z vašeho kubeconfigu do formuláře na webu a okamžitě získáte dešifrování.

Nastavení RBAC

Při nastavení RBAC se můžete odkazovat jak na jméno uživatele (pole name v jwt tokenu), tak na skupinu uživatelů (pole groups v jwt tokenu). Zde je příklad nastavení práv pro 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

Více příkladů pro RBAC naleznete v oficiální dokumentaci Kubernetes

Nastavení auth-proxy

Existuje skvělý projekt keycloak-gatekeeper, který umožňuje zabezpečit jakoukoli aplikaci, a dává uživateli možnost se autentizovat na OIDC serveru. Ukážu, jak ho nastavit na příkladu 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

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster