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.orgAprè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 IngressInstaller 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.ymlkeycloak:
#
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.orgDans le coin gauche, cliquez sur Ajouter un domaineDésactiver la vérification de la confirmation de l'e-mail de l'utilisateur:Étendues client -> E-mail -> Mappeurs -> E-mail vérifié (Supprimer) Nousconfigurons 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 ... -> ldapConfiguration 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 groupesFédération d'utilisateurs -> ldap_localhost -> Mappeurs -> CréerConfiguration 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éerCréer une scoupe pour les groupes: Étenduesclient -> CréerEt configurez le mappeur pour eux:Étendues client -> groupes -> Mappeurs -> CréerAjoutez le mappage de nos groupes aux étendues client par défaut:Clients -> kubernetes -> Étendues client -> Étendues client par défautSé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 -> SecretC'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éerCode de script
token.addAudience(token.getIssuedFor());
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.yamlkube-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 kubeadmkubectl 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 DashboardInstaller Kubernetes Dashboard
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
values_dashboard.yamlenableInsecureLogin: 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:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
path: /
hosts:
- kubernetes-dashboard.example.org
tls:
- secretName: tls-keycloak
hosts:
- kubernetes-dashboard.example.org
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
ClientID: "kubernetes"
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
skipOpenidProviderTlsVerify: true
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"
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"
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
clientID: "kubernetes"
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
usernameClaim: "sub"
apiServerURL: "https://192.168.99.111:8443"
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: