Configurazione LDAP di PowerFlex 4.x per ambienti di grandi dimensioni
Summary: Restringendo i filtri di ricerca LDAP di utenti e gruppi utilizzando il back-end SSO della piattaforma di gestione PowerFlex, è possibile mitigare i problemi di sincronizzazione che sono stati osservati come causa di diversi problemi dell'interfaccia utente e della piattaforma. ...
Instructions
- Preparazione
- Rimozione e pulizia del provider LDAP
- Ricostruzione del provider LDAP
- Applicazione restringente dell'ambito di utenti e gruppi LDAP
Informazioni preliminari:
Per impostazione predefinita, i provider di directory della PowerFlex Management Platform (PFMP) importano tutti gli oggetti LDAP all'interno dell'ambito di ricerca configurato, inclusi gli account non utente e altri oggetti non richiesti dal nostro RBAC.
In ambienti di grandi dimensioni, questo comportamento può comportare un utilizzo significativo delle risorse tra le VM di gestione PFMP (MVM), il database Postgres di supporto e la piattaforma complessiva.
Pertanto, la sincronizzazione LDAP potrebbe non essere completata entro intervalli di tempo accettabili, causando backlog dei processi, perdite di memoria e problemi di simultaneità.
1. Preparazione
Requisiti:
- Catalogo globale
- Ricerca del DN dei gruppi AD per PFMP
- Requisiti degli utenti di Bind
- Requisiti generali di LDAP PFMP
Utilizzo del catalogo globale di Active Directory
Nota: È richiesto l'utilizzo della porta 3268 per LDAP standard o 3269 per LDAPS in ambienti AD. Ciò consente ai membri del gruppo LDAP di domini figlio o di altri domini trusted di essere utilizzabili in PFMP.
Un gruppo AD, ad esempio:

Il dominio figlio di cui sopra na.powerflex.lab.dell.com deve essere visibile da PFMP LDAP User Federation Keycloak utilizzando le porte del catalogo globale che consentono di raggiungerli.
Questo è anche il motivo per cui usiamo objectGUID nel provider di directory PFMP, collega gli account al relativo UUID univoco globale.
Se entrambi i domini figlio sono elencati nella scheda Trust, sembra che i sottodomini si considerino reciprocamente affidabili per impostazione predefinita.
In un'ambiente Microsoft Active Directory (AD), un dominio padre e i relativi domini figli (sotto)domini si fidano intrinsecamente l'uno dell'altro in una struttura gerarchica. Questo è noto come trust transitivo.
Per impostazione predefinita, questi trust sono bidirezionali e transitivi, il che significa che un dominio padre considera attendibili i relativi domini figlio e viceversa. Questa natura transitiva estende l'attendibilità a tutti i domini all'interno della gerarchia padre-figlio.
Ricerca dei server LDAP o AD GC disponibili dalle voci DNS
In genere è il cliente a fornire l'indirizzo LDAP da utilizzare. Queste impostazioni possono essere copiate dalla configurazione del provider di directory PFMP prima di rimuoverla nei passaggi successivi di questa guida.
In alternativa, è possibile recuperare i server disponibili dal DNS per un dominio specifico:
# 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.
Come trovare il distinguishedName di un'unità organizzativa o di un gruppo.
Innanzitutto, sono necessari i nomi distinti (DN) delle unità organizzative e dei gruppi in cui si desidera leggere gli utenti in PFMP. Questi percorsi non seguono rigorosamente la denominazione DNS e contengono unità organizzative all'interno di un percorso LDAP x.500 che è possibile estrarre manualmente.
Possiamo trovare questi DN utilizzando utilità diverse a seconda del sistema operativo, un modo semplice è usare curl:
Come testare le impostazioni LDAP PFMP utilizzando l'utilità curl su Linux.
Le versioni più recenti di curl installate sugli MVM possono essere utilizzate per trovare i nomi distinti completi necessari, ad esempio questa ricerca il DN completo del CN del gruppo LabAdmins:
#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
Individuare tutti i membri di un gruppo LDAP utilizzando le proprietà del filtro che è possibile inserire nel backend 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
Come testare le impostazioni LDAP PFMP utilizzando l'utilità ldapsearch o curl su Linux.
Se sulla rete è disponibile un host Linux, l'utilità ldapsearch potrebbe essere utile per testare e convalidare le impostazioni LDAP utilizzate in PFMP/Keycloak.
In alternativa, è possibile utilizzare l'utilità curl anche per le query LDAP da una delle VM/MVM di gestione.
Introduzione rapida (opzioni comunemente utilizzate):
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
Controllo/installazione dell'utensile:
$ which ldapsearch
/usr/bin/ldapsearch
#RHEL/CentOS install
sudo yum install openldap-clients
# SLES install
sudo zypper install openldap2-client
Definizione del DN di base (-b) dalla voce radice 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
La voce radice fornisce informazioni sul server di directory. In AD, l'attributo rootDomainNamingContext fornisce il DN di base superiore che può essere utilizzato per la ricerca.
-W -b "
Test dell'URI LDAP, del Bind DN (utente/password con accesso in lettura) e delle impostazioni di ricerca utente:
$ 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 questo esempio, viene eseguita una query LDAP per un account utente esistente utilizzando l'attributo sAMAccountName (l'output è stato troncato per mostrare solo gli attributi necessari).
Impostazioni corrispondenti nell'interfaccia utente PFMP:
Indirizzo (-H): ldap://active.directory.domain.address.com:3268
DN di binding (-D): "CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com" # ("FLEXLAB\ck3-user" o "ck3-user@powerflex.lab.dell.com" sono equivalenti)
(-x è necessario per l'autenticazione semplice per evitare la modalità SASL predefinita)
Bind DN Password (-W): richiede la password (o usa –w '***' per fornirla nel comando)
The output of the command validates the following PFMP User Search Settings:
Username LDAP Attribute: sAMAccountName
Attributo ID: objectGUID
Classe dell'Oggetto: person
Percorso di ricerca (-b): "dc=powerflex,dc=lab,dc=dell,dc=com"
Impostazioni di ricerca gruppo di test:
$ 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"
Filtro LDAP gruppo di test:
$ 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 del filtro LDAP utente:
$ 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
Avviare Utenti e computer Active Directory. Cliccare su View e selezionare Advanced Features.
Il DN è il nome che identifica in modo univoco una voce nella directory. Il primo componente del DN viene definito RDN (Relative Distinguished Name).
Un DN è costituito da coppie attributo=valore, separate da virgole, ad esempio:
CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Immaginali come "FQDN per LDAP", l'URL completo dell'indirizzo x500.
Gli utenti e i computer AD possono essere utilizzati per determinare i DN e altri attributi:

Spostarsi e cliccare con il pulsante destro del mouse sull'unità organizzativa in cui si desidera leggere gli utenti, quindi scegliere Proprietà.

In Proprietà unità organizzativa, selezionare la scheda Editor attributi.
Cliccare su distinguishedName per evidenziarlo, quindi cliccare su View.
Cliccare con il pulsante destro del mouse sul valore evidenziato e selezionare Copy.
Cliccare su Annulla e quindi su OK per chiudere le finestre Editor attributi e Proprietà unità organizzativa.

Esempio di filtro utente LDAP con ambito ristretto:
(&(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)))
Spiegazione visiva:

Bind Requisiti degli utenti.
Questo utente di binding deve disporre almeno dell'autorizzazione per eseguire query su utenti e gruppi definiti nel server LDAP per consentire al sistema di storage di autenticare questi utenti.
Per impostazione predefinita, quando un utente viene aggiunto alla scheda Protezione del dominio di primo livello in Utenti e computer di Active Directory, gli vengono forniti i requisiti di sola lettura predefiniti necessari per l'autenticazione LDAP in PFMP. ad es.



FYI: Non è necessario che l'utente di binding LDAP si trovi effettivamente nei gruppi AD, ma è necessario leggere nella directory, ma sono necessarie le autorizzazioni della scheda Security di "Read".

Requisiti generali del provider LDAP PFMP
Indirizzo: ldaps://ad.ldap.domain:3269 (SSL) O ldap://ad.ldap.domain:3268 (NORMALE)
DN binding: Nome distinto ADNTDOMAIN\serviceaccount o Bind DN.
Bind DN Password: password dell'account di servizio
Timeout 30000
Username LDAP attribute: sAMAccountName
Attributo ID: objectGUID
Object Class: Person
Percorso di ricerca: (livello più alto in grado di eseguire query su tutti i gruppi, ad esempio solo sui componenti di dominio/DC: DC=powerflex,DC=lab,DC=dell,DC=com)
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
Group Search Path:( uguale al percorso di ricerca dell'utente o più granulare se necessario. Poiché utilizzeremo un filtro ristretto, il nostro ambito può essere ampio senza alcun impatto sulle prestazioni.)
#The seguente voce fornisce almeno un gruppo al filtro Gruppo LDAP (PFMP 4.6.x+), in modo che Keycloak non cerchi tutti i gruppi dall'intera directory:
Group LDAP Filter: (CN=GROUP1)
#Given la limitazione di 64 caratteri in questo campo solo per l'interfaccia utente PFMP, dobbiamo usare il keycloak per aggirarla se vogliamo aggiungere altro, ad esempio 3 gruppi diversi:
Group LDAP Filter: (|(CN=GROUP1)(CN=GROUP2)(CN=GROUP3))
Testare la connessione e, in caso di esito positivo, cliccare su Submit.
Ad es.

2. Rimozione e pulizia del provider LDAP
Rimuovere gli utenti LDAP, i gruppi e quindi il provider di directory dall'interfaccia utente PFMP come utente amministratore. Non tentare di eseguire questa operazione come utente LDAP, ma solo come amministratore.
AVVERTENZA: Assicurarsi di registrare la configurazione corrente per il mapping "Directory Provider" e "Remote Users/Groups" da PFMP (in particolare se è necessario ripristinare il mapping dei ruoli precedente).
Se il mapping di gruppi/ruoli non viene visualizzato in PFMP (problema noto), utilizzare le seguenti istruzioni:
# 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
Se nel database keycloak rimangono gruppi LDAP obsoleti, possono essere eliminati manualmente utilizzando la seguente procedura:
Comandi di backup del database Keycloak e pulizia della tabella del database keycloak_group.
Nota: A volte la pulizia manuale di Keycloak non è necessaria.
È necessario utilizzare l'interfaccia utente PFMP per rimuovere il provider (sempre da PFMP prima), quindi verificare che sia stato cancellato da keycloak utilizzando /auth/ URL.
Come controllare il conteggio dei gruppi LDAP in Keycloak da qualsiasi MVM:
# Eseguire questa operazione per impostare prima la variabile.
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;"
Ciò avviene solo dopo la prima rimozione nell'interfaccia utente di PFMP e solo se i dati del provider rimangono nel back-end. Se si utilizza PFxM 4.6.0.1, è anche possibile utilizzare il seguente metodo per rimuovere gli utenti importati nell'interfaccia utente di Keycloak:
- Accedere utilizzando /auth/ come utente Keycloak
- La password Keycloak è univoca per ogni installazione e può essere trovata su qualsiasi MVM utilizzando:
kubectl get secret -n powerflex keycloak-admin-credentials -o jsonpath="{.data.password}" | base64 --decode; echo
3. Federazione utenti -> LDAP -> Impostazioni e, nell'elenco a discesa Azioni in alto a destra, selezionare Rimuovi importato.

Dopo aver pulito e rimosso i gruppi e i provider di directory, riavviare i tre nodi MVM.
-Nota: Questa operazione è necessaria solo quando l'ambiente è di grandi dimensioni e le query LDAP si impilano ripetutamente, come illustrato in questo caso nei registri riportati di seguito.
- Se l'ambiente non è sovraccarico di problemi di sincronizzazione e l'interfaccia utente è stabile, i riavvii di MVM possono generalmente essere saltati. Si tratta comunque di una buona misura in generale.
Riavviare KB https://www.dell.com/support/kbdoc/en-us/000225550
MVM Graceful Reboot (deve essere eseguito un nodo alla volta) Non passare al nodo successivo fino a quando non si verifica che il database segnala lo standby sincrono.
#As best practice, identificare il nodo leader corrente di Postgres e riavviare questo per ultimo.
#Run il seguente comando su qualsiasi MVM per elencare lo stato del database e i nomi dei database associati.
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 questo comando per identificare il nodo MVM che ospita il pod del database 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 l'MVM che è l'istanza del pod Postgres Leader. Eseguire "watch kubectl get nodes" per monitorare lo stato dei riavvii. Questo MVM deve essere l'ultimo nodo che verrà riavviato.
#Esempio di ordine di riavvio se pfmp-mgmt-1 è il Postgres Leader. Regolare l'ordine dei comandi riportati di seguito a seconda di quale MVM è il Postgres Leader.
Aprire un terminale collegato al terzo MVM ed eseguire i primi due comandi.
kubectl label
node pfmp-mgmt-3 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-3 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When il nodo si attiva dal riavvio. Eseguire il seguente comando.
kubectl uncordon pfmp-mgmt-3 ; kubectl label node pfmp-mgmt-3 cmo.maintenance.mode-
#Run il seguente comando fino a quando il database associato a MVM3 non segnala Sync Standby. A quel punto è possibile passare all'MVM successivo.
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'
Aprire un terminale collegato al secondo MVM ed eseguire i primi due comandi.
kubectl label node pfmp-mgmt-2 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-2 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When il nodo si attiva dal riavvio. Eseguire il seguente comando.
kubectl uncordon pfmp-mgmt-2 ; kubectl label node pfmp-mgmt-2 cmo.maintenance.mode-
#Run il seguente comando fino a quando il database associato a MVM2 non segnala Sync Standby. A quel punto è possibile passare all'MVM successivo.
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 il seguente comando per utilizzare questo MVM come MVM per il monitoraggio dello stato del nodo.
'watch kubectl get nodes'
Passare al terminale connesso al primo MVM in esecuzione "watch kubectl get nodes". Premere ctrl+c per tornare al terminale ed eseguire i primi due comandi.
kubectl label
node pfmp-mgmt-1 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-1 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When il nodo si attiva dal riavvio. Eseguire il seguente comando.
kubectl uncordon pfmp-mgmt-1 ; kubectl label node pfmp-mgmt-1 cmo.maintenance.mode-
#Run il seguente comando fino a quando il database associato a MVM1 non segnala Sync Standby. Questo MVM era il leader, ma un nuovo leader avrebbe preso il sopravvento quando MVM1 fosse stato prosciugato.
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'
FINE DELLA PROCEDURA DI RIAVVIO NORMALE DI MVM
Una volta riavviato e ripristinata l'interfaccia utente per PFMP, accedere come amministratore e aggiungere Settings -> Directory Provider attenendosi alla seguente procedura:
3. Ricostruzione del provider LDAP
Come accennato nella sezione relativa alla preparazione, se sono presenti domini AD figlio o account attendibili di dominio AD in qualsiasi gruppo da utilizzare in PFMP, è necessario utilizzare le porte LDAP del catalogo globale (GC) 3268 (normale) e 3269 (SSL).
Ad es.
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. Applicazione restringente dell'ambito di utenti e gruppi LDAP
Accedere utilizzando /auth/ come utente Keycloak
Filtro utente:
# Il filtro LDAP dell'utente non è presente nell'interfaccia utente PFMP, quindi è necessario utilizzare quanto segue per modificarlo.
#This filtro deve essere applicato nell'area di autenticazione Keycloak PowerFlex (PowerFlex --> Federazione utenti --> Filtro LDAP utente)
Filtro LDAP utente:
(&(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)))
Salvare la modifica.
Spiegazione di questo filtro ristretto:
objectCategory è uguale a Person.
e
sAMAccountName esiste
e
memberOf è uguale a CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Oppure
memberOf è uguale a CN=FLEX-STOR-MON,OU=15G,OU=FLEXLAB,DC=powerflex,DC=lab,DC=dell,DC=com
A partire da <https://ldap-builder.powerflex.lab.dell.com/>
Federazione utenti -> LDAP -> Impostazioni e nell'elenco a discesa Azioni in alto a destra selezionare Rimuovi importato.

Metodo dell'interfaccia utente 4.6.x+ per eliminare il mapping dei gruppi.

Nell'impostazione LDAP Group Mapping per "Membership User LDAP Attribute", è necessario anche assicurarsi che il valore spedito sia corretto come "cn" e che non possa essere modificato nell'interfaccia utente PFMP in DN.

Nel filtro LDAP del gruppo, è possibile elencare un operatore o/o | e le NC di ciascun gruppo, ad es.
(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=CN=PRV_US_SA_SRV_SVS))