Конфігурація PowerFlex 4.x LDAP для великих середовищ
Summary: Звузивши фільтри пошуку LDAP користувача та групи за допомогою модуля єдиного входу PowerFlex Management Platform, ми можемо пом'якшити проблеми із синхронізацією, які, як було помічено, спричиняють численні проблеми з інтерфейсом користувача та платформою. ...
Instructions
- Підготовка
- Видалення та очищення постачальника LDAP
- Перебудова постачальника LDAP
- Вузьке застосування області видимості користувача та групи LDAP
Тло:
За замовчуванням постачальники каталогів PowerFlex Management Platform (PFMP) імпортують усі об'єкти LDAP у межах налаштованої області пошуку, включно з обліковими записами, які не належать користувачам, та іншими об'єктами, які не вимагаються нашим RBAC.
У великих середовищах така поведінка може призвести до значного використання ресурсів між віртуальними машинами керування PFMP (MVM), підтримуючою базою даних Postgres і загальною платформою.
Таким чином, синхронізація LDAP може не завершитися в прийнятні терміни, що призведе до затримок завдань, витоку пам'яті та проблем з паралелізмом.
1. Підготовка
Вимоги:
Використання глобального каталогу Active Directory
Примітка: Нам потрібно використовувати порт 3268 для стандартного LDAP або 3269 для LDAPS у середовищах AD. Це дозволяє учасникам групи LDAP з дочірніх доменів або інших довірених доменів використовувати в PFMP.
Наприклад, група AD:

Дочірній домен вище na.powerflex.lab.dell.com має бути видимим за допомогою Keycloak Федерації користувачів LDAP PFMP, використовуючи порти глобального каталогу, які дозволяють їх доступ.
Ось чому ми використовуємо objectGUID у постачальнику каталогів PFMP, він прив'язує облікові записи до їхнього глобального унікального UUID.
Якщо обидва дочірні домени вказано на вкладці «Довіра», здається, що субдомени за замовчуванням довіряють один одному.
У середовищі 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) OU та Груп, де ми хочемо читати користувачів у PFMP. Ці шляхи не строго дотримуються імен DNS і містять OU всередині шляху x.500 LDAP, який ми можемо витягнути вручну.
Ми можемо знайти ці DN за допомогою різних утиліт залежно від ОС, одним із простих способів є використання curl:
Як перевірити налаштування PFMP LDAP за допомогою утиліти 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
Як перевірити параметри PFMP LDAP за допомогою утиліти 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 дає верхній базовий DN, який можна використовувати для пошуку.
-W -b "
Тестування LDAP URI,Bind DN (користувач/пароль з доступом на читання) та налаштувань пошуку користувачів:
$ 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-користувач,CN=Користувачі,DC=powerflex,DC=lab,DC=dell,DC=com" # ("FLEXLAB\ck3-користувач" або "ck3-user@powerflex.lab.dell.com" еквівалентні)
(-x потрібен для простої автентифікації, щоб уникнути режиму SASL за замовчуванням)
Bind DN Password (-W): запитайте пароль (або використовуйте –w '***', щоб надати його в команді)
The output of the command validates the following PFMP User Search Settings:
Username LDAP Attribute: sAMAccountName
Атрибут ID: objectGUID
Клас об'єкта: людина
Шлях пошуку (-b): "dc=powerflex,dc=lab,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)))"
Вікна
Запустіть програму Active Directory для користувачів і комп'ютерів. Натисніть «Перегляд» і виберіть «Додаткові функції».
DN – це ім'я, яке однозначно ідентифікує запис у каталозі. Перший компонент DN називається відносною відмінною назвою (RDN).
DN складається з пар attribute=value, розділених комами, наприклад:
CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Думайте про них як про "FQDN для LDAP", повна 'URL' адреси x500.
Користувачі та комп'ютери AD можуть використовуватися для визначення DN та інших атрибутів:

Перейдіть і клацніть правою кнопкою миші OU там, де ви хочете читати користувачів, а потім виберіть «Властивості».

