Конфигурация LDAP PowerFlex 4.x для крупных сред
Summary: Сузив фильтры поиска LDAP для пользователей и групп с помощью серверной части единого входа платформы управления PowerFlex, можно устранить проблемы с синхронизацией, которые вызывают несколько проблем с пользовательским интерфейсом и платформой. ...
Instructions
- Подготовка
- Удаление и очистка поставщика LDAP
- Перестроение поставщика LDAP
- Приложение с узкой областью действия пользователя и группы LDAP
Предпосылка.
По умолчанию поставщики каталогов платформы управления PowerFlex (PFMP) импортируют все объекты LDAP в пределах настроенной области поиска, включая учетные записи, не являющиеся пользователями, и другие объекты, не требуемые нашим RBAC.
В крупных средах такое поведение может привести к значительному использованию ресурсов виртуальных машин управления PFMP (MVM), поддерживающей базы данных Postgres и всей платформы.
Таким образом, синхронизация LDAP может не завершиться в допустимые сроки, что приведет к появлению невыполненных заданий, утечкам памяти и проблемам параллелизма.
1. Подготовка
Требования:
- Глобальный каталог
- Поиск DN групп AD для PFMP
- Привязка требований к пользователю
- Общие требования к LDAP PFMP
Использование глобального каталога Active Directory
Примечание. Требуется использовать порт 3268 для стандартного LDAP или 3269 для LDAPS в средах AD. Это позволяет членам группы LDAP из дочерних доменов или других доверенных доменов использовать в PFMP.
Например, группа AD:

Дочерний домен, указанный выше na.powerflex.lab.dell.com, должен быть виден Keycloak федерации пользователей LDAP PFMP с помощью портов глобального каталога, позволяющих к ним доступ.
По этой же причине мы используем objectGUID в поставщике каталогов PFMP, он связывает учетные записи с их глобальным уникальным UUID.
Если оба дочерних домена перечислены на вкладке Trusts, то, похоже, что поддомены доверяют друг другу по умолчанию.
В среде Microsoft Active Directory (AD) родительский домен и его дочерние (поддомены) по своей природе доверяют друг другу в иерархической структуре. Это называется транзитивным доверием.
По умолчанию эти отношения доверия являются двусторонними и транзитивными, то есть родительский домен доверяет своим дочерним доменам и наоборот. Этот транзитивный характер распространяет доверие на все домены в иерархии «родители-потомки».
Поиск доступных серверов LDAP или AD GC по записям DNS
Обычно заказчик предоставляет адрес LDAP для использования. Эти параметры можно скопировать из конфигурации поставщика каталогов PFMP перед ее удалением в рамках выполнения последующих действий данного руководства.
Кроме того, доступные серверы могут быть получены из DNS для определенного домена:
# 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.
Как найти отличительное имя подразделения или группы.
Во-первых, нам понадобятся различающиеся имена (DN) подразделений и групп, в которых мы хотим считывать пользователей в PFMP. Эти пути не строго следуют именованию DNS и содержат подразделения внутри пути LDAP x.500, которые можно извлечь вручную.
Мы можем найти эти DN с помощью различных утилит в зависимости от ОС, одним из простых способов является использование curl:
Проверка параметров LDAP PFMP с помощью утилиты curl в Linux.
Более новые версии curl, которые установлены на MVM, могут быть использованы для поиска полных различающихся имен, которые вам нужны, например, здесь выполняется поиск полного DN CN группы 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
Найдите всех членов группы LDAP с помощью свойств фильтра, которые затем можно поместить в бэкенд 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
Как проверить настройки LDAP PFMP с помощью ldapsearch или утилиты curl в Linux.
Если в сети доступен хост linux, можно воспользоваться утилитой ldapsearch для тестирования и валидации параметров LDAP, используемых в PFMP/Keycloak.
Кроме того, утилиту curl можно использовать для запросов LDAP с одной из виртуальных машин/MVM управления.
Краткое введение (часто используемые параметры):
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
Проверка и установка инструмента
$ which ldapsearch
/usr/bin/ldapsearch
#RHEL/CentOS install
sudo yum install openldap-clients
# SLES install
sudo zypper install openldap2-client
Определение базового DN (-b) из корневой записи 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
Корневая запись содержит сведения о сервере каталогов. В AD атрибут rootDomainNamingContext указывает верхнее базовое отличительное имя, которое можно использовать для поиска.
-W -b "
Тестирование URI LDAP, различающегося имени привязки (имя пользователя/пароля с доступом на чтение) и параметров поиска пользователей:
$ 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)"
В этом примере мы запрашиваем у LDAP существующую учетную запись пользователя с помощью атрибута sAMAccountName (выходные данные были усечены, чтобы отображались только необходимые атрибуты).
Соответствующие настройки в пользовательском интерфейсе PFMP:
Адрес (-H): ldap://active.directory.domain.address.com:3268
Привязать DN (-D): "CN=ck3-user,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com" # ("FLEXLAB\ck3-user" или "ck3-user@powerflex.lab.dell.com" эквивалентны)
(-x требуется для простой аутентификации, чтобы избежать режима SASL по умолчанию)
Привязать пароль DN ( -W): запрос пароля (или используйте –w '***' , чтобы ввести его в команду)
The output of the command validates the following PFMP User Search Settings:
Username LDAP Attribute: sAMAccountName
Атрибутидентификатора: objectGUID
Класс объекта: person
Путь поиска (-b): «DC = PowerFlex, DC = лаборатория, DC = Dell, DC = COM»
Настройки поиска в группе тестирования:
$ 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 тестируемой группы:
$ 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)))"
Тестирование фильтра 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" \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
Запустите Active Directory Пользователи и компьютеры. Нажмите «Вид» и выберите «Дополнительные функции».
DN — это имя, которое уникально идентифицирует запись в каталоге. Первый компонент отличительного имени называется относительным отличительным именем (RDN).
DN состоит из пар attribute=значение, разделенных запятыми, например:
CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Думайте о них как о «FQDN для LDAP», полный «URL» адреса x500.
Пользователи и компьютеры AD могут использоваться для определения отличительных имен и других атрибутов:

Перейдите к подразделению, в котором нужно прочитать пользователей, и нажмите его правой кнопкой мыши, затем выберите Свойства.

В окне «Свойства подразделения» выберите вкладку Редактор атрибутов.
Щелкните differentedName, чтобы выделить его, затем нажмите View.
Нажмите правой кнопкой мыши на выделенное значение и выберите Копировать.
Нажмите кнопку Отмена, а затем кнопку ОК, чтобы закрыть окна Редактор атрибутов и Свойства подразделений.

Пример фильтра пользователей LDAP с узкой областью действия:
(&(objectCategory=Person)(sAMAccountName=*)(|( memberOf=CN=FLEXLAB-APP-PROD-SDS-Admin,CN=Пользователи,DC=powerflex,DC=lab,DC=dell,DC=com)(memberOf=CN=LabAdmins,CN=Users,DC=powerflex,DC=lab,DC=dell,DC=com)))
Наглядное пояснение:

Привязка требований пользователей.
Этот пользователь привязки должен по крайней мере иметь разрешение на запрос пользователей и групп, определенных на сервере LDAP, чтобы разрешить системе хранения проводить аутентификацию этих пользователей.
По умолчанию при добавлении пользователя на вкладку безопасности домена верхнего уровня в разделе «Пользователи и компьютеры Active Directory» для него устанавливаются требования только для чтения по умолчанию, необходимые для аутентификации LDAP в PFMP. например.



К сведению: Нам не нужно, чтобы пользователь привязки LDAP фактически находился в группах AD, которые мы должны прочитать в каталоге, нам нужны разрешения на вкладке «Security» «Read».

Общие требования к поставщику LDAP PFMP
Адрес: ldaps://ad.ldap.domain:3269 (SSL) ИЛИ ldap://ad.ldap.domain:3268 (ОБЫЧНЫЙ)
Привязать DN: ADNTDOMAIN\serviceaccount или привязать различающееся имя.
Привязать пароль DN: пароль сервисной учетной записи
Timeout 30000
Username LDAP attribute: sAMAccountName
Атрибут идентификатора: objectGUID
Object Class: Person
Путь поиска: (Самый высокий уровень, который может запрашивать все группы, например, только компоненты домена/контроллеры домена: DC = powerflex, DC = лаборатория, DC = dell, DC = com)
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
Путь поиска группы:( такой же, как и путь поиска пользователя, или более детализированный при необходимости. Поскольку мы будем использовать узкий фильтр, наша область может быть широкой, что не повлияет на производительность.)
#The следующая запись предоставляет по крайней мере одну группу для фильтра групп LDAP (PFMP 4.6.x+), чтобы keycloak не выполнял поиск всех групп из всего каталога:
Group LDAP Filter: (CN=GROUP1)
#Given ограничение в 64 символа в этом поле только для пользовательского интерфейса PFMP, мы должны использовать keycloak для обхода его, если мы хотим добавить больше, например, 3 разные группы:
Group LDAP Filter: (|(CN=GROUP1)(CN=GROUP2)(CN=GROUP3))
Проверьте подключение и, если оно выполнено, нажмите Submit.
Например.

2. Удаление и очистка поставщика LDAP
Удалите пользователей LDAP, группы, а затем поставщика каталогов из пользовательского интерфейса PFMP в качестве пользователя-администратора. Не пытайтесь сделать это в качестве пользователя LDAP, только в качестве администратора.
ПРЕДУПРЕЖДЕНИЕ. Обязательно запишите текущую конфигурацию сопоставления «Поставщик каталогов» и «Удаленные пользователи/группы» из PFMP (в частности, если требуется восстановить предыдущее сопоставление ролей).
Если сопоставление групп/ролей не отображается в PFMP (известная проблема), выполните следующие действия:
# 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
Если в базе данных keycloak остались какие-либо устаревшие группы LDAP, их можно удалить вручную с помощью следующей процедуры:
Команды резервного копирования базы данных Keyclak и keycloak_group очистки таблиц базы данных.
Примечание. Ручная очистка keycloak иногда не требуется.
Мы должны использовать пользовательский интерфейс PFMP для удаления поставщика (всегда сначала из PFMP), а затем подтвердить, что он был очищен из keycloak с помощью /auth/ URL.
Как проверить количество групп LDAP в keycloak из любого MVM:
# Выполните команду, чтобы сначала установить переменную.
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;"
Это происходит только после первого удаления в пользовательском интерфейсе PFMP и только в том случае, если данные поставщика остаются в серверной части. При использовании PFxM 4.6.0.1 можно также выполнить следующий метод для удаления импортированных пользователей в пользовательском интерфейсе Keycloak:
- Войдите в систему с помощью /auth/ в качестве пользователя keycloak
- Пароль keycloak уникален для каждой установки и может быть найден на любом MVM с помощью:
kubectl get secret -n powerflex keycloak-admin-credentials -o jsonpath="{.data.password}" | base64 --decode; echo
3. User Federation -> LDAP -> Settings, в правом верхнем раскрывающемся списке Actions выберите Remove Imported.

