Configuration LDAP PowerFlex 4.x pour les environnements de grande taille
Summary: En restreignant les filtres de recherche LDAP de l’utilisateur et du groupe à l’aide du back-end SSO de la plate-forme de gestion PowerFlex, nous pouvons atténuer les problèmes de synchronisation à l’origine de plusieurs problèmes d’interface utilisateur et de plate-forme. ...
Instructions
- Préparation
- Suppression et nettoyage du fournisseur LDAP
- Reconstruction du fournisseur LDAP
- Application restreinte de l’étendue de l’utilisateur et du groupe LDAP
Informations :
Par défaut, les fournisseurs d’annuaires PowerFlex Management Platform (PFMP) importent tous les objets LDAP dans le périmètre de recherche configuré, y compris les comptes non-utilisateur et les autres objets non requis par notre RBAC.
Dans les environnements de grande taille, ce comportement peut entraîner un taux d’utilisation des ressources important sur les machines virtuelles de gestion PFMP (MVM), la base de données Postgres de prise en charge et la plate-forme globale.
Par conséquent, la synchronisation LDAP peut ne pas s’exécuter dans des délais acceptables, ce qui entraîne des retards de tâches, des fuites de mémoire et des problèmes d’accès simultané.
1. Préparation
Exigences :
- Catalogue global
- Recherche du nom unique des groupes AD pour PFMP
- Exigences relatives aux utilisateurs de liaison
- Exigences générales relatives à LDAP PFMP
Utilisation du catalogue global Active Directory
Remarque : Nous avons besoin d’utiliser le port 3268 pour LDAP standard ou le port 3269 pour LDAPS dans les environnements AD. Cela permet aux membres du groupe LDAP des domaines enfants ou d’autres domaines de confiance d’être utilisables dans PFMP.
Un groupe AD, par exemple :

Le domaine enfant ci-dessus na.powerflex.lab.dell.com doit être visible par Keycloak de fédération des utilisateurs LDAP de PFMP, à l’aide des ports de catalogue globaux qui permettent de les atteindre.
C’est également la raison pour laquelle nous utilisons objectGUID dans le fournisseur d’annuaire PFMP, qui lie les comptes à leur UUID unique global.
Si les deux domaines enfants sont répertoriés sous l’onglet Trusts, il semble que les sous-domaines se fassent confiance par défaut.
Dans un environnement Microsoft Active Directory (AD), un domaine parent et ses (sous-)domaines enfants se font intrinsèquement confiance dans une structure hiérarchique. C’est ce qu’on appelle une fiducie transitive.
Par défaut, ces approbations sont bidirectionnelles et transitives, ce qui signifie qu’un domaine parent fait confiance à ses domaines enfants et vice versa. Cette nature transitive étend la relation de confiance à tous les domaines de la hiérarchie parent-enfant.
Recherche de serveurs LDAP ou AD GC disponibles à partir d’entrées DNS
Généralement, le client fournit l’adresse LDAP à utiliser. Ces paramètres peuvent être copiés à partir de la configuration du fournisseur d’annuaire PFMP avant de le supprimer dans le cadre des étapes suivantes de ce guide.
Vous pouvez également récupérer les serveurs disponibles à partir du DNS pour un domaine spécifique :
# listing LDAP server
$ host -t srv _ldap._tcp.powerflex.lab.dell.com
Server: nameserver.dell.com
Address: 10.8.8.8
Non-authoritative answer:
_ldap._tcp.powerflex.lab.dell.com service = 0 100 636 hcihopad1.powerflex.lab.dell.com. _ldap._tcp.powerflex.lab.dell.com service = 0 100 389 hcihopad1.powerflex.lab.dell.com. _ldap._tcp.powerflex.lab.dell.com service = 0 100 389 hcick3ad2.powerflex.lab.dell.com. _ldap._tcp.powerflex.lab.dell.com service = 0 100 636 hcick3ad1.powerflex.lab.dell.com. _ldap._tcp.powerflex.lab.dell.com service = 0 100 389 hcihopad3.powerflex.lab.dell.com.
# listing AD GC servers (Active Directory Global Catalog)
host -t srv _gc._tcp.powerflex.lab.dell.com
Server: nameserver.dell.com
Address: 10.8.8.8
Non-authoritative answer:
_gc._tcp.powerflex.lab.dell.com service = 0 100 3268 hcihopad3.powerflex.lab.dell.com.
_gc._tcp.powerflex.lab.dell.com service = 0 100 3268 hcick3ad3.powerflex.lab.dell.com.
_gc._tcp.powerflex.lab.dell.com service = 0 100 3268 hcick3ad2.powerflex.lab.dell.com.
Comment trouver le nom distinctif d’une unité d’organisation ou d’un groupe.
Tout d’abord, nous allons avoir besoin des noms uniques (DN) des unités d’organisation et des groupes où nous voulons lire les utilisateurs dans PFMP. Ces chemins ne suivent pas strictement la dénomination DNS et contiennent des unités d’organisation à l’intérieur d’un chemin LDAP x.500 que nous pouvons extraire manuellement.
Nous pouvons trouver ces DN à l’aide de différents utilitaires en fonction du système d’exploitation, un moyen simple est d’utiliser curl :
Comment tester les paramètres LDAP PFMP à l’aide de l’utilitaire curl sous Linux.
Les versions plus récentes de curl qui sont installées sur les MVM peuvent être utilisées pour trouver les noms uniques complets dont vous avez besoin, par exemple cette recherche du DN complet du groupe LabAdmins CN :
#Get the DN of your groups for use in the LDAP User filter while also validating your LDAP Group Filter syntax# Set this to the group filter you intend to use in keycloak GROUPFILTER='(CN=LabAdmins)'# Use the LDAP svc bind creds to confirm the user can in fact call LDAP and see the group(s)BINDUSER="user@powerflex.lab.dell.com"# LDAP server URL. For TLS use ldaps:// and port 3269LDAPSERVER='ldap://ldap.powerflex.lab.dell.com:3268'# Use the same search base as you intend for the group path, generally just the DC componentsSEARCHBASE=DC=powerflex,DC=lab,DC=dell,DC=com# Call curl which will request the password of the bind user and return resultscurl -s sub --user "$BINDUSER" "$LDAPSERVER/$SEARCHBASE?distinguishedName?sub?$GROUPFILTER"
Enter host password for user 'jacqup@powerflex.lab.dell.com':
DN:CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
distinguishedName:CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
DN: CN=LabAdmins,CN=Users,DC=na,DC=powerflex,DC=lab,DC=dell,DC=com distinguishedName: CN=LabAdmins,CN=Users,DC=na,DC=powerflex,DC=lab,DC=dell,DC=com

