Στερεώνουμε την εξουσιοδότηση LDAP στο Kubernetes

Στερεώνουμε την εξουσιοδότηση LDAP στο Kubernetes

Ένας μικρός οδηγός για το πώς να χρησιμοποιήσετε το Keycloak για να συνδέσετε το Kubernetes στον διακομιστή LDAP και να ρυθμίσετε την εισαγωγή χρηστών και ομάδων. Αυτό θα σας επιτρέψει να ρυθμίσετε το RBAC για τους χρήστες σας και να χρησιμοποιήσετε το auth-proxy για την προστασία του Kubernetes Dashboard και άλλων εφαρμογών που δεν ξέρουν πώς να εξουσιοδοτήσουν τον εαυτό τους.

Εγκατάσταση Keycloak

Ας υποθέσουμε ότι έχετε ήδη διακομιστή LDAP. Θα μπορούσε να είναι Active Directory, FreeIPA, OpenLDAP ή οτιδήποτε άλλο. Εάν δεν έχετε διακομιστή LDAP, τότε καταρχήν μπορείτε να δημιουργήσετε χρήστες απευθείας στη διεπαφή Keycloak ή να χρησιμοποιήσετε δημόσιους παρόχους oidc (Google, Github, Gitlab), το αποτέλεσμα θα είναι σχεδόν το ίδιο.

Πρώτα απ 'όλα, ας εγκαταστήσουμε το ίδιο το Keycloak, η εγκατάσταση μπορεί να πραγματοποιηθεί ξεχωριστά ή απευθείας στο σύμπλεγμα Kubernetes, κατά κανόνα, εάν έχετε πολλά συμπλέγματα Kubernetes, θα ήταν ευκολότερο να το εγκαταστήσετε ξεχωριστά. Από την άλλη πλευρά, μπορείτε πάντα να χρησιμοποιήσετε επίσημο διάγραμμα τιμονιού και εγκαταστήστε το απευθείας στο σύμπλεγμα σας.

Για να αποθηκεύσετε δεδομένα Keycloak, θα χρειαστείτε μια βάση δεδομένων. Η προεπιλογή είναι h2 (όλα τα δεδομένα αποθηκεύονται τοπικά), αλλά είναι επίσης δυνατή η χρήση postgres, mysql ή mariadb.
Εάν εξακολουθείτε να αποφασίσετε να εγκαταστήσετε το Keycloak ξεχωριστά, μπορείτε να βρείτε πιο λεπτομερείς οδηγίες στο επίσημη τεκμηρίωση.

Ρύθμιση ομοσπονδίας

Πρώτα απ 'όλα, ας δημιουργήσουμε ένα νέο βασίλειο. Το Realm είναι ο χώρος της εφαρμογής μας. Κάθε εφαρμογή μπορεί να έχει το δικό της βασίλειο με διαφορετικούς χρήστες και ρυθμίσεις εξουσιοδότησης. Το κύριο βασίλειο χρησιμοποιείται από τον ίδιο τον Keycloak και η χρήση του για οτιδήποτε άλλο είναι λάθος.

Κάντε κλικ Προσθέστε βασίλειο

Επιλογή
αξία

Όνομα
kubernetes

Όνομα Προβολής
Kubernetes

Εμφανιζόμενο όνομα HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >

Το Kubernetes από προεπιλογή ελέγχει εάν το email του χρήστη είναι επιβεβαιωμένο ή όχι. Δεδομένου ότι χρησιμοποιούμε τον δικό μας διακομιστή LDAP, αυτός ο έλεγχος θα επιστρέφει σχεδόν πάντα false. Ας απενεργοποιήσουμε την αναπαράσταση αυτής της ρύθμισης στο Kubernetes:

Πεδίο εφαρμογής πελάτη -> Ηλεκτρονική Διεύθυνση (Email) -> Χαρτογράφοι -> email επαληθευμένο (Διαγράφω)

Τώρα ας δημιουργήσουμε την ομοσπονδία, για αυτό πηγαίνουμε στο:

Ομοσπονδία χρηστών -> Προσθήκη παρόχου… -> ldap

Ακολουθεί ένα παράδειγμα ρύθμισης για το FreeIPA:

Επιλογή
αξία

