PowerFlex 4.x – LDAP-Konfiguration für große Umgebungen
Summary: Durch das Eingrenzen der LDAP-Suchfilter für Nutzer und Gruppen mithilfe des SSO-Back-ends der PowerFlex Management Platform können wir Synchronisierungsprobleme reduzieren, die mehrere UI- und Plattformprobleme verursachen. ...
Instructions
- Vorbereitung
- Entfernen und Bereinigen von LDAP-Anbietern
- Neuerstellung des LDAP-Anbieters
- Anwendung für engen LDAP-Nutzer- und -Gruppenbereich
Hintergrund:
Standardmäßig importieren PFMP-Verzeichnisanbieter (PowerFlex Management Platform) alle LDAP-Objekte innerhalb des konfigurierten Suchbereichs, einschließlich Nicht-Nutzerkonten und anderer Objekte, die für unsere RBAC nicht erforderlich sind.
In großen Umgebungen kann dieses Verhalten zu einer erheblichen Ressourcenauslastung über PFMP-Management-VMs (MVMs), die unterstützende Postgres-Datenbank und die gesamte Plattform führen.
Aus diesem Grund kann die LDAP-Synchronisation möglicherweise nicht innerhalb eines akzeptablen Zeitrahmens abgeschlossen werden, was zu Auftragsrückständen, Speicherlecks und Gleichzeitigkeitsproblemen führt.
1. Vorbereitung
Anforderungen:
- Globaler Katalog
- Ermitteln des DN der AD-Gruppen für PFMP
- Anforderungen für Bind-Nutzer
- PFMP-LDAP – Allgemeine Anforderungen
Verwenden des globalen Active Directory-Katalogs
Hinweis: In AD-Umgebungen muss Port 3268 für Standard-LDAP oder Port 3269 für LDAPS verwendet werden. Auf diese Weise können LDAP-Gruppenmitglieder aus untergeordneten Domains oder anderen vertrauenswürdigen Domains in PFMP verwendet werden.
Eine AD-Gruppe, z. B.:

Die untergeordnete Domain über na.powerflex.lab.dell.com muss für den LDAP-Nutzerverbund-Keycloak von PFMP sichtbar sein, da sie über die globalen Katalogports erreichbar sind.
Aus diesem Grund verwenden wir auch objectGUID im PFMP-Verzeichnisanbieter. Es verknüpft Konten mit ihrer globalen eindeutigen UUID.
Wenn beide untergeordneten Domänen auf der Registerkarte Vertrauensstellungen aufgeführt sind, scheinen sich die Unterdomänen standardmäßig gegenseitig zu vertrauen.
In einer Microsoft Active Directory (AD)-Umgebung vertrauen eine übergeordnete Domäne und ihre untergeordneten (untergeordneten) Domänen einander grundsätzlich in einer hierarchischen Struktur. Dies wird als transitive Vertrauensstellung bezeichnet.
Standardmäßig sind diese Vertrauensstellungen bidirektional und transitiv, d. h., eine übergeordnete Domäne vertraut ihren untergeordneten Domänen und umgekehrt. Diese transitive Natur erweitert die Vertrauensstellung auf alle Domänen innerhalb der Hierarchie zwischen über- und untergeordneten Elementen.
Suchen nach verfügbaren LDAP- oder AD GC-Servern anhand von DNS-Einträgen
In der Regel stellt der Kunde die zu verwendende LDAP-Adresse bereit. Diese Einstellungen können aus der Konfiguration des PFMP-Verzeichnisanbieters kopiert werden, bevor Sie sie im Rahmen der nächsten Schritte dieses Handbuchs entfernen.
Alternativ können verfügbare Server für eine bestimmte Domain vom DNS abgerufen werden:
# 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.
So finden Sie den distinguishedName einer Organisationseinheit oder Gruppe.
Zunächst benötigen wir die Distinguished Names (DN) der Organisationseinheiten und Gruppen, in denen wir Nutzer in PFMP einlesen möchten. Diese Pfade folgen nicht strikt der DNS-Benennung und enthalten OUs innerhalb eines x.500-LDAP-Pfads, den wir manuell extrahieren können.
Wir können diese DNs finden, indem wir je nach Betriebssystem unterschiedliche Dienstprogramme verwenden. Eine einfache Möglichkeit ist die Verwendung von curl:
So testen Sie PFMP-LDAP-Einstellungen mit dem Dienstprogramm curl unter Linux.
Die neueren Versionen von curl, die auf MVMs installiert sind, können verwendet werden, um die vollständigen Distinguished Names zu finden, die Sie benötigen, z. B. sucht diese nach dem vollständigen DN des LabAdmins-Gruppen-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
Suchen Sie alle Mitglieder einer LDAP-Gruppe mithilfe von Filtereigenschaften, die Sie dann in das Keycloak-Back-end einfügen können:
#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
So testen Sie PFMP-LDAP-Einstellungen mit dem Dienstprogramm ldapsearch oder curl unter Linux.
Wenn ein Linux-Host im Netzwerk verfügbar ist, kann das ldapsearch-Dienstprogramm nützlich sein, um die in PFMP/Keycloak verwendeten LDAP-Einstellungen zu testen und zu validieren.
Alternativ kann das curl-Dienstprogramm auch für LDAP-Abfragen von einer der Management-VMs/MVMs verwendet werden.
Kurze Einführung (häufig verwendete Optionen):
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
Überprüfen/Installieren des Tools:
$ which ldapsearch
/usr/bin/ldapsearch
#RHEL/CentOS install
sudo yum install openldap-clients
# SLES install
sudo zypper install openldap2-client
Definieren des Basis-DN (-b) aus dem LDAP-Stammeintrag:
$ 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
Der Root-Eintrag enthält Informationen zum Verzeichnisserver. In AD gibt das Attribut rootDomainNamingContext den obersten Basis-DN an, der für die Suche verwendet werden kann.
-W -b "
Testen von LDAP-URI,Bindungs-DN (Nutzer/Kennwort mit Lesezugriff) und Nutzersucheinstellungen:
$ 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)"
In diesem Beispiel fragen wir LDAP nach einem vorhandenen Nutzerkonto mit dem Attribut sAMAccountName ab (die Ausgabe wurde gekürzt, um nur die Attribute anzuzeigen, die wir benötigen).
Entsprechende Einstellungen in der PFMP-Benutzeroberfläche:
Adresse (-H): ldap://active.directory.domain.address.com:3268
Bindungs-DN (-D): "CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com" # ("FLEXLAB\ck3-user" oder "ck3-user@powerflex.lab.dell.com" sind Entsprechungen)
(-x ist für die einfache Authentifizierung erforderlich, um den Standard-SASL-Modus zu vermeiden)
Bindungs-DN-Kennwort (-W): Aufforderung zur Eingabe des Kennworts (oder verwenden Sie -w '***' , um es im Befehl einzugeben)
The output of the command validates the following PFMP User Search Settings:
Username LDAP Attribute: sAMAccountName
ID-Attribut: objectGUID
Objektklasse: Person
Suchpfad (-b): "dc=powerflex,dc=lab,dc=dell,dc=com"
Testen der Einstellungen für die Gruppensuche:
$ 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"
LDAP-Filter der Testgruppe:
$ 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)))"
Testen des Nutzer-LDAP-Filters:
$ 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
Starten Sie Active Directory-Nutzer und -Computer. Klicken Sie auf View und wählen Sie Advanced Features aus.
Der DN ist der Name, der einen Eintrag im Verzeichnis eindeutig identifiziert. Die erste Komponente des DN wird als Relative Distinguished Name (RDN) bezeichnet.
Ein DN besteht aus Attribut=Wert-Paaren, die durch Kommas getrennt sind, z. B.:
CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Stellen Sie sie sich als "FQDNs für LDAP" vor, die vollständige URL der x500-Adresse.
AD-Nutzer und -Computer können verwendet werden, um DNs und andere Attribute zu bestimmen:

Navigieren Sie zu der Organisationseinheit, in der Sie Nutzer lesen möchten, klicken Sie mit der rechten Maustaste darauf, und wählen Sie dann Eigenschaften aus.

Wählen Sie in den OU-Eigenschaften die Registerkarte Attribut-Editor aus.
Klicken Sie auf distinguishedName, um ihn zu markieren, und klicken Sie dann auf Anzeigen.
Klicken Sie mit der rechten Maustaste auf den hervorgehobenen Wert und wählen Sie Copy aus.
Klicken Sie auf Abbrechen und dann auf OK, um die Fenster Attribut-Editor und OU-Eigenschaften zu schließen.

Beispiel für einen LDAP-Nutzerfilter mit schmalem Bereich:
(&(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)))
Visuelle Erklärung:

Anforderungen für Bind-Nutzer.
Dieser Bindungsnutzer muss mindestens über die Berechtigung zum Abfragen von Nutzern und Gruppen verfügen, die im LDAP-Server definiert sind, damit das Storage-System diese Nutzer authentifizieren kann.
Wenn ein Nutzer der Registerkarte "Sicherheit" der Domain der obersten Ebene in Active Directory-Nutzer und -Computer hinzugefügt wird, erhält er standardmäßig die standardmäßigen schreibgeschützten Anforderungen, die für die LDAP-Authentifizierung in PFMP erforderlich sind. zum Beispiel.



FYI: Unser LDAP-Bindungsnutzer muss sich nicht in den AD-Gruppen befinden, die wir im Verzeichnis lesen müssen. Wir benötigen die Berechtigungen "Lesen" auf der Registerkarte "Sicherheit".

Allgemeine Anforderungen für PFMP-LDAP-Anbieter
Adresse: ldaps://ad.ldap.domain:3269 (SSL) ODER ldap://ad.ldap.domain:3268 (PLAIN)
Bindungs-DN: ADNTDOMAIN\serviceaccount oder Bindungs-DN Eindeutiger Name.
Bindungs-DN-Kennwort: Servicekontokennwort
Timeout 30000
Username LDAP attribute: sAMAccountName
ID-Attribut: objectGUID
Object Class: Person
Suchpfad: (Höchste Ebene, die alle Gruppen abfragen kann, z.B. nur die Domänenkomponenten/DCs: DC = PowerFlex, DC = Lab, DC = Dell , DC = com
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
Gruppensuchpfad:(Identisch mit dem Nutzersuchpfad oder bei Bedarf detaillierter. Da wir einen schmalen Filter verwenden, kann unser Bereich breit sein, ohne die Leistung zu beeinträchtigen.)
#The folgende Eintrag stellt mindestens eine Gruppe für den LDAP-Gruppenfilter (PFMP 4.6.x+) bereit, sodass Keycloak nicht nach allen Gruppen im gesamten Verzeichnis sucht:
Group LDAP Filter: (CN=GROUP1)
#Given der 64-Zeichen-Beschränkung in diesem Feld nur für die PFMP-Benutzeroberfläche müssen wir den Keycloak verwenden, um sie zu umgehen, wenn wir mehr als das hinzufügen möchten, z. B. 3 verschiedene Gruppen:
Group LDAP Filter: (|(CN=GROUP1)(CN=GROUP2)(CN=GROUP3))
Testverbindung und wenn erfolgreich, klicken Sie auf Senden.
Zum Beispiel.

2. Entfernen und Bereinigen von LDAP-Anbietern
Entfernen Sie die LDAP-Nutzer, -Gruppen und dann den Verzeichnisanbieter als Admin-Nutzer aus der PFMP-Benutzeroberfläche. Versuchen Sie dies nicht als LDAP-Nutzer, sondern nur als Administrator.
Warnung: Notieren Sie sich die aktuelle Konfiguration für die Zuordnung von "Verzeichnisanbieter" und "Remotenutzer/-gruppen" aus PFMP (insbesondere, wenn Sie die vorherige Rollenzuordnung wiederherstellen müssen).
Wenn die Gruppen-/Rollenzuordnung in PFMP nicht angezeigt wird (bekanntes Problem), befolgen Sie die folgenden Anweisungen:
# 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
Wenn veraltete LDAP-Gruppen in der Keycloak-Datenbank verbleiben, können sie mithilfe des folgenden Prozesses manuell gelöscht werden:
Befehle zur Bereinigung von Keycloak-Datenbankbackups und keycloak_group Datenbanktabellenbereinigung.
Hinweis: Eine manuelle Bereinigung von Keycloak ist manchmal nicht erforderlich.
Wir sollten die PFMP-Benutzeroberfläche verwenden, um den Anbieter zu entfernen (immer zuerst aus PFMP), und dann mit der /auth/-URL bestätigen, dass er aus dem Keycloak gelöscht wurde.
So überprüfen Sie die LDAP-Gruppenanzahl in Keycloak von einem beliebigen MVM:
# Führen Sie dies aus, um die Variable zuerst zu setzen.
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;"
Dies geschieht erst nach dem ersten Entfernen in der PFMP-Benutzeroberfläche und nur, wenn die Anbieterdaten im Back-End verbleiben. Wenn Sie PFxM 4.6.0.1 verwenden, können Sie auch die folgende Methode anwenden, um importierte Nutzer in der Keycloak-Benutzeroberfläche zu entfernen:
- Melden Sie sich mit /auth/ als Keycloak-Nutzer an
- Das Keycloak-Kennwort ist für jede Installation eindeutig und kann auf jedem MVM gefunden werden:
kubectl get secret -n powerflex keycloak-admin-credentials -o jsonpath="{.data.password}" | base64 --decode; echo
3. User federation -> LDAP -> Settings und wählen Sie in der Drop-down-Liste "Actions" oben rechts die Option Remove Imported aus.

Nachdem die Gruppen und Verzeichnisanbieter bereinigt und entfernt wurden, starten Sie die drei MVM-Nodes neu.
-Anmerkung: Dies ist nur erforderlich, wenn die Umgebung groß ist und sich LDAP-Abfragen wiederholt stapeln, wie in diesem Fall in den folgenden Protokollen zu sehen.
- Wenn die Umgebung nicht mit Synchronisierungsproblemen überlastet ist und die Benutzeroberfläche stabil ist, können die MVM-Neustarts in der Regel übersprungen werden. Im Allgemeinen ist es jedoch eine gute Maßnahme.
KB-https://www.dell.com/support/kbdoc/en-us/000225550 neu starten
MVM Graceful Reboot (muss jeweils nur für einen Node ausgeführt werden) Wechseln Sie erst zum nächsten Node, wenn Sie überprüft haben, dass die Datenbank Sync Standby meldet.
#As Best Practice sollten Sie den Node identifizieren, der der aktuelle Postgres-Marktführer ist, und diesen zuletzt neu starten.
#Run den folgenden Befehl auf einem beliebigen MVM, um den Datenbankstatus und die zugehörigen Datenbanknamen aufzulisten.
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 diesen Befehl aus, um zu ermitteln, welcher MVM-Node den Postgres-Datenbank-Pod hostet.
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 das MVM, das die Postgres-Leader-Pod-Instanz ist. Führen Sie "watch kubectl get nodes" aus, um den Status Ihrer Neustarts zu überwachen. Dieser MVM muss der letzte Node sein, der neu gestartet wird.
#Beispiel-Neustartreihenfolge, wenn pfmp-mgmt-1 der Postgres-Leader ist. Passen Sie die Reihenfolge der folgenden Befehle an, je nachdem, welcher MVM der Postgres-Leader ist.
Öffnen Sie ein Terminal, das mit dem dritten MVM verbunden ist, und führen Sie die ersten beiden Befehle aus.
kubectl label
node pfmp-mgmt-3 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-3 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When der Node nach dem Neustart wieder hochgefahren wird. Führen Sie den folgenden Befehl aus.
kubectl uncordon pfmp-mgmt-3 ; kubectl label node pfmp-mgmt-3 cmo.maintenance.mode-
#Run den folgenden Befehl aus, bis die mit MVM3 verknüpfte Datenbank den Sync-Stand-by-Modus meldet. An diesem Punkt können Sie zum nächsten MVM wechseln.
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'
Öffnen Sie ein Terminal, das mit dem zweiten MVM verbunden ist, und führen Sie die ersten beiden Befehle aus.
kubectl label node pfmp-mgmt-2 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-2 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When der Node nach dem Neustart wieder hochgefahren wird. Führen Sie den folgenden Befehl aus.
kubectl uncordon pfmp-mgmt-2 ; kubectl label node pfmp-mgmt-2 cmo.maintenance.mode-
#Run den folgenden Befehl aus, bis die mit MVM2 verknüpfte Datenbank den Sync-Stand-by-Modus meldet. An diesem Punkt können Sie zum nächsten MVM wechseln.
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 Sie den folgenden Befehl, um diesen MVM als Node-Status-Monitoring-MVM zu verwenden.
'watch kubectl get nodes'
Navigieren Sie zu dem Terminal, das mit dem ersten MVM verbunden ist, auf dem "watch kubectl get nodes" ausgeführt wird. Drücken Sie Strg+C, um zum Terminal zurückzukehren und die ersten beiden Befehle auszuführen.
kubectl label
node pfmp-mgmt-1 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-1 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When der Node nach dem Neustart wieder hochgefahren wird. Führen Sie den folgenden Befehl aus.
kubectl uncordon pfmp-mgmt-1 ; kubectl label node pfmp-mgmt-1 cmo.maintenance.mode-
#Run den folgenden Befehl, bis die mit MVM1 verknüpfte Datenbank Sync Standby meldet. Dieser MVM war der Leader, aber ein neuer Leader würde übernehmen, sobald MVM1 entladen wurde.
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'
ENDE DES MVM-VERFAHRENS FÜR EINEN ORDNUNGSGEMÄSSEN NEUSTART
Melden Sie sich nach dem Neustart und der Wiederherstellung der Benutzeroberfläche für PFMP als Administrator an und fügen Sie Einstellungen –> Verzeichnisanbieter mithilfe der folgenden Schritte hinzu:
3. Neuerstellung des LDAP-Anbieters
Wie im Abschnitt Vorbereitung erwähnt, sollten die LDAP-Ports 3268 (plain) und 3269 (SSL) des globalen Katalogs (GC) verwendet werden, wenn untergeordnete AD-Domains oder AD-Domain-Vertrauenskonten in den Gruppen vorhanden sind, die Sie in PFMP verwenden möchten.
Zum Beispiel.
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. Anwendung für engen LDAP-Nutzer- und -Gruppenbereich
Melden Sie sich mit /auth/ als Keycloak-Nutzer an
Nutzerfilter:
# Der Nutzer-LDAP-Filter fehlt in der PFMP-Benutzeroberfläche, daher müssen wir Folgendes verwenden, um dies zu ändern.
#This Filter muss im Keycloak-PowerFlex-Bereich (PowerFlex –> User Federation –> User LDAP filter) angewendet werden.
Nutzer-LDAP-Filter:
(&(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)))
Speichern Sie die Änderung.
Erläuterung dieses eingegrenzten Filters:
objectCategory entspricht Person.
und
sAMAccountName existiert
und
memberOf equals CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Oder
memberOf equals CN=FLEX-STOR-MON,OU=15G,OU=FLEXLAB,DC=powerflex,DC=lab,DC=dell,DC=com
Von <https://ldap-builder.powerflex.lab.dell.com/>
User federation -> LDAP -> Settings und wählen Sie in der oberen rechten Drop-down-Liste Actions die Option remove import aus.

4.6.x+ UI-Methode zum Löschen einer Gruppenzuordnung.

In der Einstellung für die LDAP-Gruppenzuordnung für das LDAP-Attribut des Mitgliedschaftsnutzers müssen wir außerdem sicherstellen, dass ein korrekter Wert, den wir als "cn" liefern und in der PFMP-Benutzeroberfläche nicht ändern können, in der Keycloak-Benutzeroberfläche in DN geändert wird.

Im Gruppen-LDAP-Filter können wir einen Entweder-Oder-Operator | und die KNs jeder Gruppe, z.
(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=CN=PRV_US_SA_SRV_SVS))