Configuración de LDAP de PowerFlex 4.x para entornos grandes
Summary: Mediante la reducción de los filtros de búsqueda LDAP de usuario y grupo mediante el back-end de SSO de la plataforma de administración de PowerFlex, podemos mitigar los problemas de sincronización que se ha observado que causan varios problemas de la interfaz de usuario y la plataforma. ...
Instructions
- Preparación
- Eliminación y limpieza de proveedores de LDAP
- Reconstrucción del proveedor de LDAP
- Aplicación de alcance reducido de usuarios y grupos de LDAP
Antecedentes:
De manera predeterminada, los proveedores de directorios de PowerFlex Management Platform (PFMP) importan todos los objetos LDAP dentro del alcance de búsqueda configurado, incluidas las cuentas que no son de usuario y otros objetos no requeridos por nuestro RBAC.
En entornos grandes, este comportamiento puede dar lugar a una utilización significativa de recursos en las VM de administración de PFMP (MVM), la base de datos Postgres compatible y la plataforma general.
Por lo tanto, es posible que la sincronización de LDAP no se complete dentro de los plazos aceptables, lo que provoca trabajos pendientes, pérdidas de memoria y problemas de simultaneidad.
1. Preparación
Requisitos:
- Catálogo global
- Búsqueda del DN de los grupos de AD para PFMP
- Requisitos de usuario de vinculación
- Requisitos generales de LDAP de PFMP
Uso del catálogo global de Active Directory
Nota: Se requiere el uso del puerto 3268 para LDAP estándar o 3269 para LDAPS en entornos AD. Esto permite que los miembros de grupos de LDAP de dominios secundarios u otros dominios de confianza se puedan utilizar en PFMP.
Un grupo de AD, por ejemplo:

El dominio secundario anterior na.powerflex.lab.dell.com debe ser visible para Keycloak, de federación de usuarios LDAP de PFMP, utilizando los puertos de catálogo global que permiten su acceso.
Esta es también la razón por la que se utiliza objectGUID en el proveedor de directorios PFMP, ya que vincula las cuentas a su UUID único global.
Si ambos dominios secundarios se enumeran en la pestaña Confianzas, parece que los subdominios confían entre sí de manera predeterminada.
En un entorno de Microsoft Active Directory (AD), un dominio primario y sus (sub)dominios secundarios confían inherentemente entre sí en una estructura jerárquica. Esto se conoce como confianza transitiva.
De forma predeterminada, estas confianzas son bidireccionales y transitivas, lo que significa que un dominio primario confía en sus dominios secundarios y viceversa. Esta naturaleza transitiva extiende la confianza a todos los dominios dentro de la jerarquía de elementos primarios y secundarios.
Búsqueda de servidores LDAP o AD GC disponibles a partir de entradas de DNS
Por lo general, el cliente proporciona la dirección LDAP que se utilizará. Estos ajustes se pueden copiar de la configuración del proveedor de directorio PFMP antes de eliminarlo como parte de los próximos pasos de esta guía.
Como alternativa, los servidores disponibles se pueden recuperar desde DNS para un dominio específico:
# 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.
Cómo encontrar el nombre distinguido de una unidad organizativa o grupo.
En primer lugar, vamos a necesitar los nombres distintivos (DN) de las unidades organizativas y los grupos en los que queremos leer a los usuarios en PFMP. Estas rutas no siguen estrictamente la asignación de nombres DNS y contienen unidades organizativas dentro de una ruta LDAP x.500 que podemos extraer manualmente.
Podemos encontrar estos DNs usando diferentes utilidades dependiendo del sistema operativo, una forma fácil es usar curl:
Cómo probar la configuración de LDAP de PFMP mediante la utilidad curl en Linux.
Las versiones más recientes de curl que se instalan en los MVM se pueden usar para encontrar los nombres distinguidos completos que necesita, por ejemplo, esto busca el DN completo del LabAdmins Group 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
Busque todos los miembros de un grupo de LDAP mediante propiedades de filtro que, a continuación, puede colocar en el back-end de 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
Cómo probar la configuración de LDAP de PFMP mediante la utilidad ldapsearch o curl en Linux.
Si hay un host Linux disponible en la red, el uso de la utilidad ldapsearch podría ser útil para probar y validar los ajustes de LDAP utilizados en PFMP/Keycloak.
Como alternativa, curl también se puede usar para consultas de LDAP desde una de las VM/MVM de administración.
Introducción rápida (opciones más utilizadas):
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
Comprobación/instalación de la herramienta:
$ which ldapsearch
/usr/bin/ldapsearch
#RHEL/CentOS install
sudo yum install openldap-clients
# SLES install
sudo zypper install openldap2-client
Definición del DN base (-b) a partir de la entrada raíz de 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 entrada raíz proporciona información sobre el servidor de directorio. En AD, el atributo rootDomainNamingContext proporciona el DN base superior que se puede usar para la búsqueda.
-W -b "
Prueba del URI de LDAP, el DN de enlace (usuario/contraseña con acceso de lectura) y los ajustes de búsqueda de usuarios:
$ 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)"
En este ejemplo, estamos consultando LDAP para una cuenta de usuario existente mediante el atributo sAMAccountName (la salida se truncó para mostrar solo los atributos que necesitamos).
Ajustes correspondientes en la interfaz de usuario de PFMP:
Dirección (-H): ldap://active.directory.domain.address.com:3268
DN de enlace (-D): "CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com" # ("FLEXLAB\ck3-user" o "ck3-user@powerflex.lab.dell.com" son equivalentes)
(-x es necesario para una autenticación simple a fin de evitar el modo SASL predeterminado)
Bind DN Password (-W): solicite la contraseña (o use –w '***' para proporcionarla en el comando)
The output of the command validates the following PFMP User Search Settings:
Username LDAP Attribute: sAMAccountName
Atributo de ID: objectGUID
Clase de objeto: person
Ruta de búsqueda (-b): "DC = PowerFlex, DC = Lab, DC = Dell, DC = com"
Prueba de la configuración de búsqueda de grupo:
$ 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 del grupo de prueba:
$ 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)))"
Probando el filtro LDAP del usuario:
$ 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
Inicie Usuarios y equipos de Active Directory. Haga clic en Ver y seleccione Funciones avanzadas.
El DN es el nombre que identifica de manera exclusiva una entrada en el directorio. El primer componente del DN se conoce como el nombre distintivo relativo (RDN).
Un DN se compone de pares attribute=value, separados por comas, por ejemplo:
CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Piense en ellos como "FQDN para LDAP", la dirección x500 completa "URL".
Los usuarios y computadoras de AD se pueden utilizar para determinar los DN y otros atributos:

Desplácese y haga clic con el botón secundario en la unidad organizativa en la que desea leer a los usuarios y, a continuación, seleccione Propiedades.

En OU Properties, seleccione la pestaña Attribute Editor.
Haga clic en distinguishedName para resaltarlo y, luego, haga clic en Ver.
Haga clic con el botón secundario en el valor resaltado y seleccione Copiar.
Haga clic en Cancelar y, a continuación, en Aceptar para cerrar las ventanas Editor de atributos y Propiedades de unidad organizativa.

Ejemplo de filtro de usuario de LDAP de alcance restringido:
(&(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)))
Explicación visual:

Requisitos de usuario de vinculación.
Este usuario de vinculación debe tener, al menos, permiso para consultar usuarios y grupos definidos en el servidor LDAP para permitir que el sistema de almacenamiento autentique a estos usuarios.
De manera predeterminada, cuando se agrega un usuario a la pestaña de seguridad del dominio de nivel superior en Usuarios y equipos de Active Directory, se le proporcionan los requisitos de solo lectura predeterminados necesarios para la autenticación de LDAP en PFMP. p ej.



FYI: No necesitamos que nuestro usuario de enlace de LDAP esté realmente "en" los grupos de AD que debemos leer en el directorio, necesitamos los permisos de la pestaña Seguridad de "Lectura".

