Στερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak

Αυτό το άρθρο έχει γραφτεί για να επεκταθεί στο ήδη υπάρχον, αλλά μιλά για τις δυνατότητες του πακέτου με το Microsoft ActiveDirectory, και επίσης το συμπληρώνει.

Σε αυτό το άρθρο θα σας πω πώς να εγκαταστήσετε και να ρυθμίσετε:

  • Μπρελόκ είναι ένα έργο ανοιχτού κώδικα. Το οποίο παρέχει ένα ενιαίο σημείο εισόδου για αιτήσεις. Λειτουργεί με πολλά πρωτόκολλα, συμπεριλαμβανομένων των 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

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

Στη συνέχεια, μεταβείτε στη διεπαφή ιστού keycloak.example.org

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

Κλειδί
αξία

Όνομα
Kubernetes

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

Απενεργοποίηση επαλήθευσης email χρήστη:
Πεδίο εφαρμογής πελάτη —> Ηλεκτρονικό ταχυδρομείο —> Χαρτογράφηση —> Επαληθευμένο email (Διαγραφή)

Δημιουργήσαμε ομοσπονδία για εισαγωγή χρηστών από το ActiveDirectory, θα αφήσω στιγμιότυπα οθόνης παρακάτω, νομίζω ότι θα είναι πιο ξεκάθαρο.

Συνένωση χρηστών —> Προσθήκη παρόχου… —> ldap

Ρύθμιση ομοσπονδίαςΣτερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak
Στερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak

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

Στη συνέχεια πρέπει να χαρτογραφήσουμε τις ομάδες μας

Συνομοσπονδία χρηστών --> ldap_localhost --> Χαρτογράφοι --> Δημιουργία

Δημιουργία χαρτογράφησηςΣτερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak

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

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

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

Ρύθμιση πελάτηΣτερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak

Ας δημιουργήσουμε scoupe για ομάδες:

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

Δημιουργία πεδίου εφαρμογήςΣτερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak

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

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

ΧαρτογράφοςΣτερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak

Προσθέστε την αντιστοίχιση των ομάδων μας στα Προεπιλεγμένα Πεδία Πελατών:

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

Λαμβάνουμε το μυστικό (και το γράφουμε στο νήμα) που θα χρησιμοποιήσουμε για εξουσιοδότηση στο Keycloak:

Πελάτες —> kubernetes —> Διαπιστευτήρια —> Μυστικό
Αυτό ολοκληρώνει τη ρύθμιση, αλλά είχα ένα σφάλμα όταν, μετά την επιτυχή εξουσιοδότηση, έλαβα ένα σφάλμα 403. Αναφορά σφάλματος.

Διορθώσετε:

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

ΧαρτογράφοςΣτερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak

Κωδικός σεναρίου

// 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"

Μετά από αυτό, όταν προσπαθείτε να πάτε στο kubernetes-dashboard.example.org, θα ανακατευθυνθούμε στο Keycloak και σε περίπτωση επιτυχούς εξουσιοδότησης θα φτάσουμε στον Πίνακα ελέγχου που είναι ήδη συνδεδεμένος.

εγκατάσταση διαδρόμου

Για ευκολία, μπορείτε να προσθέσετε ένα 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-----

Μοιάζει με αυτό. Σας επιτρέπει να κατεβάσετε αμέσως το αρχείο διαμόρφωσης και να το δημιουργήσετε χρησιμοποιώντας ένα σύνολο εντολών:

Στερεώνουμε την εξουσιοδότηση ActiveDirectory στο Kubernetes χρησιμοποιώντας το Keycloak

Πηγή: www.habr.com

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