대규모 환경을 위한 PowerFlex 4.x LDAP 구성
Summary: PowerFlex Management Platform SSO 백엔드를 사용하여 사용자 및 그룹 LDAP 검색 필터의 범위를 좁히면 여러 UI 및 플랫폼 문제를 일으키는 것으로 관찰된 동기화 문제를 완화할 수 있습니다.
Instructions
배경:
기본적으로 PFMP(PowerFlex Management Platform) 디렉토리 공급자는 비사용자 계정 및 RBAC에 필요하지 않은 기타 객체를 포함하여 구성된 검색 범위 내의 모든 LDAP 객체를 가져옵니다.
대규모 환경에서 이 동작으로 인해 MVM(PFMP 관리 VM), 지원 Postgres 데이터베이스 및 전체 플랫폼에서 리소스 사용률이 크게 증가할 수 있습니다.
따라서 LDAP 동기화가 허용 가능한 기간 내에 완료되지 못하여 작업 백로그, 메모리 누수 및 동시성 문제가 발생할 수 있습니다.
1. 준비
요구 사항:
Active Directory 글로벌 카탈로그 사용
참고: AD 환경에서는 표준 LDAP에 포트 3268을 사용하고 LDAPS에 포트 3269를 사용해야 합니다. 이렇게 하면 하위 도메인 또는 다른 신뢰할 수 있는 도메인의 LDAP 그룹 구성원을 PFMP에서 사용할 수 있습니다.
AD 그룹의 예:

na.powerflex.lab.dell.com 위의 자식 도메인은 글로벌 카탈로그 포트를 사용하여 PFMP의 LDAP 사용자 페더레이션 Keycloak에서 볼 수 있어야 합니다.
이는 PFMP 디렉터리 공급자에서 objectGUID를 사용하는 이유이기도 하며, 계정을 전역 고유 UUID에 연결합니다.
두 하위 도메인이 트러스트 탭 아래에 나열되면 하위 도메인이 기본적으로 서로를 신뢰하는 것으로 보입니다.
Microsoft AD(Active Directory) 환경에서 상위 도메인과 하위 도메인(하위) 도메인은 기본적으로 계층 구조에서 서로를 신뢰합니다. 이를 전이적 신탁이라고 합니다.
기본적으로 이러한 트러스트는 양방향이며 전이적이므로 부모 도메인이 자식 도메인을 신뢰하고 그 반대의 경우도 마찬가지입니다. 이러한 전이적 특성은 부모-자식 계층 구조 내의 모든 도메인으로 신뢰를 확장합니다.
DNS 항목에서 사용 가능한 LDAP 또는 AD GC 서버 찾기
일반적으로 고객은 사용할 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.
OU 또는 그룹의 distinguishedName을 찾는 방법
먼저 사용자를 PFMP로 읽으려는 OU 및 그룹의 DN(Distinguished Name)이 필요합니다. 이러한 경로는 DNS 이름을 엄격하게 따르지 않으며 수동으로 추출할 수 있는 x.500 LDAP 경로 내에 OU를 포함합니다.
OS에 따라 다른 유틸리티를 사용하여 이러한 DN을 찾을 수 있으며 한 가지 쉬운 방법은 curl을 사용하는 것입니다.
Linux에서curl 유틸리티를 사용하여 PFMP LDAP 설정을 테스트하는 방법
MVM에 설치된 최신 버전의 curl을 사용하여 필요한 전체 고유 이름을 찾을 수 있습니다. 예를 들어 LabAdmins 그룹 CN의 전체 DN을 검색합니다.
#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
Linux에서ldapsearch 또는 curl 유틸리티를 사용하여 PFMP LDAP 설정을 테스트하는 방법
네트워크에서 Linux 호스트를 사용할 수 있는 경우 ldapsearch 유틸리티를 사용하면 PFMP/Keycloak에서 사용되는 LDAP 설정을 테스트하고 검증하는 것이 유용할 수 있습니다.
또는 관리 VM/MVM 중 하나에서 LDAP 쿼리에 curl 유틸리티를 사용할 수도 있습니다.
간략한 소개 (일반적으로 사용되는 옵션):
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
LDAP 루트 항목에서 기본 DN(-b) 정의:
$ 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,바인딩 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)"
이 예에서는 sAMAccountName 특성을 사용하여 기존 사용자 계정에 대한 LDAP를 쿼리 합니다 (필요한 특성만 표시하도록 출력이 잘림).
PFMP UI의 해당 설정:
주소 (-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"는 동급)
(기본 SASL 모드를 피하기 위해 단순 인증에 -x가 필요함)
바인딩 DN 암호(-W): 암호 프롬프트(또는 –w '***'를 사용하여 명령에 제공)
The output of the command validates the following PFMP User Search Settings:
Username LDAP Attribute: sAMAccountName
ID 특성: objectGUID
등급: 사람(person)
검색 경로 (-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)))"
Windows
Active Directory 사용자 및 컴퓨터를 시작합니다. View를 클릭하고 Advanced Features를 선택합니다.
DN은 디렉토리의 항목을 고유하게 식별하는 이름입니다. DN의 첫 번째 구성 요소를 RDN(Relative Distinguished Name)이라고 합니다.
DN은 쉼표로 구분된 attribute=value 쌍으로 구성됩니다. 예를 들면 다음과 같습니다.
CN=PowerFlex Admin,OU=sio-group1,DC=powerflex,DC=lab,DC=dell,DC=com
전체 x500 주소 'URL'인 "LDAP용 FQDN"으로 생각하면 됩니다.
AD 사용자 및 컴퓨터를 사용하여 DN 및 기타 특성을 확인할 수 있습니다.

사용자를 읽으려는 OU를 탐색하고 마우스 오른쪽 단추로 클릭한 다음, 속성을 선택합니다.

OU 속성에서 속성 편집기 탭을 선택합니다.
distinguishedName을 클릭하여 강조 표시한 다음 보기를 클릭합니다.
강조 표시된 값을 마우스 오른쪽 버튼으로 클릭하고 Copy를 선택합니다.
취소(Cancel)를 클릭한 다음 확인(OK)을 클릭하여 속성 편집기(Attribute Editor) 및 OU 속성(OU Properties) 창을 닫습니다.

좁은 범위의 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)))
시각적 설명:

사용자 요구 사항을 바인딩합니다.
이 바인드 사용자는 최소한 LDAP 서버에 정의된 사용자 및 그룹을 쿼리할 수 있는 권한이 있어야 스토리지 시스템에서 이러한 사용자를 인증할 수 있습니다.
기본적으로 Active Directory 사용자 및 컴퓨터에서 최상위 도메인의 보안 탭에 사용자를 추가하면 PFMP의 LDAP 인증에 필요한 기본 읽기 전용 요구 사항이 제공됩니다. 예:



참고: 디렉토리에서 읽어야 하는 AD 그룹 '에서' LDAP 바인딩 사용자가 필요하지 않으며 "읽기"의 보안 탭 권한이 필요합니다.

PFMP LDAP 공급자 일반 요구 사항
주소: ldaps://ad.ldap.domain:3269(SSL) 또는 ldap://ad.ldap.domain:3268(PLAIN)
바인딩 DN: ADNTDOMAIN\serviceaccount 또는 Bind DN 고유 이름입니다.
Bind DN Password: 서비스 계정 비밀번호
Timeout 30000
Username LDAP attribute: sAMAccountName
ID 특성: objectGUID
Object Class: Person
검색 경로: (모든 그룹을 쿼리할 수 있는 최상위 수준. 예: 도메인 구성 요소/DC만 쿼리할 수 있습니다. DC=powerflex, DC=lab, DC=dell, DC=com)
Group Member Attribute: member
Group ID Attribute: cn
Group Object Class: group
그룹 검색 경로:( 사용자 검색 경로와 동일하거나 필요한 경우 더 세분화됩니다. 좁은 필터를 사용하기 때문에 성능에 영향을 주지 않고 범위를 넓힐 수 있습니다.)
다음 항목은 keycloak#The 전체 디렉토리에서 모든 그룹을 검색하지 않도록 LDAP 그룹 필터(PFMP 4.6.x+)에 하나 이상의 그룹을 제공합니다.
Group LDAP Filter: (CN=GROUP1)
PFMP UI에 대해서만 이 필드의 64자 제한을 #Given 그 이상을 추가하려면 keycloak을 사용하여 해결해야 합니다(예: 3개의 다른 그룹).
Group LDAP Filter: (|(CN=GROUP1)(CN=GROUP2)(CN=GROUP3))
연결을 테스트하고 성공하면 Submit을 클릭합니다.
예:

2. LDAP 공급자 제거 및 정리
LDAP 사용자, 그룹, 디렉터리 공급자를 PFMP UI에서 관리자 사용자로 제거합니다. 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
오래된 LDAP 그룹이 keycloak 데이터베이스에 남아 있는 경우 다음 프로세스를 사용하여 수동으로 삭제할 수 있습니다.
Keycloak 데이터베이스 백업 및 keycloak_group 데이터베이스 테이블 정리 명령.
참고: keycloak을 수동으로 정리할 필요가 없는 경우도 있습니다.
PFMP UI를 사용하여 공급자를 제거한 다음(항상 PFMP에서) /auth/ URL을 사용하여 keycloak에서 지워졌는지 확인해야 합니다.
하나의 MVM에서 keycloak의 LDAP 그룹 수를 확인하는 방법:
# 변수를 먼저 설정하려면 실행하십시오.
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 UI에서 처음 제거한 후에만, 그리고 공급자 데이터가 백 엔드에 남아 있는 경우에만 가능합니다. PFxM 4.6.0.1을 사용하는 경우 다음 방법을 수행하여 Keycloak UI에서 가져온 사용자를 제거할 수도 있습니다.
- /auth/를 keycloak 사용자로 사용하여 로그인합니다.
- Keycloak 암호는 각 설치마다 고유하며 다음을 사용하여 모든 MVM에서 찾을 수 있습니다.
kubectl get secret -n powerflex keycloak-admin-credentials -o jsonpath="{.data.password}" | base64 --decode; echo
3. 사용자 페더레이션 -> LDAP -> 설정을 선택하고 오른쪽 상단 작업 드롭다운에서 가져오기한 항목 제거를 선택합니다.

그룹 및 디렉토리 공급자가 정리되고 제거된 상태에서 3개의 MVM 노드를 재부팅합니다.
-메모: 이는 환경이 크고 아래 로그에서 볼 수 있듯이 LDAP 쿼리가 반복적으로 스택되는 경우에만 필요합니다.
- 환경에 동기화 문제가 과부하되지 않고 UI가 안정적인 경우 일반적으로 MVM 재부팅을 건너뛸 수 있습니다. 일반적으로 좋은 조치입니다.
KB https://www.dell.com/support/kbdoc/en-us/000225550 재부팅
MVM 정상 재부팅(한 번에 하나의 노드를 실행해야 함) 데이터베이스가 동기화 대기를 보고하는지 확인할 때까지 다음 노드로 이동하지 마십시오.
#As 현재 Postgres 리더인 노드를 식별하고 마지막으로 재부팅하는 것이 가장 좋습니다.
MVM에서 다음 명령을 #Run 데이터베이스 상태 및 연결된 데이터베이스 이름을 나열합니다.
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 postgres 데이터베이스 포드를 호스팅하는 MVM 노드를 식별합니다.
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
Postgres 리더 포드 인스턴스인 MVM을 #On. '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-
MVM3와 연결된 데이터베이스가 Sync Standby를 보고할 때까지 다음 명령을 #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'
두 번째 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-
MVM2와 연결된 데이터베이스가 Sync Standby를 보고할 때까지 다음 명령을 #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을 노드 상태 모니터링 MVM으로 사용합니다.
'watch kubectl get nodes'
'watch kubectl get nodes'를 실행하는 첫 번째 MVM에 연결된 터미널로 이동합니다. 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-
MVM1과 연결된 데이터베이스가 Sync Standby를 보고할 때까지 다음 명령을 #Run. 이 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에 대한 UI가 복원되면 관리자로 로그인하고 아래 단계를 사용하여 Settings -> Directory Provider 를 추가합니다.
3. LDAP 공급자 재구축
준비 섹션에서 설명한 대로 PFMP에서 활용할 그룹에 하위 AD 도메인 또는 AD 도메인 트러스트 계정이 있는 경우 GC(글로벌 카탈로그) LDAP 포트 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 사용자로 사용하여 로그인합니다.
사용자 필터:
# PFMP UI에서 사용자 LDAP 필터가 누락되었으므로 다음을 사용하여 변경해야 합니다.
Keycloak PowerFlex 영역에 #This 필터를 적용해야 합니다(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 존재
또한 다음 메시지가 표시됩니다.
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 UI에서 변경할 수 없는 올바른 값이 keycloak UI에서 DN으로 변경되었는지 확인해야 합니다.

그룹 LDAP 필터에는 either/or 연산자를 나열할 수 있습니다. 및 각 그룹의 CN(예:
(|(CN=FLEXLAB-APP-PROD-SDS-Admin)(CN=CN=PRV_US_SA_SRV_SVS))