Requisitos generales del proveedor de LDAP de PFMP
Dirección: ldaps://ad.ldap.domain:3269 (SSL) O ldap://ad.ldap.domain:3268 (SIN FORMATO)
DN de enlace: ADNTDOMAIN\serviceaccount o el nombre distintivo de Bind DN.
Contraseña de DN de enlace: contraseña de la cuenta de servicio
Timeout 30000
Username LDAP attribute: sAMAccountName
Atributo de ID: objectGUID
Object Class: Person
Ruta de búsqueda: (El nivel más alto que puede consultar todos los grupos, por ejemplo, solo los componentes de dominio/DC: DC = powerflex, DC = lab, DC = dell, DC = com)
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
Ruta de búsqueda de grupo:( igual que la ruta de búsqueda del usuario o más granular si es necesario. Dado que utilizaremos un filtro estrecho, nuestro alcance puede ser amplio sin afectar el rendimiento).
#The siguiente entrada proporciona al menos un grupo para el filtro de grupo LDAP (PFMP 4.6.x+), de modo que keycloak no busque todos los grupos de todo el directorio:
Group LDAP Filter: (CN=GROUP1)
#Given la limitación de 64 caracteres en este campo solo para la interfaz de usuario de PFMP, debemos usar keycloak para evitarlo si queremos agregar más que eso, por ejemplo, 3 grupos diferentes:
Group LDAP Filter: (|(CN=GROUP1)(CN=GROUP2)(CN=GROUP3))
Pruebe la conexión y, si se realiza correctamente, haga clic en Enviar.
P ej.

2. Eliminación y limpieza de proveedores de LDAP
Elimine los usuarios de LDAP, los grupos y, a continuación, el proveedor de directorio de la interfaz de usuario de PFMP como usuario administrador. No intente hacer esto como usuario de LDAP, solo como administrador.
PRECAUCIÓN: Asegúrese de registrar la configuración actual para la asignación de "Proveedor de directorio" y "Usuarios remotos/Grupos" desde PFMP (en particular si necesita restaurar la asignación de funciones anterior).
Si la asignación de grupo/función no se muestra en PFMP (problema conocido), utilice las siguientes instrucciones:
# 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 algún grupo de LDAP obsoleto permanece en la base de datos keycloak, se puede eliminar manualmente mediante el siguiente proceso:
Comandos de respaldo y limpieza de tabla de base de datos de keycloak_group Keycloak.
Nota: En ocasiones, no es necesario limpiar manualmente keycloak.
Debemos usar la interfaz de usuario de PFMP para eliminar el proveedor (siempre desde PFMP primero) y, a continuación, confirmar que se haya borrado de keycloak mediante la URL /auth/.
Cómo comprobar el conteo de grupos de LDAP en keycloak desde cualquier MVM:
# Ejecute esto para establecer la variable primero.
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;"
Esto es solo después de la primera eliminación en la interfaz de usuario de PFMP y solo si los datos del proveedor permanecen en el back-end. Si utiliza PFxM 4.6.0.1, también puede realizar el siguiente método para eliminar usuarios importados en la interfaz de usuario de Keycloak:
- Inicie sesión con /auth/ como usuario keycloak
- La contraseña de Keycloak es única para cada instalación y se puede encontrar en cualquier MVM mediante:
kubectl get secret -n powerflex keycloak-admin-credentials -o jsonpath="{.data.password}" | base64 --decode; echo
3. Federación de usuarios:> LDAP -> Configuración y, en el menú desplegable Acciones superior derecho, seleccione Quitar importado.

Después de que los grupos y los proveedores de directorios se hayan limpiado y eliminado, reinicie los tres nodos MVM.
-Nota: Esto solo es necesario cuando el entorno es grande y las consultas de LDAP se apilan repetidamente, como se muestra en este caso en los siguientes registros.
- Si el entorno no está sobrecargado con problemas de sincronización y la interfaz de usuario es estable, los reinicios de MVM generalmente se pueden omitir. Sin embargo, es una buena medida en general.
Reiniciar KB https://www.dell.com/support/kbdoc/en-us/000225550
Reinicio ordenado de MVM (se debe ejecutar un nodo a la vez) No pase al siguiente nodo hasta que verifique que la base de datos esté informando el modo de espera de sincronización.
#As práctica recomendada, identifique el nodo que es el líder actual de Postgres y reinicie este último.
#Run el siguiente comando en cualquier MVM para enumerar el estado de la base de datos y los nombres de base de datos asociados.
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 este comando para identificar qué nodo MVM aloja el pod de base de datos de 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 el MVM que es la instancia del pod líder de Postgres. Ejecute "watch kubectl get nodes" para monitorear el estado de los reinicios. Este MVM debe ser el último nodo que se reiniciará.
#Ejemplo de orden de reinicio si pfmp-mgmt-1 es el líder de Postgres. Ajuste el orden de los siguientes comandos según qué MVM sea el líder de Postgres.
Abra un terminal conectado al tercer MVM y ejecute los dos primeros comandos.
kubectl label
node pfmp-mgmt-3 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-3 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When el nodo se enciende tras el reinicio. Ejecute el siguiente comando.
kubectl uncordon pfmp-mgmt-3 ; kubectl label node pfmp-mgmt-3 cmo.maintenance.mode-
#Run el siguiente comando hasta que la base de datos asociada con MVM3 informe el modo de espera síncrono. En ese momento, puede pasar al siguiente MVM.
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'
Abra un terminal conectado al segundo MVM y ejecute los dos primeros comandos.
kubectl label node pfmp-mgmt-2 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-2 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When el nodo se enciende tras el reinicio. Ejecute el siguiente comando.
kubectl uncordon pfmp-mgmt-2 ; kubectl label node pfmp-mgmt-2 cmo.maintenance.mode-
#Run el siguiente comando hasta que la base de datos asociada con MVM2 informe el modo de espera síncrono. En ese momento, puede pasar al siguiente MVM.
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 el siguiente comando para usar este MVM como MVM de monitoreo del estado del nodo.
'watch kubectl get nodes'
Vaya al terminal conectado al primer MVM que esté ejecutando 'watch kubectl get nodes'. Presione Ctrl+c para volver al terminal y ejecute los dos primeros comandos.
kubectl label
node pfmp-mgmt-1 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-1 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When el nodo se enciende tras el reinicio. Ejecute el siguiente comando.
kubectl uncordon pfmp-mgmt-1 ; kubectl label node pfmp-mgmt-1 cmo.maintenance.mode-
#Run el siguiente comando hasta que la base de datos asociada con MVM1 informe el modo de espera síncrono. Este MVM era el líder, pero un nuevo líder tomaría el relevo cuando MVM1 fuera drenado.
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 DEL PROCEDIMIENTO DE REINICIO ORDENADO DE MVM
Una vez que se reinicie y se restaure la interfaz de usuario para PFMP, inicie sesión como administrador y agregue Settings -> Directory Provider mediante los pasos que se indican a continuación:
3. Reconstrucción del proveedor de LDAP
Como se mencionó en la sección de preparación, si hay dominios de AD secundarios o cuentas de confianza de dominio de AD en cualquier grupo que vaya a utilizar en PFMP, se deben utilizar los puertos LDAP 3268 (simple) y 3269 (SSL) del catálogo global (GC).
P ej.
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. Aplicación de alcance reducido de usuarios y grupos de LDAP
Inicie sesión con /auth/ como usuario keycloak
Filtro de usuario:
# Falta el filtro LDAP del usuario en la interfaz de usuario de PFMP, por lo que debemos usar lo siguiente para cambiarlo.
#This filtro se debe aplicar en el dominio Keycloak PowerFlex (PowerFlex --> User federation --> User LDAP filter)
Filtro LDAP del usuario:
(&(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)))
Guarde el cambio.
Explicación de este filtro reducido:
objectCategory es igual a Person.
Y
sAMAccountName existe
Y
memberOf es igual a CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
O bien,
memberOf es igual a CN=FLEX-STOR-MON,OU=15G,OU=FLEXLAB,DC=powerflex,DC=lab,DC=dell,DC=com
Desde <https://ldap-builder.powerflex.lab.dell.com/>
Federación de usuarios:> LDAP -> Configuración y, en el menú desplegable Acciones superior derecho, seleccione Quitar importado.

Interfaz de usuario de 4.6.x+ Método para eliminar la asignación de grupos.

En la configuración de asignación de grupos LDAP para "Membership User LDAP Attribute", también debemos asegurarnos de que el valor correcto que enviamos como "cn" y que no se puede cambiar en la interfaz de usuario de PFMP se cambie en la interfaz de usuario de keycloak a DN.

En el filtro LDAP del grupo, podemos enumerar un operador o bien | y las NC de cada grupo, p. ej.
(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=CN=PRV_US_SA_SRV_SVS))