Ne e lidhim autorizimin LDAP në Kubernetes

Ne e lidhim autorizimin LDAP në Kubernetes

Një tutorial i shkurtër se si mund të përdorni Keycloak për të lidhur Kubernetes me serverin tuaj LDAP dhe për të konfiguruar importin e përdoruesve dhe grupeve. Kjo do t'ju lejojë të konfiguroni RBAC për përdoruesit tuaj dhe të përdorni auth-proxy për të mbrojtur Panelin e Kubernetes dhe aplikacione të tjera që nuk mund të vërtetohen vetë.

Instalimi i tastierës

Le të supozojmë se ju tashmë keni një server LDAP. Kjo mund të jetë Active Directory, FreeIPA, OpenLDAP ose ndonjë gjë tjetër. Nëse nuk keni një server LDAP, atëherë në parim mund të krijoni përdorues direkt në ndërfaqen Keycloak, ose të përdorni ofruesit publikë oidc (Google, Github, Gitlab), rezultati do të jetë pothuajse i njëjtë.

Para së gjithash, le të instalojmë vetë Keycloak. Instalimi mund të kryhet veçmas ose direkt në një grup Kubernetes. Si rregull, nëse keni disa grupe Kubernetes, do të ishte më e lehtë ta instaloni veçmas. Nga ana tjetër mund ta përdorni gjithmonë grafiku zyrtar i timonit dhe instaloni direkt në grupin tuaj.

Për të ruajtur të dhënat e Keycloak do t'ju duhet një bazë të dhënash. Parazgjedhja është h2 (të gjitha të dhënat ruhen në nivel lokal), por është gjithashtu e mundur të përdoren postgres, mysql ose mariadb.
Nëse ende vendosni të instaloni Keycloak veçmas, do të gjeni udhëzime më të hollësishme në dokumentacion zyrtar.

Organizimi i Federatës

Para së gjithash, le të krijojmë një mbretëri të re. Realm është hapësira e aplikacionit tonë. Çdo aplikacion mund të ketë sferën e vet me përdorues të ndryshëm dhe cilësime autorizimi. Sfera Master përdoret nga vetë Keycloak dhe është e gabuar ta përdorësh atë për çdo gjë tjetër.

shtyp Shto sferën

Alternativë
vlerë

Emër
kubernetes

Display Emri
Kubernetes

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

Kubernetes si parazgjedhje kontrollon nëse emaili i përdoruesit është konfirmuar apo jo. Meqenëse ne përdorim serverin tonë LDAP, ky kontroll pothuajse gjithmonë do të kthehet false. Le të çaktivizojmë përfaqësimin e këtij opsioni në Kubernetes:

Fushëveprimi i klientit -> Email -> Hartuesit -> Email-i u verifikua (Fshi)

Tani le të krijojmë federatën; për ta bërë këtë, shkoni te:

Federata e përdoruesve -> Shto ofrues… -> ldap

Këtu është një shembull i cilësimeve për FreeIPA:

Alternativë
vlerë

Emri i ekranit të konsolës
freeipa.example.org

Shitës
Red Hat Directory Server

Atributi UUID LDAP
ipauniqueid

URL-ja e lidhjes
ldaps://freeipa.example.org

DN e përdoruesve
cn=users,cn=accounts,dc=example,dc=org

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

Lidh Kredencialin
<password>

Lejo vërtetimin e Kerberos:
on

Mbretëria e Kerberos:
EXAMPLE.ORG

Kryesuesi i serverit:
HTTP/[email protected]

Tabela e tastierës:
/etc/krb5.keytab

përdorues keycloak-svc duhet të krijohen paraprakisht në serverin tonë LDAP.

Në rastin e Active Directory, ju vetëm duhet të zgjidhni Shitësi: Active Directory dhe cilësimet e nevojshme do të futen në formular automatikisht.

shtyp Ruaje

Tani le të vazhdojmë:

Federata e përdoruesve -> freeipa.example.org -> Hartuesit -> Emri

Alternativë
vlerë

Atributi ldap
givenName

Tani le të aktivizojmë hartën e grupit:

Federata e përdoruesve -> freeipa.example.org -> Hartuesit -> Krijo

Alternativë
vlerë

Emër
groups

Lloji i hartës
group-ldap-mapper

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

Strategjia e rimarrjes së grupeve të përdoruesve
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Tani që konfigurimi i federatës ka përfunduar, le të kalojmë te konfigurimi i klientit.

Konfigurimi i klientit

Le të krijojmë një klient të ri (një aplikacion që do të marrë përdoruesit nga Keycloak). Le të vazhdojmë:

Klientët -> Krijo

Alternativë
vlerë

ID e klientit
kubernetes

