Wy befestigje LDAP-autorisaasje oan Kubernetes

Wy befestigje LDAP-autorisaasje oan Kubernetes

In lyts tutorial oer hoe't jo Keycloak brûke om Kubernetes te ferbinen mei jo LDAP-tsjinner en ymport fan brûkers en groepen ynstelle. Hjirmei kinne jo RBAC ynstelle foar jo brûkers en auth-proxy brûke om Kubernetes Dashboard en oare applikaasjes te beskermjen dy't net witte hoe't se harsels autorisearje.

Keycloak Ynstallaasje

Litte wy oannimme dat jo al in LDAP-tsjinner hawwe. It kin Active Directory, FreeIPA, OpenLDAP of wat dan ek wêze. As jo ​​gjin LDAP-tsjinner hawwe, dan kinne jo yn prinsipe brûkers direkt yn 'e Keycloak-ynterface oanmeitsje, of gebrûk meitsje fan iepenbiere oidc-providers (Google, Github, Gitlab), it resultaat sil hast itselde wêze.

Lit ús earst Keycloak sels ynstallearje, de ynstallaasje kin apart wurde útfierd, of direkt nei it Kubernetes-kluster, as regel, as jo ferskate Kubernetes-klusters hawwe, soe it makliker wêze om it apart te ynstallearjen. Oan 'e oare kant kinne jo altyd brûke offisjele roer chart en ynstallearje it direkt yn jo kluster.

Om Keycloak-gegevens op te slaan, sille jo in databank nedich hawwe. De standert is h2 (alle gegevens wurde opslein lokaal), mar it is ek mooglik om te brûken postgres, mysql of mariadb.
As jo ​​​​noch beslute om Keycloak apart te ynstallearjen, kinne jo mear detaillearre ynstruksjes fine yn offisjele dokumintaasje.

Federaasje opset

Lit ús earst in nij ryk oanmeitsje. Ryk is de romte fan ús applikaasje. Elke applikaasje kin in eigen ryk hawwe mei ferskate brûkers en autorisaasjeynstellingen. It masterryk wurdt brûkt troch Keycloak sels en it brûke foar wat oars is ferkeard.

Push Foegje ryk ta

Opsje
Wearde

namme
kubernetes

NAME OF TRANSLATORS
Kubernetes

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

Kubernetes kontrolearret standert oft de e-post fan de brûker is befêstige of net. Om't wy ús eigen LDAP-tsjinner brûke, sil dizze kontrôle hast altyd weromkomme false. Litte wy de fertsjintwurdiging fan dizze ynstelling yn Kubernetes útskeakelje:

Client omfang -> email -> Mappers -> e-post ferifiearre (wiskje)

Litte wy no de federaasje opsette, dêrfoar geane wy ​​nei:

Brûker federaasje -> Oanbieder tafoegje... -> ldap

Hjir is in foarbyld opset foar FreeIPA:

Opsje
Wearde

Konsole werjeftenamme
freeipa.example.org

vendor
Red Hat Directory Server

UUID LDAP attribút
ipauniqueid

Ferbining URL
ldaps://freeipa.example.org

Brûker DN
cn=users,cn=accounts,dc=example,dc=org

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

Bind Credential
<password>

Kerberos-ferifikaasje tastean:
on

Kerberos Realm:
EXAMPLE.ORG

Server Principal:
HTTP/[email protected]

kaai ​​ljepper:
/etc/krb5.keytab

Brûker keycloak-svc moat foarôf oanmakke wurde op ús LDAP-tsjinner.

Yn it gefal fan Active Directory, selektearje gewoan Ferkeaper: Active Directory en de nedige ynstellings wurde automatysk ynfoege yn it formulier.

Push Rêde

Litte wy no fierder gean:

Brûker federaasje -> freeipa.example.org -> Mappers -> Foarnamme

Opsje
Wearde

Ldap attributen
givenName

Aktivearje no groepmapping:

Brûker federaasje -> freeipa.example.org -> Mappers -> Meitsje

Opsje
Wearde

namme
groups

Mapper type
group-ldap-mapper

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

Brûkersgroep Retrieve Strategy
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Dit foltôget de opset fan 'e federaasje, litte wy trochgean mei it ynstellen fan de kliïnt.

Client opset

Litte wy in nije kliïnt meitsje (in applikaasje dy't brûkers fan Keycloak sil ûntfange). Litte wy gean:

opdrachtjouwers -> Meitsje

Opsje
Wearde

Klient ID
kubernetes

Tagongstype
confidenrial

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

Jildige trochferwizing URI's
http://kubernetes.example.org/*

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

Wy sille ek in romte meitsje foar groepen:

Client omfang -> Meitsje

Opsje
Wearde

template
No template

namme
groups

Folsleine groep paad
false

En set in mapper foar har op:

Client omfang -> groepen -> Mappers -> Meitsje

Opsje
Wearde

namme
groups

Mapper Type
Group membership

Token Claim Namme
groups

No moatte wy groepmapping ynskeakelje yn ús klantbereik:

opdrachtjouwers -> kubernetes -> Client omfang -> Standert Client Scopes

Kies groepen в Beskikbere Client Scopes, drukke Taheakje selektearre

Litte wy no de autentikaasje fan ús applikaasje ynstelle, gean nei:

opdrachtjouwers -> kubernetes

Opsje
Wearde

Autorisaasje ynskeakele
ON

Lit ús triuwe besparje en dit foltôget de klantkonfiguraasje, no op 'e ljepper

opdrachtjouwers -> kubernetes -> Credentials

Do kinst krije Geheim dy't wy letter sille brûke.

Kubernetes konfigurearje

It ynstellen fan Kubernetes foar OIDC-autorisaasje is frij triviaal en net wat heul yngewikkeld. Alles wat jo hoege te dwaan is it CA-sertifikaat fan jo OIDC-tsjinner yn te setten /etc/kubernetes/pki/oidc-ca.pem en foegje de nedige opsjes ta foar kube-apiserver.
Om dit te dwaan, update /etc/kubernetes/manifests/kube-apiserver.yaml op al dyn masters:

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

En bywurkje ek de kubeadm-konfiguraasje yn it kluster om dizze ynstellingen net te ferliezen tidens de fernijing:

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

Dit foltôget de opset fan Kubernetes. Jo kinne dizze stappen werhelje oer al jo Kubernetes-klusters.

Inisjele autorisaasje

Nei dizze stappen sille jo al in Kubernetes-kluster hawwe mei OIDC-autorisaasje ynsteld. It ienige punt is dat jo brûkers noch gjin kliïnt hawwe konfigureare, lykas har eigen kubeconfig. Om dit probleem op te lossen, moatte jo de automatyske útjefte fan kubeconfig oan brûkers konfigurearje nei suksesfolle autorisaasje.

Om dit te dwaan kinne jo spesjale webapplikaasjes brûke wêrmei jo de brûker kinne ferifiearje en dan de klear kubeconfig downloade. Ien fan de meast handige is Kuberos, It lit jo alle Kubernetes-klusters yn ien konfiguraasje beskriuwe en maklik tusken har wikselje.

Om Kuberos te konfigurearjen, is it genôch om it sjabloan foar kubeconfig te beskriuwen en it út te fieren mei de folgjende parameters:

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

Foar mear details sjoch Brûken op Github.

It is ek mooglik om te brûken kubelogin as jo wolle autorisearje direkt op de brûker syn kompjûter. Yn dit gefal sil de brûker in browser iepenje mei in autorisaasjeformulier op localhost.

De resultearjende kubeconfig kin wurde kontrolearre op 'e side jwt.io. Kopiearje gewoan de wearde users[].user.auth-provider.config.id-token fan jo kubeconfig nei in formulier op 'e side en krije de transkripsje daliks.

RBAC opset

By it konfigurearjen fan RBAC kinne jo ferwize nei sawol de brûkersnamme (fjild name yn it jwt-token) en foar in groep brûkers (fjild groups in jwt token). Hjir is in foarbyld fan it ynstellen fan tagongsrjochten foar in groep 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

Mear foarbylden foar RBAC kinne fûn wurde yn offisjele Kubernetes dokumintaasje

Auth-proxy ynstelle

Der is in prachtich projekt keycloak-poartewachter, wêrmei jo elke applikaasje befeiligje kinne troch de brûker te ferifiearjen nei de OIDC-tsjinner. Ik sil jo sjen litte hoe't jo it kinne ynstelle mei it Kubernetes Dashboard as foarbyld:

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

Boarne: www.habr.com

Add a comment