Manual examples:
curl -s sub --user "FLEXLAB\jacqup"
"ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?distinguishedName,objectGUID?sub?(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=LabAdmins)(CN=LabUsers)(CN=EMEALabAdmins))"
Enter host password for user 'FLEXLAB\jacqup':
DN: CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=comdistinguishedName: CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=comDN: CN=LabAdmins,CN=Users,DC=na,DC=powerflex,DC=lab,DC=dell,DC=comdistinguishedName: CN=LabAdmins,CN=Users,DC=na,DC=powerflex,DC=lab,DC=dell,DC=comDN: CN=LabUsers,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=comdistinguishedName: CN=LabUsers,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
Recherchez tous les membres d’un groupe LDAP à l’aide des propriétés de filtre que vous pouvez ensuite placer dans le back-end keycloak :
#check for all members of the group with CN=LabAdmins
curl -s sub --user "jacqup@powerflex.lab.dell.com" "ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?member?sub?(&(objectClass=group)(cn=LabAdmins))"DN:CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=matrixadmin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=matrixadmin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=svc_adfsck3,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=svc_mcp_rw,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=adcertsvc,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=bobthebuilder,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=Ashish Rahangdale,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=Packer Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=FDLabAdmins,OU=Foundations,DC=powerflex,DC=lab,DC=dell,DC=commember: CN=Tejas Wadekar,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
Comment tester les paramètres LDAP PFMP à l’aide de l’utilitaire ldapsearch ou curl sous Linux.
Si un hôte Linux est disponible sur le réseau, l’utilisation de l’utilitaire ldapsearch peut être utile pour tester et valider les paramètres LDAP utilisés dans PFMP/Keycloak.
Par ailleurs, l’utilitaire curl peut également être utilisé pour les requêtes LDAP à partir de l’une des machines virtuelles/MVM de gestion.
Présentation rapide (options couramment utilisées) :
ldapsearch - LDAP search tool
ldapsearch opens a connection to an LDAP server, binds, and performs a search using specified parameters.
usage: ldapsearch [options] [filter
[attributes...]]
where:
filter RFC 4515 compliant LDAP search filter
attributes whitespace-separated list of attribute descriptions
Search options:
-b basedn base dn for search
-LLL print responses in LDIF format without comments and version Common options: -D binddn bind DN -H URI LDAP Uniform Resource Identifier(s) -N do not use reverse DNS to canonicalize SASL host name -w passwd bind password (for simple authentication) -W prompt for bind password -x Simple authentication
Vérification/installation de l’outil :
$ which ldapsearch
/usr/bin/ldapsearch
#RHEL/CentOS install
sudo yum install openldap-clients
# SLES install
sudo zypper install openldap2-client
Définition du DN de base (-b) à partir de l’entrée racine LDAP :
$ curl "ldap://ldap.powerflex.lab.dell.com:3268/?rootDomainNamingContext"
DN:
rootDomainNamingContext: DC=powerflex,DC=lab,DC=dell,DC=com
# ldapsearch (with simple auth)
$ ldapsearch -LLL -H ldap://ldap.powerflex.lab.dell.com -x -D "FLEXLAB\ck3-user" -W -b "" -s base "dn=" rootDomainNamingContext
dn: rootDomainNamingContext: DC=powerflex,DC=lab,DC=dell,DC=com
L’entrée racine fournit des informations sur le serveur de répertoire. Sur AD, l’attribut rootDomainNamingContext donne le nom unique de base supérieur qui peut être utilisé pour la recherche.
-W -b "
Test de l’URI LDAP, du DN de liaison (utilisateur/mot de passe avec accès en lecture) et des paramètres de recherche utilisateur :
$ ldapsearch -LLL -H ldap://powerflex.lab.dell.com:3268 -x -D "CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com" -W \ -b "dc=powerflex,dc=lab,dc=dell,dc=com" "(sAMAccountName=damonl)"
Enter LDAP Password: ********
dn: CN=Luc Damon,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
objectClass: person
cn: Luc Damon memberOf: CN=EMEALabAdmins,OU=LabAdmins,DC=powerflex,DC=lab,DC=dell,DC=com memberOf: CN=LabUsers,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com memberOf: CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com objectGUID:: 6Z359eP5vky4P0Ye8iFp8g== sAMAccountName: damonl
# equivalent curl command:
$ curl -u 'CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com' \
"ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com??sub?(sAMAccountName=damonl)"
# OR (with attributes selection)
$ curl -u 'FLEXLAB\ck3-user' \
"ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?cn,objectClass,memberOf,objectGUID,sAMAccountName?sub?(sAMAccountName=damonl)"
Dans cet exemple, nous interrogeons LDAP pour un compte d’utilisateur existant à l’aide de l’attribut sAMAccountName (la sortie a été tronquée pour afficher uniquement les attributs dont nous avons besoin).
Paramètres correspondants dans l’interface utilisateur PFMP :
Adresse (-H) : ldap://active.directory.domain.address.com:3268
DN de liaison (-D) : « CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com » # (« FLEXLAB\ck3-user » ou « ck3-user@powerflex.lab.dell.com » sont équivalents)
(-x est requis pour une authentification simple afin d’éviter le mode SASL par défaut)
Bind DN Password (-W) : invite à saisir le mot de passe (ou utilisez –w '***' pour le fournir dans la commande)
The output of the command validates the following PFMP User Search Settings:
Username LDAP Attribute: sAMAccountName
Attribut ID: objectGUID
Classe: personne
Chemin de recherche (-b) : « dc=powerflex,dc=lab,dc=dell,dc=com »
Test des paramètres de recherche de groupe :
$ ldapsearch -LLL -H ldap://powerflex.lab.dell.com:3268 -x -D "FLEXLAB\ck3-user" -W \ -b "dc=powerflex,dc=lab,dc=dell,dc=com" "(&(objectClass=group)(|(cn=FLEXLAB-APP-PROD-SDS-Admin)(cn=EMEALabAdmins)))" cn
dn: CN=EMEALabAdmins,OU=LabAdmins,DC=powerflex,DC=lab,DC=dell,DC=com
sAMAccountName: Administrator
member: CN=ck3-builder,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
sAMAccountName: jacqup member: CN=Luc Damon,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName: damonl member: CN=Patrick Jacques,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName: bobthebuilder
$ curl -u 'FLEXLAB\ck3-user' "ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?member?sub?(&(objectClass=group)(cn=EMEALabAdmins))"
In this example, we are querying LDAP for an existing group (objectClass) using its cn attribute and requesting member value(s).
It permits to validate following PFMP settings:
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
Group Search Path: "dc=powerflex,dc=lab,dc=dell,dc=com"
Groupe de test Filtre LDAP :
$ ldapsearch -LLL -H ldap://powerflex.lab.dell.com:3268 -x -D "FLEXLAB\ck3-user" -W \ -b "dc=powerflex,dc=lab,dc=dell,dc=com" "(&(objectClass=group)(|(cn=FLEXLAB-APP-PROD-SDS-Admin)(cn=EMEALabAdmins)))" cn dn:
CN=EMEALabAdmins,OU=LabAdmins,DC=powerflex,DC=lab,DC=dell,DC=com
cn:EMEALabAdmins
dn:CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com
cn:FLEXLAB-APP-PROD-SDS-Admin
$ curl -u 'FLEXLAB\ck3-user' "ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?cn?sub?(&(objectClass=group)(|(cn=FLEXLAB-APP-PROD-SDS-Admin)(cn=EMEALabAdmins)))"
Test du filtre LDAP de l’utilisateur :
$ ldapsearch -LLL -H ldap://powerflex.lab.dell.com:3268 -x -D "FLEXLAB\ck3-user" -W -b "dc=powerflex,dc=lab,dc=dell,dc=com" \dn: CN=Administrator,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com"(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)\(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))" sAMAccountNamesAMAccountName:Administratordn: CN=Patrick Jacques,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName:jacqup dn: CN=Luc Damon,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName: damonl dn: CN=bobthebuilder,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com sAMAccountName: bobthebuilder
$ curl -u 'FLEXLAB\ck3-user' "ldap://ldap.powerflex.lab.dell.com:3268/DC=powerflex,DC=lab,DC=dell,DC=com?sAMAccountName?sub?(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))"
Windows
Lancer des utilisateurs et des ordinateurs Active Directory. Cliquez sur Afficher et sélectionnez Fonctionnalités avancées.
Le DN est le nom qui identifie de manière unique une entrée dans le répertoire. Le premier composant du nom unique est appelé nom unique relatif (RDN).
Un nom unique est constitué de paires attribute=value, séparées par des virgules, par exemple :
CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Considérez-les comme des « FQDN pour LDAP », l’URL d’adresse x500 complète.
Les utilisateurs AD et les ordinateurs peuvent être utilisés pour déterminer les noms uniques et d’autres attributs :

Naviguez et cliquez avec le bouton droit de la souris sur l’UO dans laquelle vous souhaitez lire les utilisateurs, puis sélectionnez Propriétés.

Dans Propriétés de l’unité d’organisation, sélectionnez l’onglet Éditeur d’attributs.
Cliquez sur distinguishedName pour le mettre en surbrillance, puis cliquez sur View.
Cliquez avec le bouton droit de la souris sur la valeur en surbrillance et sélectionnez Copier.
Cliquez sur Annuler, puis sur OK pour fermer les fenêtres Éditeur d’attributs et Propriétés de l’unité d’organisation.

Exemple de filtre utilisateur LDAP à périmètre restreint :
(&(objectCategory=Personne)(sAMAccountName=*)(|( memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))
Explication visuelle :

Exigences utilisateur de liaison.
Cet utilisateur de liaison doit au moins être autorisé à interroger les utilisateurs et les groupes définis dans le serveur LDAP pour permettre au système de stockage d’authentifier ces utilisateurs.
Par défaut, lorsqu’un utilisateur est ajouté à l’onglet Sécurité du domaine de premier niveau dans Utilisateurs et ordinateurs Active Directory, il reçoit les exigences par défaut en lecture seule nécessaires pour l’authentification LDAP dans PFMP. p. ex.



FYI: Nous n’avons pas besoin que notre utilisateur de liaison LDAP se trouve réellement « dans » les groupes AD que nous devons lire dans le répertoire, nous avons besoin des autorisations « Read » de l’onglet Security.

Exigences générales pour le fournisseur LDAP PFMP
Adresse : ldaps://ad.ldap.domain:3269 (SSL) OU ldap://ad.ldap.domain:3268 (ORDINAIRE)
Nom distinctif de liaison : ADNTDOMAIN\serviceaccount ou nom distinctif Bind DN.
Bind DN Password : service account password
Timeout 30000
Username LDAP attribute: sAMAccountName
Attribut d’ID: objectGUID
Object Class: Person
Chemin de recherche: (Niveau le plus élevé qui peut interroger tous les groupes, par exemple uniquement les composants de domaine/contrôleurs de domaine : DC=powerflex,DC=lab,DC=dell,DC=com)
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
Group Search Path:( identique au User Search Path ou plus granulaire si nécessaire. Étant donné que nous utiliserons un filtre étroit, notre champ d’application peut être large sans impact sur les performances.)
#The’entrée suivante fournit au moins un groupe au filtre Groupe LDAP (PFMP 4.6.x+), afin que Keycloak ne recherche pas tous les groupes à partir de l’ensemble du répertoire :
Group LDAP Filter: (CN=GROUP1)
#Given la limitation de 64 caractères dans ce champ pour l’interface utilisateur PFMP uniquement, nous devons utiliser la keycloak pour la contourner si nous voulons ajouter plus que cela, par exemple 3 groupes différents :
Group LDAP Filter: (|(CN=GROUP1)(CN=GROUP2)(CN=GROUP3))
Testez la connexion. Si le test réussit, cliquez sur Envoyer.
Par ex.

2. Suppression et nettoyage du fournisseur LDAP
Supprimez les utilisateurs et les groupes LDAP, puis le fournisseur d’annuaire de l’interface utilisateur PFMP en tant qu’utilisateur administrateur. N’essayez pas de le faire en tant qu’utilisateur LDAP, mais uniquement en tant qu’administrateur.
AVERTISSEMENT : Veillez à enregistrer la configuration actuelle pour le mappage « Fournisseur d’annuaire » et « Utilisateurs/groupes distants » à partir de PFMP (en particulier si vous avez besoin de restaurer le mappage de rôle précédent).
Si le mappage de groupe/rôle ne s’affiche pas sur PFMP (problème connu), suivez les instructions suivantes :
# from any mvm
cmo_pri=$(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master,postgres-operator.crunchydata.com/instance-set' -o name)
# Group role
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "SELECT keycloak_group.name AS group_name,keycloak_role.name AS role_name FROM group_role_mapping JOIN keycloak_group ON (group_role_mapping.group_id = keycloak_group.id) JOIN keycloak_role ON (group_role_mapping.role_id = keycloak_role.id);"
# Group attributes
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "SELECT keycloak_group.name AS group_name,group_attribute.name AS attribute_name, value FROM group_attribute JOIN keycloak_group ON (group_attribute.group_id = keycloak_group.id);"
Example:
mvm01:~
# kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak
keycloak=# SELECT keycloak_group.name AS group_name,keycloak_role.name AS role_name FROM group_role_mapping JOIN keycloak_group ON (group_role_mapping.group_id = keycloak_group.id) JOIN keycloak_role ON (group_role_mapping.role_id = keycloak_role.id);---------------+----------------+---------group_name | role_name---------------+----------------EMEALabAdmins | SuperUserLabAdmins | LifecycleAdminLabUsers | Monitor(3 rows)keycloak=# SELECT keycloak_group.name AS group_name,group_attribute.name AS attribute_name, value FROM group_attribute JOIN keycloak_group ON (group_attribute.group_id = keycloak_group.id);group_name | attribute_name | valueEMEALabAdmins | remote_type | LdapEMEALabAdmins | SuperUser | GLB:GLBEMEALabAdmins | is_remote | trueLabAdmins | remote_type | LdapLabAdmins | LifecycleAdmin | GLB:GLBLabAdmins | is_remote | trueLabUsers | remote_type | LdapLabUsers | Monitor | GLB:GLBLabUsers | is_remote | true(9 rows)keycloak=# \q
Si des groupes LDAP obsolètes restent dans la base de données keycloak, ils peuvent être supprimés manuellement à l’aide du processus suivant :
Commandes de sauvegarde de base de données Keycloak et de nettoyage de table de keycloak_group base de données.
Remarque : Le nettoyage manuel de Keycloak n’est parfois pas nécessaire.
Nous devons utiliser l’interface utilisateur de PFMP pour supprimer le fournisseur (toujours à partir de PFMP en premier), puis confirmer qu’il a été effacé de keycloak à l’aide de l’URL /auth/.
Comment vérifier le nombre de groupes LDAP dans Keycloak à partir d’un MVM :
# Exécutez cette commande pour définir la variable en premier.
cmo_pri=$(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master,postgres-operator.crunchydata.com/instance-set' -o name)
#check count of groups in keycloak
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "SELECT COUNT (*) FROM keycloak_group;"
# We usually want 0 groups after removing the LDAP provider.
#Backup the current keycloak DB before any edits.
kubectl exec -it -n powerflex $cmo_pri -- bash -c 'pg_dump -U postgres -d keycloak' >/home/delladmin/keycloak.sql
#delete all entries inside of keycloak_group (and related roles and attributes) while preserving its structure
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "DELETE FROM group_attribute;"
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "DELETE FROM group_role_mapping;"
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "DELETE FROM keycloak_group;"
#check that the group count has reduced:
kubectl exec -it -n powerflex $cmo_pri -- psql -U postgres -d keycloak -c "SELECT COUNT (*) FROM keycloak_group;"
Cela se produit uniquement après la suppression dans l’interface utilisateur PFMP, et uniquement si les données du fournisseur restent dans le back-end. Si vous utilisez PFxM 4.6.0.1, vous pouvez également effectuer la méthode suivante pour supprimer des utilisateurs importés dans l’interface utilisateur de Keycloak :
- Connectez-vous à l’aide de /auth/ en tant qu’utilisateur keycloak
- Le mot de passe Keycloak est unique pour chaque installation et peut être trouvé sur n’importe quel MVM à l’aide de :
kubectl get secret -n powerflex keycloak-admin-credentials -o jsonpath="{.data.password}" | base64 --decode; echo
3. User federation -> LDAP -> Settings et dans la liste déroulante Actions en haut à droite, sélectionnez Remove Imported.

Une fois les groupes et les fournisseurs de répertoire nettoyés et supprimés, redémarrez les trois nœuds MVM.
-Note: Cela n’est nécessaire que lorsque l’environnement est volumineux et que les requêtes LDAP s’empilent à plusieurs reprises, comme nous le voyons dans ce cas dans les journaux ci-dessous.
- Si l’environnement n’est pas surchargé de problèmes de synchronisation et que l’interface utilisateur est stable, les redémarrages MVM peuvent généralement être ignorés. C’est une bonne mesure en général, cependant.
Redémarrer le https://www.dell.com/support/kbdoc/en-us/000225550 de la base de connaissances
Redémarrage normal MVM (doit être exécuté un nœud à la fois) Ne passez pas au nœud suivant tant que vous n’avez pas vérifié que la base de données signale une veille de synchronisation.
#As une bonne pratique, identifiez le nœud qui est le leader Postgres actuel et redémarrez celui-ci en dernier.
#Run la commande suivante sur n’importe quel MVM pour répertorier l’état de la base de données et les noms de base de données associés.
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
#Run cette commande pour identifier le nœud MVM hébergeant le pod de base de données postgres.
for x in `kubectl get pods -n powerflex | grep "postgres-ha-cmo" |awk '{print $1}'` ; do echo $x; kubectl get pods -n powerflex $x -o json | grep '"nodeName"' | cut -d ':' -f2 ; echo " "; done
#On le MVM qui est l’instance de pod Postgres Leader. Exécutez « watch kubectl get nodes » pour surveiller l’état de vos redémarrages. Ce MVM doit être le dernier nœud qui sera redémarré.
#Exemple d’ordre de redémarrage si pfmp-mgmt-1 est le leader Postgres. Ajustez l’ordre des commandes ci-dessous en fonction du MVM qui est le leader Postgres.
Ouvrez un terminal connecté au troisième MVM et exécutez les deux premières commandes.
kubectl label
node pfmp-mgmt-3 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-3 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When le nœud s’affiche lors du redémarrage. Exécutez la commande suivante.
kubectl uncordon pfmp-mgmt-3 ; kubectl label node pfmp-mgmt-3 cmo.maintenance.mode-
#Run la commande suivante jusqu’à ce que la base de données associée à MVM3 signale une veille de synchronisation. À ce stade, vous pouvez passer au MVM suivant.
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
Ouvrez un terminal connecté au deuxième MVM et exécutez les deux premières commandes.
kubectl label node pfmp-mgmt-2 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-2 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When le nœud s’affiche lors du redémarrage. Exécutez la commande suivante.
kubectl uncordon pfmp-mgmt-2 ; kubectl label node pfmp-mgmt-2 cmo.maintenance.mode-
#Run la commande suivante jusqu’à ce que la base de données associée à MVM2 signale Sync Standby. À ce stade, vous pouvez passer au MVM suivant.
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
#Run la commande suivante pour utiliser ce MVM en tant que MVM de surveillance de l’état des nœuds.
'watch kubectl get nodes'
Accédez au terminal connecté au premier MVM qui exécute « watch kubectl get nodes ». Appuyez sur Ctrl+C pour revenir au terminal et exécuter les deux premières commandes.
kubectl label
node pfmp-mgmt-1 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-1 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When le nœud s’affiche lors du redémarrage. Exécutez la commande suivante.
kubectl uncordon pfmp-mgmt-1 ; kubectl label node pfmp-mgmt-1 cmo.maintenance.mode-
#Run la commande suivante jusqu’à ce que la base de données associée à MVM1 signale une veille de synchronisation. Ce MVM était le leader, mais un nouveau leader prenait la relève lorsque MVM1 était vidé.
kubectl exec -n powerflex -c database $(kubectl get pods -n powerflex -l='postgres-operator.crunchydata.com/role=master, postgres-operator.crunchydata.com/instance-set' | grep Running | cut -d' ' -f1) -- sh -c 'patronictl list'
FIN DE LA PROCÉDURE DE REDÉMARRAGE NORMAL DE MVM
Une fois le redémarrage effectué et l’interface utilisateur restaurée pour PFMP, connectez-vous en tant qu’administrateur et ajoutez Paramètres -> Fournisseur d’annuaire en suivant les étapes ci-dessous :
3. Reconstruction du fournisseur LDAP
Comme indiqué dans la section de préparation, s’il existe des domaines AD enfants ou des comptes de confiance de domaine AD dans les groupes que vous devez utiliser dans PFMP, les ports LDAP 3268 (simples) et 3269 (SSL) du catalogue global (GC) doivent être utilisés.
Par ex.
ldaps://ad.ldap.corporate.domain.com:3269Users DN: DC=powerflex,DC=lab,DC=dell,DC=com Bind DN:DOMAIN\svc_ldapbindaccountUsername LDAP attribute: sAMAccountName UUID LDAP attribute: objectGUID User Object Classes: Person This field has a 64 character limit in PFMP UI only. You can put one group in to prevent 'full' directory sync, then use the keycloak UI to refine and add on to the group filter. Group LDAP Filter: (|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=LabAdmins)) Timeout 22222
4. Application restreinte de l’étendue de l’utilisateur et du groupe LDAP
Connectez-vous à l’aide de /auth/ en tant qu’utilisateur keycloak
Filtre d’utilisateur :
# Le filtre LDAP de l’utilisateur est absent de l’interface utilisateur PFMP, nous devons donc utiliser les éléments suivants pour changer cela.
#This filtre doit être appliqué dans le domaine Keycloak PowerFlex (PowerFlex --> Fédération de l’utilisateur --> Filtre LDAP de l’utilisateur)
Filtre LDAP utilisateur :
(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabUsers,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))
Enregistrez la modification.
Explication de ce filtre restreint :
objectCategory est égal à Personne.
et
sAMAccountName existe
et
memberOf est égal à CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
ou
memberOf est égal à CN=FLEX-STOR-MON,OU=15G,OU=FLEXLAB,DC=powerflex,DC=lab,DC=dell,DC=com
À partir de <https://ldap-builder.powerflex.lab.dell.com/>
User federation -> LDAP -> Settings et dans la liste déroulante Actions en haut à droite, sélectionnez remove imported.

Interface utilisateur 4.6.x+ Méthode pour supprimer le mappage de groupe.

Dans le paramètre LDAP Group Mapping pour « Membership User LDAP Attribute », nous devons également nous assurer qu’une valeur correcte que nous fournissons en tant que « cn » et que nous ne pouvons pas modifier dans l’interface utilisateur PFMP est modifiée dans l’interface utilisateur keycloak en DN.

Dans le filtre LDAP du groupe, nous pouvons répertorier un opérateur de l’un ou l’autre | et les NC de chaque groupe, p. ex.
(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=CN=PRV_US_SA_SRV_SVS))