У властивостях OU виберіть вкладку Редактор атрибутів.
Клацніть «DistinctedName», щоб виділити його, а потім клацніть «Перегляд».
Клацніть правою кнопкою миші виділене значення та виберіть Копіювати.
Натисніть «Скасувати», а потім «OK», щоб закрити вікна «Редактор атрибутів» і «Властивості OU».

Приклад фільтра користувача 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)))
Візуальне пояснення:

Прив'язка вимог користувача.
Цей користувач bind повинен принаймні мати дозвіл на запити до користувачів і груп, які визначені на сервері LDAP, щоб дозволити системі зберігання даних розпізнавати цих користувачів.
За замовчуванням, коли користувач додається на вкладку безпеки домену верхнього рівня в розділі «Користувачі та комп'ютери Active Directory», йому надаються вимоги до читання за замовчуванням, необхідні для автентифікації LDAP у PFMP. наприклад



Довідка: Нам не потрібен наш користувач прив'язки LDAP фактично «в» групах AD, які ми повинні прочитати в каталозі, нам потрібні дозволи на вкладці «Безпека» на вкладці «Читання».

Загальні вимоги до провайдера PFMP LDAP
Адреса: ldaps://ad.ldap.domain:3269 (SSL) АБО ldap://ad.ldap.domain:3268 (ЗВИЧАЙНА)
Прив'язка DN: ADNTDOMAIN\serviceaccount або Bind DN Distinct name.
Bind DN Password: пароль від службового облікового запису
Timeout 30000
Username LDAP attribute: sAMAccountName
Атрибут ID: objectGUID
Object Class: Person
Шлях пошуку: (Найвищий рівень, який може запитувати всі групи, наприклад, лише компоненти домену/DCs: DC=powerflex,DC=lab,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 UI, ми повинні використовувати клавіатуру, щоб обійти це, якщо ми хочемо додати більше, наприклад, 3 різні групи:
Group LDAP Filter: (|(CN=GROUP1)(CN=GROUP2)(CN=GROUP3))
Перевірте з'єднання та в разі успіху натисніть Надіслати.
Наприклад

2. Видалення та очищення постачальника 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, їх можна видалити вручну за допомогою наступного процесу:
Команди резервного копіювання бази даних Keycloak та keycloak_group команди очищення таблиці бази даних.
Примітка: Ручне очищення клавіатури іноді не потрібне.
Ми повинні використовувати інтерфейс PFMP для видалення провайдера (завжди спочатку з PFMP), а потім підтвердити, що його було очищено з keycloak за допомогою /auth/ URL.
Як перевірити кількість груп LDAP у keycloak з будь-якого одного MVM:
# Запустіть this, щоб спочатку встановити змінну.
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. Федерація користувачів -> LDAP -> Налаштування і в правому верхньому спадному меню Дії виберіть Видалити імпортовані.

Очистивши та видаливши групи та постачальники каталогів, перезавантажте три вузли 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, який є екземпляром pod 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, на якому виконується функція «дивитися, kubectl отримує вузли». Натисніть 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 увійдіть як адміністратор і додайте Налаштування -> Постачальник каталогів , виконавши наведені нижче дії:
3. Перебудова постачальника LDAP
Як згадувалося в розділі підготовки, якщо є дочірні домени AD або довірчі облікові записи доменів AD у будь-яких групах, які ви використовуєте в PFMP, то слід використовувати порти 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 фільтр має застосовуватися в області Keycloak PowerFlex (PowerFlex --> Федерація користувачів --> Фільтр LDAP користувача)
Фільтр 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 існує
І
членOf дорівнює CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
Або
членOf дорівнює 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+ Метод інтерфейсу користувача для видалення зіставлення груп.

У налаштуваннях групового зіставлення LDAP для «Атрибут LDAP користувача-члена» нам також потрібно переконатися, що правильне значення, яке ми надсилаємо як 'cn' і не можемо змінити в інтерфейсі PFMP UI, змінено в інтерфейсі keycloak на DN.

У груповому фільтрі LDAP ми можемо вказати оператор або/або | і КН кожної групи, наприклад
(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=CN=PRV_US_SA_SRV_SVS))