После очистки и удаления поставщиков групп и каталогов перезагрузите три узла MVM.
-Заметка: Это требуется только в том случае, если среда большая и запросы LDAP многократно накапливаются, как показано в журналах ниже.
- Если среда не перегружена проблемами синхронизации и пользовательский интерфейс стабилен, перезагрузки MVM, как правило, можно пропустить. Но в целом это хорошая мера.
Перезагрузите https://www.dell.com/support/kbdoc/en-us/000225550 базы знаний
MVM Graceful Reboot (необходимо запускать по одному узлу за раз) Не переходите к следующему узлу, пока не убедитесь, что база данных сообщает о состоянии ожидания синхронизации.
#As рекомендуется определить узел, который является текущим лидером Postgres, и перезагрузить этот узел последним.
#Run следующую команду на любом 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 эту команду, чтобы определить, на каком узле MVM размещен модуль базы данных 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 MVM, который является экземпляром модуля Postgres Leader. Выполните команду «watch kubectl get nodes», чтобы отслеживать состояние перезагрузок. Этот MVM должен быть последним перезагруженным узлом.
#Пример порядка перезагрузки, если pfmp-mgmt-1 является лидером Postgres. Измените порядок приведенных ниже команд в зависимости от того, какой MVM является лидером Postgres.
Откройте терминал, подключенный к третьему MVM, и выполните первые две команды.
kubectl label
node pfmp-mgmt-3 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-3 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When узел выходит из режима перезагрузки. Выполните следующую команду.
kubectl uncordon pfmp-mgmt-3 ; kubectl label node pfmp-mgmt-3 cmo.maintenance.mode-
#Run следующую команду до тех пор, пока база данных, связанная с MVM3, не сообщит о режиме ожидания синхронизации. На этом этапе можно перейти к следующему 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'
Откройте терминал, подключенный ко второму MVM, и выполните первые две команды.
kubectl label node pfmp-mgmt-2 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-2 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When узел выходит из режима перезагрузки. Выполните следующую команду.
kubectl uncordon pfmp-mgmt-2 ; kubectl label node pfmp-mgmt-2 cmo.maintenance.mode-
#Run следующую команду до тех пор, пока база данных, связанная с MVM2, не сообщит о режиме ожидания синхронизации. На этом этапе можно перейти к следующему 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 следующую команду, чтобы использовать этот MVM в качестве MVM для мониторинга состояния узла.
'watch kubectl get nodes'
Перейдите к терминалу, подключенному к первому MVM, на котором запущена команда watch kubectl get nodes. Нажмите ctrl+c, чтобы вернуться в терминал и выполнить первые две команды.
kubectl label
node pfmp-mgmt-1 cmo.maintenance.mode=true
kubectl drain pfmp-mgmt-1 --ignore-daemonsets --delete-emptydir-data && sudo reboot
#When узел выходит из режима перезагрузки. Выполните следующую команду.
kubectl uncordon pfmp-mgmt-1 ; kubectl label node pfmp-mgmt-1 cmo.maintenance.mode-
#Run следующую команду до тех пор, пока база данных, связанная с MVM1, не сообщит о режиме ожидания синхронизации. Этот MVM был лидером, но новый лидер должен был взять на себя ответственность, когда MVM1 был опустошен.
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'
ЗАВЕРШЕНИЕ ПРОЦЕДУРЫ КОРРЕКТНОЙ ПЕРЕЗАГРУЗКИ MVM
После перезагрузки и восстановления пользовательского интерфейса для PFMP войдите в систему как admin и добавьте Settings —> Directory Provider , выполнив следующие действия.
3. Перестроение поставщика LDAP
Как упоминалось в разделе подготовки, если в каких-либо группах, которые вы собираетесь использовать в PFMP, есть дочерние домены AD или учетные записи доверия домена Active Directory, то следует использовать порты LDAP глобального каталога (GC) 3268 (обычный) и 3269 (SSL).
Например.
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. Приложение с узкой областью действия пользователя и группы LDAP
Войдите в систему с помощью /auth/ в качестве пользователя keycloak
Фильтр пользователя:
# Пользовательский фильтр LDAP отсутствует в пользовательском интерфейсе PFMP, поэтому для изменения этого необходимо использовать следующее.
#This фильтр должен применяться в области Keyclak PowerFlex (PowerFlex --> User federation --> User LDAP filter)
Фильтр LDAP пользователя:
(&(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)))
Сохраните изменения.
Пояснение к этому суженному фильтру:
objectCategory равно Person.
и
sAMAccountName exists
и
memberOf равно CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
или
memberOf равно CN=FLEX-STOR-MON,OU=15G,OU=FLEXLAB,DC=powerflex,DC=lab,DC=dell,DC=com
Из <https://ldap-builder.powerflex.lab.dell.com/>
Федерация пользователей -> LDAP -> Настройки и в правом верхнем раскрывающемся списке Действия выберите удалить импортированные.

4.6.x+ UI Метод удаления сопоставления групп.

В параметре сопоставления групп LDAP для параметра «Атрибут LDAP пользователя-члена» также необходимо убедиться, что правильное значение, которое мы поставляем как «cn» и не можем изменить в пользовательском интерфейсе PFMP, изменено в пользовательском интерфейсе keyclaak на «DN».

В групповом фильтре LDAP можно перечислить оператор «или-или» | и CN каждой группы, например:
(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=CN=PRV_US_SA_SRV_SVS))