Lloji i hyrjes
confidenrial

URL-ja e rrënjës
http://kubernetes.example.org/

URI-të e vlefshme të ridrejtimit
http://kubernetes.example.org/*

URL e administratorit
http://kubernetes.example.org/

Le të krijojmë gjithashtu një hapësirë ​​​​për grupet:

Fushat e Klientit -> Krijo

Alternativë
vlerë

Shabllon
No template

Emër
groups

Rruga e plotë e grupit
false

Dhe vendosni një hartë për ta:

Fushat e Klientit -> Grupe -> Hartuesit -> Krijo

Alternativë
vlerë

Emër
groups

Lloji i hartuesit
Group membership

Emri i Kërkesës Token
groups

Tani duhet të aktivizojmë grupin e hartës në fushën e klientit tonë:

Klientët -> Kubernetes -> Fushat e Klientit -> Fushat e paracaktuara të klientit

zgjedh Grupe в Fushat e disponueshme të klientit, shtypni Shto të zgjedhurit

Tani le të konfigurojmë vërtetimin e aplikacionit tonë, shkoni te:

Klientët -> Kubernetes

Alternativë
vlerë

Autorizimi u aktivizua
ON

Le të shtypim ruaj dhe me këtë kompletohet konfigurimi i klientit, tani në skedën

Klientët -> Kubernetes -> letra kredenciale

ju mund të merrni Sekret të cilat do t'i përdorim më tej.

Konfigurimi i Kubernetes

Vendosja e Kubernetes për autorizimin OIDC është mjaft e parëndësishme dhe jo shumë e komplikuar. E tëra çfarë ju duhet të bëni është të vendosni certifikatën CA të serverit tuaj OIDC /etc/kubernetes/pki/oidc-ca.pem dhe shtoni opsionet e nevojshme për kube-apiserver.
Për ta bërë këtë, përditësoni /etc/kubernetes/manifests/kube-apiserver.yaml mbi të gjithë zotërit tuaj:

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

Gjithashtu, përditësoni konfigurimin kubeadm në grup në mënyrë që të mos humbni këto cilësime gjatë përditësimit:

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

Kjo përfundon konfigurimin e Kubernetes. Ju mund t'i përsërisni këto hapa në të gjitha grupimet tuaja Kubernetes.

Autorizimi fillestar

Pas këtyre hapave, do të keni tashmë një grup Kubernetes me autorizim të konfiguruar OIDC. E vetmja gjë është që përdoruesit tuaj nuk kanë ende një klient të konfiguruar ose kubeconfig të tyre. Për të zgjidhur këtë problem, duhet të konfiguroni shpërndarjen automatike të kubeconfig te përdoruesit pas autorizimit të suksesshëm.

Për ta bërë këtë, mund të përdorni aplikacione të veçanta në internet që ju lejojnë të vërtetoni përdoruesin dhe më pas të shkarkoni kubeconfig të gatshëm. Një nga më të përshtatshmet është Kuberos, ju lejon të përshkruani të gjitha grupimet e Kubernetes në një konfigurim dhe të kaloni lehtësisht ndërmjet tyre.

Për të konfiguruar Kuberos, thjesht përshkruani shabllonin për kubeconfig dhe ekzekutoni atë me parametrat e mëposhtëm:

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

Për informacion më të detajuar shihni Përdorim në Github.

Është gjithashtu e mundur të përdoret kubelogin nëse dëshironi të autorizoni drejtpërdrejt në kompjuterin e përdoruesit. Në këtë rast, përdoruesi do të hapë një shfletues me një formular autorizimi në localhost.

Kubeconfig që rezulton mund të kontrollohet në faqen e internetit jwt.io. Thjesht kopjoni vlerën users[].user.auth-provider.config.id-token nga kubeconfig juaj në formularin në faqen e internetit dhe merrni menjëherë një transkript.

Vendosja e RBAC

Kur konfiguroni RBAC, mund t'i referoheni të dy emrit të përdoruesit (fusha name në shenjën jwt), dhe për grup përdoruesish (fushë groups në shenjën jwt). Këtu është një shembull i konfigurimit të të drejtave për një grup 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

Më shumë shembuj për RBAC mund të gjenden në dokumentacioni zyrtar i Kubernetes

Vendosja e përfaqësuesit të autorizuar

Ka një projekt të mrekullueshëm çelësa-portier, i cili ju lejon të mbroni çdo aplikacion duke i ofruar përdoruesit mundësinë për të vërtetuar në serverin OIDC. Unë do t'ju tregoj se si ta konfiguroni atë duke përdorur Kubernetes Dashboard si shembull:

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

Burimi: www.habr.com

Shto një koment