Ένας μικρός οδηγός για το πώς να χρησιμοποιήσετε το 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, αρκεί να περιγράψετε το πρότυπο για το kubeconfig και να το εκτελέσετε με τις ακόλουθες παραμέτρους:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
Για περισσότερες λεπτομέρειες βλ
Είναι επίσης δυνατή η χρήση
Το kubeconfig που προκύπτει μπορεί να ελεγχθεί στον ιστότοπο 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 μπορείτε να βρείτε στο
ρύθμιση εξουσιοδότησης διακομιστή μεσολάβησης
Υπάρχει ένα υπέροχο έργο
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