Εμφανιζόμενο όνομα κονσόλας
freeipa.example.org

Πάροχος υπηρεσιών
Red Hat Directory Server

Χαρακτηριστικό UUID LDAP
ipauniqueid

URL σύνδεσης
ldaps://freeipa.example.org

DN χρήστη
cn=users,cn=accounts,dc=example,dc=org

Δέσμευση DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org

Δέσμευση διαπιστευτηρίων
<password>

Να επιτρέπεται ο έλεγχος ταυτότητας Kerberos:
on

Kerberos Realm:
EXAMPLE.ORG

Κύριος διακομιστής:
HTTP/[email protected]

καρτέλα κλειδιού:
/etc/krb5.keytab

Χρήστης keycloak-svc πρέπει να δημιουργηθεί εκ των προτέρων στον διακομιστή LDAP μας.

Στην περίπτωση της υπηρεσίας καταλόγου Active Directory, απλώς επιλέξτε Προμηθευτής: Active Directory και οι απαραίτητες ρυθμίσεις θα εισαχθούν αυτόματα στη φόρμα.

Κάντε κλικ Αποθήκευση

Τώρα ας προχωρήσουμε:

Ομοσπονδία χρηστών -> freeipa.example.org -> Χαρτογράφοι -> Όνομα

Επιλογή
αξία

Ιδιότητες LDap
givenName

Τώρα ενεργοποιήστε την ομαδική αντιστοίχιση:

Ομοσπονδία χρηστών -> freeipa.example.org -> Χαρτογράφοι -> Δημιουργία

Επιλογή
αξία

Όνομα
groups

Τύπος χαρτογράφου
group-ldap-mapper

Ομάδες LDAP DN
cn=groups,cn=accounts,dc=example,dc=org

Στρατηγική ανάκτησης ομάδας χρηστών
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Αυτό ολοκληρώνει τη ρύθμιση της ομοσπονδίας, ας προχωρήσουμε στη ρύθμιση του πελάτη.

Ρύθμιση πελάτη

Ας δημιουργήσουμε έναν νέο πελάτη (μια εφαρμογή που θα δέχεται χρήστες από το Keycloak). Πάμε:

Πελάτες -> Δημιουργία

Επιλογή
αξία

Αναγνωριστικό πελάτη
kubernetes

Τύπος πρόσβασης
confidenrial

Διεύθυνση URL ρίζας
http://kubernetes.example.org/

Έγκυρα URI ανακατεύθυνσης
http://kubernetes.example.org/*

Διεύθυνση URL διαχειριστή
http://kubernetes.example.org/

Θα δημιουργήσουμε επίσης ένα πεδίο για ομάδες:

Πεδίο εφαρμογής πελάτη -> Δημιουργία

Επιλογή
αξία

Περίγραμμα
No template

Όνομα
groups

Πλήρης ομαδική διαδρομή
false

Και δημιουργήστε έναν χάρτη για αυτούς:

Πεδίο εφαρμογής πελάτη -> ομάδες -> Χαρτογράφοι -> Δημιουργία

Επιλογή
αξία

Όνομα
groups

Τύπος χαρτογράφου
Group membership

Token Όνομα αξίωσης
groups

Τώρα πρέπει να ενεργοποιήσουμε την ομαδική αντιστοίχιση στο πεδίο εφαρμογής πελάτη μας:

Πελάτες -> Kubernetes -> Πεδίο εφαρμογής πελάτη -> Προεπιλεγμένα πεδία πελάτη

Επιλέξτε ομάδες в Διαθέσιμα Πεδία Πελατών, πατήστε Προσθήκη επιλεγμένων

Τώρα ας ρυθμίσουμε τον έλεγχο ταυτότητας της εφαρμογής μας, μεταβείτε στη διεύθυνση:

Πελάτες -> Kubernetes

Επιλογή
αξία

Η εξουσιοδότηση ενεργοποιήθηκε
ON

Ας πιέσουμε αποθηκεύσετε και αυτό ολοκληρώνει τη ρύθμιση του πελάτη, τώρα στην καρτέλα

Πελάτες -> Kubernetes -> Διαπιστεύσεις

μπορείς να πάρεις Μυστικό που θα χρησιμοποιήσουμε αργότερα.

