Integrerer LDAP-godkendelse med Kubernetes

Integrerer LDAP-godkendelse med Kubernetes

En kort vejledning til, hvordan du kan forbinde Kubernetes med din LDAP-server ved hjĂŠlp af Keycloak og konfigurere import af brugere og grupper. Dette vil gĂžre det muligt at konfigurere RBAC for dine brugere og bruge auth-proxy til at beskytte Kubernetes Dashboard og andre applikationer, der ikke kan autentificere sig selv.

Installation af Keycloak

Lad os antage, at du allerede har en LDAP-server. Det kan vĂŠre Active Directory, FreeIPA, OpenLDAP eller noget andet. Hvis du ikke har en LDAP-server, kan du grundlĂŠggende oprette brugere direkte i Keycloak-interfacet eller bruge offentlige oidc-udbydere (Google, Github, Gitlab), resultatet vil blive nĂŠsten det samme.

FĂžrst skal vi installere selve Keycloak; installationen kan udfĂžres separat eller direkte i Kubernetes-klyngen. Hvis du har flere Kubernetes-klynger, vil det typisk vĂŠre lettere at installere det separat. PĂ„ den anden side kan du altid bruge den officielle helm-chart og installere den direkte i din klynge.

For at gemme data i Keycloak har du brug for en database. Som standard bruges h2 (alle data gemmes lokalt), men det er ogsÄ muligt at bruge postgres, mysql eller mariadb.
Hvis du alligevel har besluttet at installere Keycloak separat, finder du mere detaljerede instruktioner i den officielle dokumentation.

Konfiguration af federation

FĂžrst opretter vi et nyt realm. Et realm er et rum for vores applikation. Hver applikation kan have sit eget realm med forskellige brugere og autentifikationsindstillinger. Master realm bruges af Keycloak selv, og det er forkert at bruge det til andet.

Klik pÄ TilfÞj realm

Mulighed
VĂŠrdi

Navn
kubernetes

Visningsnavn
Kubernetes

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

Kubernetes tjekker som standard, om en brugers e-mail er bekrĂŠftet eller ej. Da vi bruger vores egen LDAP-server, vil denne kontrol nĂŠsten altid returnere false. Lad os deaktivere visningen af denne parameter i Kubernetes:

Klientomfang —> E-mail —> Mapper —> E-mail bekréftet (Slet)

Nu konfigurerer vi federation, for dette gÄr vi til:

Brugerfederation —> Tilfþj udbyder
 —> ldap

Her er et eksempel pÄ konfiguration for FreeIPA:

Mulighed
VĂŠrdi

Konsol Visningsnavn
freeipa.example.org

LeverandĂžr
Red Hat Directory Server

UUID LDAP-attribut
ipauniqueid

Forbindelses-URL
ldaps://freeipa.example.org

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

Tillad Kerberos autentifikation:
on

Kerberos Realm:
EXAMPLE.ORG

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

KeyTab:
/etc/krb5.keytab

Brugeren keycloak-svc skal oprettes pÄ forhÄnd pÄ vores LDAP-server.

I tilfĂŠlde af Active Directory er det tilstrĂŠkkeligt blot at vĂŠlge LeverandĂžr: Active Directory og de nĂždvendige indstillinger vil automatisk blive indsat i formen.

Klik pÄ Gem

Nu gÄr vi videre til:

Brugerfederation —> freeipa.example.org —> Mapper —> Fornavn

Mulighed
VĂŠrdi

LDAP-attribut
givenName

Lad os nu aktivere gruppe-mapping:

Brugerfederation —> freeipa.example.org —> Mapper —> Opret

Mulighed
VĂŠrdi

Navn
groups

Mapper type
group-ldap-mapper

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

Brugergrupper Hentningsstrategi
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Nu er konfigurationen af federation afsluttet, lad os gÄ videre til klientkonfigurationen.

Klientkonfiguration

Vi opretter en ny klient (applikation, der vil hente brugere fra Keycloak). GĂ„ til:

Klienter —> Opret

Mulighed
VĂŠrdi

Denne ID bruges til at identificere
kubernetes

Adgangstype
confidenrial

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

Gyldige omdirigerings-URIs
http://kubernetes.example.org/*

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

Vi opretter ogsÄ et scope for grupper:

Klient Scopes —> Opret

Mulighed
VĂŠrdi

Skabelon
Ingen skabelon

Navn
groups

Fuld gruppevej
false

Og vi konfigurerer mapper til dem:

Klient Scopes —> groups —> Mapper —> Opret

Mulighed
VĂŠrdi

Navn
groups

Mapper Type
Gruppemedlemskab

Token Claim Navn
groups

Nu skal vi aktivere gruppering i vores klient scope:

Klienter —> kubernetes —> Klient Scopes —> Standard Klient Scopes

Vi vÊlger groups i TilgÊngelige Client Scopes, klik pÄ TilfÞj valgte

Lad os nu konfigurere godkendelse af vores applikation, gÄ til:

Klienter —> kubernetes

Mulighed
VĂŠrdi

Autorisation Aktiveret
TIL

Klik pÄ gem og hermed er oprettelsen af klienten fÊrdig, nu pÄ fanen

Klienter —> kubernetes —> Oplysninger

vil du kunne fÄ Secret som vi vil bruge fremadrettet.

Kubernetes konfiguration

Konfiguration af Kubernetes til OIDC-godkendelse er ganske triviel og ikke sĂŠrlig kompleks. Alt, hvad du behĂžver, er at placere CA-certifikatet fra din OIDC-server i /etc/kubernetes/pki/oidc-ca.pem og tilfĂžje de nĂždvendige indstillinger til kube-apiserver.
For at gÞre dette, opdater /etc/kubernetes/manifests/kube-apiserver.yaml pÄ alle dine mastere:

...
spec:
  containere:
  - kommando:
    - 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
...

Opdater ogsÄ kubeadm-konfigurationen i klyngen, sÄ du ikke mister disse indstillinger ved opdatering:

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

Nu er konfigurationen af Kubernetes afsluttet. Du kan gentage disse handlinger i alle dine Kubernetes-klynger.

Indledende godkendelse

Efter disse handlinger vil du have en Kubernetes-klynge med konfigureret OIDC-godkendelse. Den eneste ting er, at dine brugere endnu ikke har konfigureret en klient eller deres egen kubeconfig. For at lĂžse dette problem skal du konfigurere automatisk udstedelse af kubeconfig til brugerne efter en succesfuld godkendelse.

Til dette kan du bruge specielle webapplikationer, der muliggÞr brugerautentifikation og derefter muliggÞr download af en klar kubeconfig. En af de mest bekvemme er Kuberos, som gÞr det muligt at beskrive alle Kubernetes-klynger i én konfigurationsfil og nemt skifte imellem dem.

For at konfigurere Kuberos er det nok at beskrive en skabelon til kubeconfig og starte med fĂžlgende parametre:

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

For more detailed information, see Brug on Github.

It is also possible to use kubelogin if you want to perform authentication directly on the user's computer. In this case, a browser will open for the user with an authentication form on localhost.

The obtained kubeconfig can be verified on the site jwt.io. Just copy the value users[].user.auth-provider.config.id-token from your kubeconfig into the form on the site and immediately get the decryption.

Setting up RBAC

When configuring RBAC, you can refer to either the username (the field name in the jwt token) or to the user group (the field groups in the jwt token). Here is an example of rights configuration for the group 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

More examples for RBAC can be found in den officielle dokumentation fra Kubernetes

Konfiguration af auth-proxy

There is a wonderful project keycloak-gatekeeper, which allows securing any application, giving the user the ability to authenticate on an OIDC server. I will show how to set it up using the example of 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

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster