Αυτό το άρθρο έχει γραφτεί για να επεκταθεί στο ήδη
Σε αυτό το άρθρο θα σας πω πώς να εγκαταστήσετε και να ρυθμίσετε:
- Μπρελόκ είναι ένα έργο ανοιχτού κώδικα. Το οποίο παρέχει ένα ενιαίο σημείο εισόδου για αιτήσεις. Λειτουργεί με πολλά πρωτόκολλα, συμπεριλαμβανομένων των LDAP και OpenID που μας ενδιαφέρουν.
- μπρελόκ θυρωρός - Αντίστροφη εφαρμογή διακομιστή μεσολάβησης που σας επιτρέπει να ενσωματώσετε εξουσιοδότηση μέσω του Keycloak.
- Δίοδος - μια εφαρμογή που δημιουργεί μια διαμόρφωση για το kubectl με την οποία μπορείτε να συνδεθείτε και να συνδεθείτε στο Kubernetes API μέσω του OpenID.
Πώς λειτουργούν τα δικαιώματα στο Kubernetes.
Μπορούμε να διαχειριστούμε τα δικαιώματα χρήστη / ομάδας χρησιμοποιώντας το RBAC, έχουν ήδη δημιουργηθεί πολλά άρθρα σχετικά με αυτό, δεν θα σταθώ σε αυτό λεπτομερώς. Το πρόβλημα είναι ότι μπορείτε να χρησιμοποιήσετε το RBAC για να περιορίσετε τα δικαιώματα των χρηστών, αλλά η Kubernetes δεν γνωρίζει τίποτα για τους χρήστες. Αποδεικνύεται ότι χρειαζόμαστε έναν μηχανισμό παράδοσης χρήστη στο Kubernetes. Για να γίνει αυτό, θα προσθέσουμε έναν πάροχο στο Kuberntes OpenID, ο οποίος θα λέει ότι ένας τέτοιος χρήστης υπάρχει πραγματικά και η ίδια η Kubernetes θα του δώσει τα δικαιώματα.
Εκπαίδευση
- Θα χρειαστείτε ένα σύμπλεγμα Kubernetes ή minikube
- Active Directory
- Τομείς:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Πιστοποιητικό για τομείς ή αυτο-υπογεγραμμένο πιστοποιητικό
Δεν θα ασχοληθώ με το πώς να δημιουργήσετε ένα αυτο-υπογεγραμμένο πιστοποιητικό, πρέπει να δημιουργήσετε 2 πιστοποιητικά, αυτό είναι ο πελάτης ρίζας (Αρχή πιστοποιητικών) και μπαλαντέρ για τον τομέα *.example.org
Αφού λάβετε / εκδώσετε πιστοποιητικά, ο πελάτης πρέπει να προστεθεί στο Kubernetes, για αυτό δημιουργούμε ένα μυστικό για αυτό:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Στη συνέχεια, θα το χρησιμοποιήσουμε για τον ελεγκτή Ingress μας.
Εγκατάσταση Keycloak
Αποφάσισα ότι ο ευκολότερος τρόπος είναι να χρησιμοποιήσω έτοιμες λύσεις για αυτό, δηλαδή χάρτες τιμονιού.
Εγκαταστήστε το αποθετήριο και ενημερώστε το:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Δημιουργήστε ένα αρχείο keycloak.yml με το ακόλουθο περιεχόμενο:
keycloak.yml
keycloak:
# Имя администратора
username: "test_admin"
# Пароль администратор
password: "admin"
# Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам
понадобиться что бы починить один баг, о котором ниже.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
ingress:
enabled: true
path: /
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/affinity: cookie
hosts:
- keycloak.example.org
tls:
- hosts:
- keycloak.example.org
secretName: tls-keycloak
# Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: true
Ρύθμιση ομοσπονδίας
Στη συνέχεια, μεταβείτε στη διεπαφή ιστού
Κάντε κλικ στην αριστερή γωνία Προσθέστε βασίλειο
Κλειδί
αξία
Όνομα
Kubernetes
Όνομα Προβολής
Kubernetes
Απενεργοποίηση επαλήθευσης email χρήστη:
Πεδίο εφαρμογής πελάτη —> Ηλεκτρονικό ταχυδρομείο —> Χαρτογράφηση —> Επαληθευμένο email (Διαγραφή)
Δημιουργήσαμε ομοσπονδία για εισαγωγή χρηστών από το ActiveDirectory, θα αφήσω στιγμιότυπα οθόνης παρακάτω, νομίζω ότι θα είναι πιο ξεκάθαρο.
Συνένωση χρηστών —> Προσθήκη παρόχου… —> ldap
Ρύθμιση ομοσπονδίας
Εάν όλα είναι καλά, τότε αφού πατήσετε το κουμπί Συγχρονισμός όλων των χρηστών θα δείτε ένα μήνυμα σχετικά με την επιτυχή εισαγωγή χρηστών.
Στη συνέχεια πρέπει να χαρτογραφήσουμε τις ομάδες μας
Συνομοσπονδία χρηστών --> ldap_localhost --> Χαρτογράφοι --> Δημιουργία
Δημιουργία χαρτογράφησης
Ρύθμιση πελάτη
Είναι απαραίτητο να δημιουργήσετε έναν πελάτη, όσον αφορά το Keycloak, αυτή είναι μια εφαρμογή που θα εξουσιοδοτηθεί από αυτόν. Θα επισημάνω τα σημαντικά σημεία στο στιγμιότυπο οθόνης με κόκκινο χρώμα.
Πελάτες —> Δημιουργία
Ρύθμιση πελάτη
Ας δημιουργήσουμε scoupe για ομάδες:
Πεδίο εφαρμογής πελάτη —> Δημιουργία
Δημιουργία πεδίου εφαρμογής
Και δημιουργήστε έναν χάρτη για αυτούς:
Πεδίο εφαρμογής πελάτη —> ομάδες —> Χαρτογράφοι —> Δημιουργία
Χαρτογράφος
Προσθέστε την αντιστοίχιση των ομάδων μας στα Προεπιλεγμένα Πεδία Πελατών:
Clients —> kubernetes —> Client Scopes —> Default Client Scopes
Επιλέξτε ομάδες в Διαθέσιμα Πεδία Πελατών, πατήστε Προσθήκη επιλεγμένων
Λαμβάνουμε το μυστικό (και το γράφουμε στο νήμα) που θα χρησιμοποιήσουμε για εξουσιοδότηση στο Keycloak:
Πελάτες —> kubernetes —> Διαπιστευτήρια —> Μυστικό
Αυτό ολοκληρώνει τη ρύθμιση, αλλά είχα ένα σφάλμα όταν, μετά την επιτυχή εξουσιοδότηση, έλαβα ένα σφάλμα 403.
Διορθώσετε:
Πεδίο εφαρμογής πελάτη —> ρόλοι —> Χαρτογράφοι —> Δημιουργία
Χαρτογράφος
Κωδικός σεναρίου
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Διαμόρφωση του Kubernetes
Πρέπει να καθορίσουμε πού βρίσκεται το ριζικό πιστοποιητικό μας από τον ιστότοπο και πού βρίσκεται ο πάροχος OIDC.
Για να το κάνετε αυτό, επεξεργαστείτε το αρχείο /etc/kubernetes/manifests/kube-apiserver.yaml
kube-apiserver.yaml
...
spec:
containers:
- command:
- kube-apiserver
...
- --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
- --oidc-client-id=kubernetes
- --oidc-groups-claim=groups
- --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
- --oidc-username-claim=email
...
Ενημέρωση διαμόρφωσης kubeadm στο σύμπλεγμα:
kubeadmconfig
kubectl edit -n kube-system configmaps kubeadm-config
...
data:
ClusterConfiguration: |
apiServer:
extraArgs:
oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
oidc-client-id: kubernetes
oidc-groups-claim: groups
oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
oidc-username-claim: email
...
ρύθμιση εξουσιοδότησης διακομιστή μεσολάβησης
Μπορείτε να χρησιμοποιήσετε το keycloak gatekeeper για να προστατεύσετε την εφαρμογή Ιστού σας. Εκτός από το γεγονός ότι αυτός ο αντίστροφος διακομιστής μεσολάβησης θα εξουσιοδοτήσει τον χρήστη πριν από την εμφάνιση της σελίδας, θα μεταβιβάσει επίσης πληροφορίες σχετικά με εσάς στην τελική εφαρμογή στις κεφαλίδες. Έτσι, εάν η εφαρμογή σας υποστηρίζει OpenID, τότε ο χρήστης εξουσιοδοτείται αμέσως. Εξετάστε το παράδειγμα του πίνακα ελέγχου Kubernetes
Εγκατάσταση του πίνακα ελέγχου Kubernetes
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
values_dashboard.yaml
enableInsecureLogin: true
service:
externalPort: 80
rbac:
clusterAdminRole: true
create: true
serviceAccount:
create: true
name: 'dashboard-test'
Ρύθμιση δικαιωμάτων πρόσβασης:
Ας δημιουργήσουμε ένα ClusterRoleBinding που θα παρέχει δικαιώματα διαχειριστή συμπλέγματος (τυπικό σύμπλεγμα ClusterRole-διαχειριστής) για χρήστες στην ομάδα DataOPS.
kubectl apply -f rbac.yaml
rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dataops_group
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: DataOPS
Εγκαταστήστε το keycloak gatekeeper:
helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml
values_proxy.yaml
# Включаем ingress
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
path: /
hosts:
- kubernetes-dashboard.example.org
tls:
- secretName: tls-keycloak
hosts:
- kubernetes-dashboard.example.org
# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
- "uri=/*|groups=DataOPS"
Μετά από αυτό, όταν προσπαθείτε να πάτε στο
εγκατάσταση διαδρόμου
Για ευκολία, μπορείτε να προσθέσετε ένα gangway που θα δημιουργήσει ένα αρχείο διαμόρφωσης για το kubectl, με τη βοήθεια του οποίου θα μπούμε στο Kubernetes υπό τον χρήστη μας.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Произвольное имя кластера
clusterName: "my-k8s"
# Где у нас OIDC провайдер
authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
# Теоритически сюда можно добавить groups которые мы замапили
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Имя клиента
clientID: "kubernetes"
# Секрет
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
usernameClaim: "sub"
# Доменное имя или IP адресс API сервера
apiServerURL: "https://192.168.99.111:8443"
# Включаем Ingress
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
path: /
hosts:
- gangway.example.org
tls:
- secretName: tls-keycloak
hosts:
- gangway.example.org
# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
-----END CERTIFICATE-----
Μοιάζει με αυτό. Σας επιτρέπει να κατεβάσετε αμέσως το αρχείο διαμόρφωσης και να το δημιουργήσετε χρησιμοποιώντας ένα σύνολο εντολών:
Πηγή: www.habr.com