Διαμόρφωση του Kubernetes

Η ρύθμιση του Kubernetes για εξουσιοδότηση OIDC είναι αρκετά ασήμαντη και δεν είναι κάτι πολύ περίπλοκο. Το μόνο που χρειάζεται να κάνετε είναι να τοποθετήσετε το πιστοποιητικό CA του διακομιστή OIDC σας /etc/kubernetes/pki/oidc-ca.pem και προσθέστε τις απαραίτητες επιλογές για το kube-apiserver.
Για να το κάνετε αυτό, ενημερώστε /etc/kubernetes/manifests/kube-apiserver.yaml σε όλα τα αφεντικά σου:

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

Και επίσης ενημερώστε τη διαμόρφωση kubeadm στο σύμπλεγμα, ώστε να μην χαθούν αυτές οι ρυθμίσεις κατά την ενημέρωση:

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

Αυτό ολοκληρώνει τη ρύθμιση του Kubernetes. Μπορείτε να επαναλάβετε αυτά τα βήματα σε όλα τα συμπλέγματά σας Kubernetes.

Αρχική Εξουσιοδότηση

Μετά από αυτά τα βήματα, θα έχετε ήδη διαμορφώσει ένα σύμπλεγμα Kubernetes με εξουσιοδότηση OIDC. Το μόνο σημείο είναι ότι οι χρήστες σας δεν έχουν ακόμη διαμορφώσει έναν πελάτη, καθώς και το δικό τους kubeconfig. Για να λύσετε αυτό το πρόβλημα, πρέπει να ρυθμίσετε τις παραμέτρους της αυτόματης έκδοσης του kubeconfig στους χρήστες μετά την επιτυχή εξουσιοδότηση.

Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε ειδικές εφαρμογές web που σας επιτρέπουν να ελέγξετε την ταυτότητα του χρήστη και στη συνέχεια να κάνετε λήψη του τελικού kubeconfig. Ένα από τα πιο βολικά είναι Kuberos, σας επιτρέπει να περιγράφετε όλα τα συμπλέγματα Kubernetes σε μία διαμόρφωση και να εναλλάσσεστε εύκολα μεταξύ τους.

Για να διαμορφώσετε το Kuberos, αρκεί να περιγράψετε το πρότυπο για το kubeconfig και να το εκτελέσετε με τις ακόλουθες παραμέτρους:

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

Για περισσότερες λεπτομέρειες βλ Χρήση στο Github.

Είναι επίσης δυνατή η χρήση kubelogin εάν θέλετε να εξουσιοδοτήσετε απευθείας στον υπολογιστή του χρήστη. Σε αυτήν την περίπτωση, ο χρήστης θα ανοίξει ένα πρόγραμμα περιήγησης με μια φόρμα εξουσιοδότησης στο localhost.

Το kubeconfig που προκύπτει μπορεί να ελεγχθεί στον ιστότοπο jwt.io. Απλώς αντιγράψτε την τιμή users[].user.auth-provider.config.id-token από το kubeconfig σας σε μια φόρμα στον ιστότοπο και λάβετε τη μεταγραφή αμέσως.

Ρύθμιση RBAC

Κατά τη διαμόρφωση του RBAC, μπορείτε να ανατρέξετε και στο όνομα χρήστη (πεδίο name στο jwt token) και για μια ομάδα χρηστών (πεδίο groups σε jwt token). Ακολουθεί ένα παράδειγμα ρύθμισης δικαιωμάτων για μια ομάδα 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

Περισσότερα παραδείγματα για το RBAC μπορείτε να βρείτε στο επίσημη τεκμηρίωση Kubernetes

ρύθμιση εξουσιοδότησης διακομιστή μεσολάβησης

Υπάρχει ένα υπέροχο έργο κλειδομανδύας-θυρωρός, το οποίο σας επιτρέπει να ασφαλίσετε οποιαδήποτε εφαρμογή επιτρέποντας στον χρήστη να πραγματοποιήσει έλεγχο ταυτότητας στον διακομιστή OIDC. Θα σας δείξω πώς μπορείτε να το ρυθμίσετε χρησιμοποιώντας τον Πίνακα ελέγχου Kubernetes ως παράδειγμα:

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

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο