Vi kopplar LDAP-autorisering till Kubernetes

Vi kopplar LDAP-autorisering till Kubernetes

En liten instruktion om hur man med hjÀlp av Keycloak kan koppla Kubernetes till din LDAP-server och konfigurera import av anvÀndare och grupper. Detta gör det möjligt att stÀlla in RBAC för dina anvÀndare och anvÀnda auth-proxy för att skydda Kubernetes Dashboard och andra applikationer som inte kan autentisera sig sjÀlva.

Installation av Keycloak

Anta att du redan har en LDAP-server. Det kan vara Active Directory, FreeIPA, OpenLDAP eller nÄgot annat. Om du inte har en LDAP-server kan du i princip skapa anvÀndare direkt i Keycloaks grÀnssnitt eller anvÀnda offentliga oidc-leverantörer (Google, Github, Gitlab), resultatet blir nÀstan detsamma.

Först installerar vi sjĂ€lva Keycloak, installationen kan göras separat eller direkt i Kubernetes-klustret. Om du har flera Kubernetes-kluster Ă€r det oftast enklare att installera det separat. Å andra sidan kan du alltid anvĂ€nda den officiella helm-diagrammet och installera det direkt i ditt kluster.

För att lagra data till Keycloak behöver du en databas. Som standard anvÀnds h2 (alla data lagras lokalt), men du kan ocksÄ anvÀnda postgres, mysql eller mariadb.
Om du ÀndÄ har bestÀmt dig för att installera Keycloak separat hittar du mer detaljerade instruktioner i den officiella dokumentationen.

Konfigurering av federation

Först skapar vi en ny realm. En realm Àr rummet för vÄr applikation. Varje applikation kan ha sin egen realm med olika anvÀndare och autentiseringens instÀllningar. Master realm anvÀnds av Keycloak sjÀlvt och det Àr fel att anvÀnda det till nÄgot annat.

Klicka pÄ LÀgg till realm

Alternativ
VĂ€rde

Namn
kubernetes

Visningsnamn
Kubernetes

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

Kubernetes kontrollerar som standard om anvÀndarens e-post Àr verifierad eller inte. Eftersom vi anvÀnder vÄr egen LDAP-server kommer denna kontroll nÀstan alltid att returnera false. LÄt oss stÀnga av visningen av denna parameter i Kubernetes:

Klienter —> Email —> Mappers —> E-post verifierad (Ta bort)

Nu stÀller vi in federation, gÄ till:

AnvĂ€ndarfederation —> LĂ€gg till leverantör
 —> ldap

HÀr Àr ett exempel pÄ konfiguration för FreeIPA:

Alternativ
VĂ€rde

Konsol Visningsnamn
freeipa.example.org

Leverantör
Red Hat Directory Server

UUID LDAP-attribut
ipauniqueid

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

AnvÀndares DN
cn=users,cn=accounts,dc=example,dc=org

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

Bindningsuppgift
<password>

TillÄt Kerberos-autentisering:
on

Kerberos Realm:
EXAMPLE.ORG

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

KeyTab:
/etc/krb5.keytab

AnvÀndaren keycloak-svc mÄste skapas i förvÀg pÄ vÄr LDAP-server.

I fallet med Active Directory rÀcker det att bara vÀlja Leverantör: Active Directory och nödvÀndiga instÀllningar fylls automatiskt i formulÀret.

Klicka pÄ Save

Nu gÄr vi till:

AnvĂ€ndarfederation —> freeipa.example.org —> Mappers —> Förnamn

Alternativ
VĂ€rde

Ldap-attribut
givenName

LÄt oss nu aktivera gruppmappning:

AnvĂ€ndarfederation —> freeipa.example.org —> Mappers —> Skapa

Alternativ
VĂ€rde

Namn
grupper

Mapper typ
group-ldap-mapper

LDAP-grupper DN
cn=groups,cn=accounts,dc=example,dc=org

AnvÀndargruppers hÀmtstrategi
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Nu Àr konfigurationen av federationen klar, lÄt oss gÄ vidare till klientkonfigurationen.

Konfigurera klienten

Vi skapar en ny klient (applikation som kommer att hÀmta anvÀndare frÄn Keycloak). GÄ till:

Klienter —> Skapa

Alternativ
VĂ€rde

Klient-ID
kubernetes

Åtkomsttyp
confidenrial

Rot-URL
http://kubernetes.example.org/

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

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

Vi skapar ocksÄ ett scope för grupper:

KlientomfĂ„ng —> Skapa

Alternativ
VĂ€rde

Mall
Ingen mall

Namn
grupper

Full gruppvÀg
false

Och vi konfigurerar mappare för dem:

KlientomfĂ„ng —> grupper —> Mappers —> Skapa

Alternativ
VĂ€rde

Namn
grupper

Mapper-typ
Gruppmedlemskap

Token kravnamn
grupper

Nu behöver vi aktivera gruppmappningen i vÄrt klientomfÄng:

Klienter —> kubernetes —> KlientomfĂ„ng —> Standard klientomfĂ„ng

VÀlj grupper pÄ TillgÀngliga klientomfÄng, tryck pÄ LÀgg till valda

Nu konfigurerar vi autentiseringen av vÄr applikation, gÄ vidare till:

Klienter —> kubernetes

Alternativ
VĂ€rde

Behörighet aktiverad
PÅ

Klicka pÄ spara och nu Àr klientkonfigurationen avslutad, gÄ till fliken

Klienter —> kubernetes —> Referenser

dÀr kan du fÄ Hemmelighet som vi kommer att anvÀnda framöver.

Konfigurering av Kubernetes

Konfiguration av Kubernetes för OIDC-autentisering Àr ganska trivial och inget komplicerat. Det du behöver göra Àr att lÀgga CA-certifikat för din OIDC-server i /etc/kubernetes/pki/oidc-ca.pem och lÀgga till nödvÀndiga alternativ för kube-apiserver.
För detta, uppdatera /etc/kubernetes/manifests/kube-apiserver.yaml pÄ alla dina noder:

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

Och uppdatera kubeadm-konfigurationen i klustret för att inte förlora dessa instÀllningar vid uppgradering:

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 Àr konfigurationen av Kubernetes klar. Du kan upprepa dessa ÄtgÀrder i alla dina Kubernetes-kluster.

Inledande autentisering

Efter dessa ÄtgÀrder kommer du att ha ett Kubernetes-kluster med konfigurerad OIDC-autentisering. Det enda problemet Àr att dina anvÀndare för tillfÀllet inte har konfigurerade klienter eller sina egna kubeconfig. För att lösa detta problem behöver du konfigurera automatisk utfÀrdande av kubeconfig för anvÀndare efter lyckad autentisering.

För detta kan du anvÀnda speciella webbapplikationer som möjliggör autentisering av anvÀndaren och sedan ladda ner en fÀrdig kubeconfig. En av de mest anvÀndarvÀnliga Àr Kuberos, den lÄter dig beskriva alla Kubernetes-kluster i en konfiguration och enkelt vÀxla mellan dem.

För att konfigurera Kuberos behöver du bara beskriva mallen för kubeconfig och köra med följande parametrar:

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

För mer detaljerad information, se AnvÀndning pÄ Github.

Det Àr ocksÄ möjligt att anvÀnda kubelogin om du vill autentisera direkt pÄ anvÀndarens dator. I sÄ fall öppnas en webblÀsare med en autentiseringsformulÀr pÄ localhost.

Den erhÄllna kubeconfig kan kontrolleras pÄ webbplatsen jwt.io. Kopiera bara vÀrdet users[].user.auth-provider.config.id-token frÄn din kubeconfig till formulÀret pÄ webbplatsen och fÄ direkt avkodning.

RBAC-konfiguration

Vid konfiguration av RBAC kan du referera till bÄde anvÀndarnamn (fÀlt name i jwt-token), sÄvÀl som anvÀndargrupp (fÀlt grupper i jwt-token). HÀr Àr ett exempel pÄ ÄtkomstinstÀllningar för gruppen 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

Fler exempel pÄ RBAC kan hittas i den officiella Kubernetes-dokumentationen

InstÀllningar för auth-proxy

Det finns ett fantastiskt projekt keycloak-gatekeeper, som gör det möjligt att skydda vilken applikation som helst, genom att ge anvÀndaren möjlighet att autentisera sig mot OIDC-servern. Jag kommer att visa hur man konfigurerar det med Kubernetes Dashboard som exempel:

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

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster