Nous attachons l'autorisation ActiveDirectory à Kubernetes avec Keycloak

Cet article a été écrit dans le but d'élargir un article existant , mais parle des fonctionnalités du bundle avec Microsoft ActiveDirectory et le complète également.

Dans cet article, je vais vous expliquer comment installer et configurer:

  • Keycloak est un projet open source. Ce qui fournit un point d'entrée unique pour les applications. Il fonctionne avec de nombreux protocoles, dont LDAP et OpenID qui nous intéressent.
  • Keycloak gatekeeper - application de proxy inverse qui vous permet d'intégrer l'autorisation via Keycloak.
  • Gangway - l'application qui génère une configuration pour kubectl avec laquelle vous pouvez vous connecter et vous connecter à l'API Kubernetes via OpenID

Fonctionnement des droits dans Kubernetes.


Nous pouvons gérer les droits des utilisateurs / groupes à l'aide de RBAC, de nombreux articles ont déjà été créés à ce sujet, je ne m'attarderai pas là-dessus en détail. Le problème est que vous pouvez utiliser RBAC pour restreindre les droits des utilisateurs, mais Kubernetes ne sait rien des utilisateurs. Il s'avère que vous avez besoin d'un mécanisme de livraison utilisateur dans Kubernetes. Pour ce faire, nous ajouterons un fournisseur OpenID à Kuberntes qui dira qu'un tel utilisateur existe vraiment, et Kubernetes lui-même lui donnera déjà des droits.

Entraînement

  • Vous aurez besoin d'un cluster ou d'un minikube Kubernetes
  • Active Directory
  • Domaines:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certificat pour les domaines ou certificat auto-signé

Je ne m'attarderai pas sur la façon de créer un certificat auto-signé, vous devez créer 2 certificats, c'est le client racine (autorité de certification) et générique pour le domaine * .example.org

Après avoir reçu / écrit les certificats, le client doit être ajouté à Kubernetes, pour cela créer un secret pour cela:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

Ensuite, nous l'utiliserons pour notre contrôleur Ingress

Installer Keycloak


J'ai décidé que la façon la plus simple d'utiliser des solutions prêtes à l'emploi pour cela, à savoir les graphiques de barre.

Installez le référentiel et mettez-le à jour:

helm repo add codecentric https://codecentric.imtqy.com/helm-charts
helm repo update

Créez le fichier keycloak.yml avec le contenu suivant:

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


Configuration de la fédération


Ensuite, accédez à l'interface web keycloak.example.org

Dans le coin gauche, cliquez sur Ajouter un domaine
CléValeur
Nomkubernetes
Afficher un nomKubernetes

Désactiver la vérification de la confirmation de l'e-mail de l'utilisateur:
Étendues client -> E-mail -> Mappeurs -> E-mail vérifié (Supprimer) Nous

configurons la fédération pour importer des utilisateurs depuis ActiveDirectory, je laisserai des captures d'écran ci-dessous, je pense que ce sera plus clair.

Fédération d'utilisateurs -> Ajouter un fournisseur ... -> ldap

Configuration de la fédération



Si tout va bien, après avoir cliqué sur le bouton Synchroniser tous les utilisateurs , vous recevrez un message sur l'importation réussie des utilisateurs.

Ensuite, nous devons mapper nos groupes

Fédération d'utilisateurs -> ldap_localhost -> Mappeurs -> Créer

Création de mappeur


Configuration du client


Il faut créer un client, en termes de Keycloak est une application qui sera autorisée par lui. Je vais souligner les points importants de la capture d'écran en rouge.

Clients -> Créer

Configuration du client


Créer une scoupe pour les groupes: Étendues

client -> Créer

Faire une scoupe


Et configurez le mappeur pour eux:

Étendues client -> groupes -> Mappeurs -> Créer

Mappeur


Ajoutez le mappage de nos groupes aux étendues client par défaut:

Clients -> kubernetes -> Étendues client -> Étendues client par défaut
Sélectionnez les groupes dans les étendues client disponibles , cliquez sur Ajouter sélectionné

Nous obtenons un secret (et l'écrivons dans le fil) que nous utiliserons pour l'autorisation dans Keycloak:

Clients -> kubernetes -> Credentials -> Secret
C'est la fin de la configuration, mais j'ai reçu une erreur lorsqu'après une autorisation réussie, j'ai eu une erreur 403. Rapport de bogue .

Correction:

Étendues client -> rôles -> Mappeurs -> Créer

Mappeur


Code de script
// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();


Configurer Kubernetes


Nous devons indiquer où se trouve notre certificat racine du site et où se trouve le fournisseur OIDC.
Pour ce faire, modifiez le fichier /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
...


Mettez à jour la configuration de kubeadm dans le cluster:

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


Configurer l'auth-proxy


Vous pouvez utiliser le contrôleur d'accès Keycloak pour protéger votre application Web. En plus du fait que ce proxy inverse autorisera l'utilisateur avant d'afficher la page, il transmettra également des informations vous concernant dans les en-têtes à l'application finale. Ainsi, si votre application prend en charge OpenID, l'utilisateur se connecte immédiatement. Regardons l'exemple de Kubernetes Dashboard

Installer Kubernetes Dashboard



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'


Définition des autorisations:


Créez un ClusterRoleBinding qui accordera des droits d'administrateur de cluster (ClusterRole cluster-admin standard) aux utilisateurs du groupe 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


Installez le contrôleur d'accès Keycloak:



helm repo add gabibbo97 https://gabibbo97.imtqy.com/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"


Après cela, lorsque vous essayez d'accéder à kubernetes-dashboard.example.org , vous serez redirigé vers Keycloak et, si l'autorisation est réussie, nous serons déjà connectés à Dashboard.

Installation de passerelle


Pour plus de commodité, vous pouvez ajouter une passerelle qui générera un fichier de configuration pour kubectl, avec lequel nous entrerons déjà dans Kubernetes sous notre utilisateur.


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


Cela ressemble à ceci. Vous permet de télécharger immédiatement le fichier de configuration et de le créer à l'aide d'un ensemble de commandes:


All Articles