예제 트리로 보는 필터 정리
dc=company,dc=com
├── ou=Enter
│ ├── ou=People
│ │ ├── cn=Ava
│ │ │ ├── uid: ava.enter
│ │ │ ├── objectClass: inetOrgPerson
│ │ │ ├── objectClass: organizationalPerson
│ │ │ ├── sn: Smith
│ │ │ ├── mail: ava.smith@company.com
│ │ │ ├── telephoneNumber: +1 234 567 8901
│ │ │ ├── title: Manager
│ │ │ ├── userPassword: {SHA}abc123def456
│ │ │ └── description: Team lead for Enter department
│ │ ├── cn=Mia
│ │ │ ├── uid: mia.enter
│ │ │ ├── objectClass: inetOrgPerson
│ │ │ ├── objectClass: organizationalPerson
│ │ │ ├── sn: Johnson
│ │ │ ├── mail: mia.johnson@company.com
│ │ │ ├── title: Developer
│ │ │ ├── userPassword: {SHA}xyz789ghi012
│ │ │ ├── description: Software developer in Enter department
│ │ │ └── telephoneNumber: +1 234 567 8902
│ │ └── cn=Zoe
│ │ │ ├── uid: zoe.enter
│ │ │ ├── objectClass: inetOrgPerson
│ │ │ ├── objectClass: organizationalPerson
│ │ │ ├── sn: Brown
│ │ │ ├── mail: zoe.brown@company.com
│ │ │ ├── title: Designer
│ │ │ ├── userPassword: {SHA}mno456pqr789
│ │ │ ├── description: UX/UI Designer for Enter department
│ │ │ └── telephoneNumber: +1 234 567 8903
│ └── ou=Groups
│ ├── cn=Admins
│ ├── cn=Users
│ └── cn=ContractWorker
├── ou=Bank
│ ├── ou=People
│ │ ├── cn=Lily
│ │ │ ├── uid: lily.bank
│ │ │ ├── objectClass: inetOrgPerson
│ │ │ ├── objectClass: organizationalPerson
│ │ │ ├── sn: Taylor
│ │ │ ├── mail: lily.taylor@company.com
│ │ │ ├── title: Analyst
│ │ │ ├── userPassword: {SHA}ghi456jkl123
│ │ │ ├── description: Financial analyst in Bank department
│ │ │ └── telephoneNumber: +1 345 678 9012
│ │ ├── cn=Emma
│ │ │ ├── uid: emma.bank
│ │ │ ├── objectClass: inetOrgPerson
│ │ │ ├── objectClass: organizationalPerson
│ │ │ ├── sn: Lee
│ │ │ ├── mail: emma.lee@company.com
│ │ │ ├── title: Accountant
│ │ │ ├── userPassword: {SHA}rst123uvw456
│ │ │ ├── description: Accountant in Bank department
│ │ │ └── telephoneNumber: +1 345 678 9013
│ │ └── cn=Nora
│ │ │ ├── uid: nora.bank
│ │ │ ├── objectClass: inetOrgPerson
│ │ │ ├── objectClass: organizationalPerson
│ │ │ ├── sn: Wilson
│ │ │ ├── mail: nora.wilson@company.com
│ │ │ ├── title: Clerk
│ │ │ ├── userPassword: {SHA}xyz123abc456
│ │ │ ├── description: Clerk in Bank department
│ │ │ └── telephoneNumber: +1 345 678 9014
│ └── ou=Groups
│ ├── cn=Admins
│ ├── cn=Users
│ ├── cn=Outsourcing
│ └── cn=ContractWorker
├── ou=Map
│ ├── ou=People
│ │ ├── cn=Leah
│ │ │ ├── uid: leah.map
│ │ │ ├── objectClass: inetOrgPerson
│ │ │ ├── objectClass: organizationalPerson
│ │ │ ├── sn: Parker
│ │ │ ├── mail: leah.parker@company.com
│ │ │ ├── title: Manager
│ │ │ ├── userPassword: {SHA}abc456ghi789
│ │ │ ├── description: Manager of Map department
│ │ │ └── telephoneNumber: +1 456 789 0123
│ │ ├── cn=June
│ │ │ ├── uid: june.map
│ │ │ ├── objectClass: inetOrgPerson
│ │ │ ├── objectClass: organizationalPerson
│ │ │ ├── sn: Wright
│ │ │ ├── mail: june.wright@company.com
│ │ │ ├── title: Engineer
│ │ │ ├── userPassword: {SHA}ghi012mno456
│ │ │ ├── description: Software engineer in Map department
│ │ │ └── telephoneNumber: +1 456 789 0124
│ │ └── cn=Ella
│ │ ├── uid: ella.map
│ │ ├── objectClass: inetOrgPerson
│ │ ├── objectClass: organizationalPerson
│ │ ├── sn: Scott
│ │ ├── mail: ella.scott@company.com
│ │ ├── title: Analyst
│ │ ├── userPassword: {SHA}uvw123rst789
│ │ ├── description: Data analyst in Map department
│ │ └── telephoneNumber: +1 456 789 0125
│ └── ou=Groups
│ ├── cn=Admins
│ ├── cn=Users
│ ├── cn=Outsourcing
│ └── cn=ContractWorker
└── ou=Music
├── ou=People
│ ├── cn=Kate
│ │ ├── uid: kate.music
│ │ ├── objectClass: inetOrgPerson
│ │ ├── objectClass: organizationalPerson
│ │ ├── sn: Morris
│ │ ├── mail: kate.morris@company.com
│ │ ├── title: Singer
│ │ ├── userPassword: {SHA}abc789xyz456
│ │ ├── description: Lead singer in Music department
│ │ └── telephoneNumber: +1 567 890 1234
│ ├── cn=Jade
│ │ ├── uid: jade.music
│ │ ├── objectClass: inetOrgPerson
│ │ ├── objectClass: organizationalPerson
│ │ ├── sn: Adams
│ │ ├── mail: jade.adams@company.com
│ │ ├── title: Composer
│ │ ├── userPassword: {SHA}def123ghi456
│ │ ├── description: Music composer in Music department
│ │ └── telephoneNumber: +1 567 890 1235
│ └── cn=Ivy
│ ├── uid: ivy.music
│ ├── objectClass: inetOrgPerson
│ ├── objectClass: organizationalPerson
│ ├── sn: Carter
│ ├── mail: ivy.carter@company.com
│ ├── title: Musician
│ ├── userPassword: {SHA}jkl456mno123
│ ├── description: Instrumental musician in Music department
│ └── telephoneNumber: +1 567 890 1236
└── ou=Groups
├── cn=Admins
├── cn=Users
└── cn=ContractWorker
LDAP Filter
LDAP 디렉터리에서 특정 엔트리를 검색하거나 쿼리할 때 사용되는 검색 조건을 정의하는 규칙입니다. 필터는 속성 값과 조건을 이용하여 LDAP 트리에서 특정 정보를 찾을 수 있도록 해줍니다.
1. LDAP Filter의 기본 구조
LDAP 필터는 다음과 같은 형식으로 구성됩니다:
(attribute=값)
여기서:
- attribute: 속성 이름 (예: cn, uid, mail)
- 값: 속성의 특정 값 또는 패턴
2. 필터 예시
LDAP 필터의 몇 가지 예시와 그 설명을 살펴보겠습니다.
- 속성이 특정 값과 일치하는 엔트리 검색
(cn=Ava)
- 설명: cn(Common Name)이 Ava인 엔트리를 검색합니다.
- 와일드카드(*)를 사용한 부분 검색
(mail=*@company.com)
- 설명: 이메일 주소가 @company.com으로 끝나는 모든 엔트리를 검색합니다.
- *는 와일드카드로, 부분 일치를 검색하는 데 사용됩니다.
- 여러 조건을 결합한 복합 필터
- AND 조건 (두 조건 모두 일치해야 하는 경우):
(&(objectClass=inetOrgPerson)(uid=ava.enter))
- 설명: objectClass가 inetOrgPerson이고 uid가 ava.enter인 엔트리를 검색합니다.
- &는 AND 연산자로, 모든 조건이 만족되어야 합니다.
-
- OR 조건 (두 조건 중 하나 이상 일치하는 경우):
(|(cn=Ava)(cn=Mia))
- 설명: cn이 Ava이거나 Mia인 엔트리를 검색합니다.
- |는 OR 연산자로, 둘 중 하나라도 만족하면 결과에 포함됩니다.
-
- NOT 조건 (특정 조건과 일치하지 않는 경우):
(!(title=Manager))
- 설명: title이 Manager가 아닌 모든 엔트리를 검색합니다.
- !는 NOT 연산자로, 조건과 일치하지 않는 경우를 나타냅니다.
- 비교 연산자를 사용한 필터
- 존재 여부 확인:
(mail=*)
- 설명: mail 속성이 존재하는 모든 엔트리를 검색합니다.
-
- 숫자 비교 연산자 (LDAP에서 숫자 속성에 대해서):
(uidNumber>=1000)
- 설명: uidNumber가 1000 이상인 모든 엔트리를 검색합니다.
- >=, <= 등의 연산자를 사용할 수 있습니다.
3. LDAP 필터의 사용 예시
- 특정 부서의 모든 사용자를 검색하고자 할 때:
(&(objectClass=inetOrgPerson)(ou=People))
objectClass가 inetOrgPerson이고 ou가 People인 모든 엔트리를 가져옵니다.
- 이메일이 특정 도메인으로 끝나는 사용자를 찾고자 할 때:
(mail=*@company.com)
이메일 주소가 @company.com으로 끝나는 모든 사용자를 찾습니다.
- 특정 이름을 가진 사용자를 찾고자 할 때, 예를 들어 Ava와 Mia 모두를 검색하려는 경우:
(|(cn=Ava)(cn=Mia))
cn이 Ava 또는 Mia인 사용자들을 가져옵니다.
4. LDAP 필터의 응용
LDAP 필터는 복잡한 조건을 만들 수 있는 강력한 도구입니다. 이를 통해 특정 속성의 값이 있는지 확인하거나, 여러 속성들을 조합하여 원하는 데이터를 추출할 수 있습니다. 예를 들어:
- 특정 직위가 'Manager'가 아닌 사용자를 검색하려면:
(&(objectClass=inetOrgPerson)(!(title=Manager)))
inetOrgPerson 타입의 사용자들 중 title이 Manager가 아닌 엔트리를 검색합니다.
- 특정 부서의 사용자 중 이메일이 존재하는 엔트리 검색:
(&(ou=People)(mail=*))
ou가 People이고 mail 속성이 존재하는 모든 엔트리를 가져옵니다.
5. LDAP 필터의 특성
- 대소문자 구분 없음: LDAP 필터에서 검색할 때 기본적으로 대소문자를 구분하지 않습니다.
- 구문 규칙: 필터 구문에서 &, |, ! 같은 논리 연산자를 사용하여 복잡한 조건을 만들 수 있습니다.
- 와일드카드 사용: * 와일드카드는 특정 속성 값의 부분 검색에 유용합니다.
6. LDAP 필터의 실제 사용
LDAP 필터는 디렉터리에서 효율적인 검색을 위해 매우 중요합니다. 예를 들어, 회사의 모든 Manager를 찾기 위해서 ldapsearch 명령어와 함께 필터를 사용합니다:
ldapsearch -x -b "dc=company,dc=com" "(&(objectClass=inetOrgPerson)(title=Manager))"
- -b: 기준 Base DN을 지정 (dc=company,dc=com).
- 필터: (&(objectClass=inetOrgPerson)(title=Manager))를 사용하여 title이 Manager인 모든 사용자를 검색합니다.
요약
- LDAP 필터는 디렉터리에서 특정 엔트리를 효율적으로 검색하기 위한 도구입니다.
- 기본 구조는 (속성=값) 형식이며, &(AND), |(OR), !(NOT) 연산자를 사용해 복잡한 필터 조건을 만들 수 있습니다.
- 필터를 사용하면 조건에 맞는 데이터만 선택하여 검색할 수 있어, 디렉터리의 큰 데이터셋에서도 원하는 데이터를 빠르게 찾아낼 수 있습니다.
+) 더많은 예시
예시 1: 특정 uid를 가진 사용자 검색
목표: uid가 ava.enter인 사용자를 검색
필터:
(uid=ava.enter)
- 설명: 이 필터는 uid가 ava.enter인 엔트리를 찾습니다.
- 결과:
dn: cn=Ava,ou=People,ou=Enter,dc=company,dc=com
uid: ava.enter
objectClass: inetOrgPerson
objectClass: organizationalPerson
sn: Smith
mail: ava.smith@company.com
telephoneNumber: +1 234 567 8901
title: Manager
userPassword: {SHA}abc123def456
description: Team lead for Enter department
예시 2: 특정 부서(ou)의 모든 사용자 검색
목표: Enter 부서의 모든 사람을 검색
필터:
(&(objectClass=inetOrgPerson)(ou=People))
- 설명: objectClass가 inetOrgPerson이고 ou가 People인 모든 엔트리를 찾습니다. Enter 부서에 속한 사용자들을 찾을 수 있습니다.
- 결과: 이 필터는 다음과 같은 사용자들을 찾습니다.
- Ava, Mia, Zoe
예시 3: 이메일이 특정 도메인으로 끝나는 사용자 검색
목표: @company.com 도메인으로 끝나는 이메일 주소를 가진 모든 사용자를 검색
필터:
(mail=*@company.com)
- 설명: 이메일 주소가 @company.com으로 끝나는 모든 엔트리를 찾습니다.
- 결과: Ava, Mia, Zoe, Lily, Emma, Nora, Leah, June, Ella, Kate, Jade, Ivy가 해당됩니다.
예시 4: 특정 직위를 가진 사용자 검색
목표: Manager 직위를 가진 사용자를 검색
필터:
(title=Manager)
- 설명: title 속성이 Manager인 모든 엔트리를 찾습니다.
- 결과: 이 필터는 다음 사용자들을 찾습니다.
- Ava (Enter 부서의 Manager)
- Leah (Map 부서의 Manager)
예시 5: 특정 부서의 특정 직위를 가진 사용자 검색 (AND 조건)
목표: Map 부서의 Engineer 직위를 가진 사용자를 검색
필터:
(&(ou=People)(title=Engineer))
- 설명: ou가 People이고 title이 Engineer인 모든 엔트리를 찾습니다. Map 부서 내의 Engineer를 검색하는 것입니다.
- 결과: June이 해당됩니다.
예시 6: 여러 조건 중 하나를 만족하는 사용자 검색 (OR 조건)
목표: Ava 또는 Mia인 사용자를 검색
필터:
(|(cn=Ava)(cn=Mia))
- 설명: cn 속성이 Ava이거나 Mia인 모든 엔트리를 찾습니다.
- 결과: Ava와 Mia가 검색됩니다.
예시 7: 특정 속성이 존재하는 사용자 검색
목표: telephoneNumber 속성이 존재하는 모든 사용자를 검색
필터:
(telephoneNumber=*)
- 설명: telephoneNumber 속성이 존재하는 모든 엔트리를 찾습니다. 즉, 전화번호가 있는 모든 사용자를 찾는 것입니다.
- 결과: 트리에 있는 모든 사용자(Ava, Mia, Zoe, Lily, Emma, Nora, 등)가 검색됩니다.
예시 8: 특정 직위가 아닌 사용자 검색 (NOT 조건)
목표: title이 Manager가 아닌 모든 사용자를 검색
필터:
(!(title=Manager))
- 설명: title 속성이 Manager가 아닌 모든 엔트리를 찾습니다.
- 결과: Mia, Zoe, Emma, Nora, June, Ella, Kate, Jade, Ivy 등 Manager가 아닌 직위를 가진 모든 사용자가 검색됩니다.
예시 9: 전체 데이터 갯수 or 특정 데이터 갯수 구하기
- 목표 : 전체 데이터 갯수를 구한다
- 필터 :
ldapsearch -x -b "ou=People,dc=company,dc=com" "(objectClass=*)" | grep "^dn:" | wc -l
or
ldapsearch -x -b "ou=People,dc=company,dc=com" | grep "^dn:" | wc -l
- 목표 : o=company 의 전체 데이터 갯수를 구한다
- 필터 :
ldapsearch -x -D "cn=admin,dc=company,dc=com" -w admin -b "o=acompany,dc=company,dc=com" | grep "^dn:" | wc -l
요약
- LDAP 필터를 사용하면 특정 조건에 따라 LDAP 디렉터리에서 필요한 정보를 효과적으로 검색할 수 있습니다.
- 위 트리 예제에서는 uid, mail, title 등의 속성을 사용하여 다양한 AND 조건, OR 조건, NOT 조건을 사용한 검색을 시도했습니다.
- 필터를 통해 사용자의 특정 정보를 기반으로 조건부 검색을 수행함으로써 디렉터리 관리와 데이터 검색을 효율적으로 처리할 수 있습니다.
'LDAP' 카테고리의 다른 글
| LDAP Docker로 실행하기 (3) | 2024.10.06 |
|---|---|
| LDAP (3) | 2024.10.05 |
| LDAP 용어 정리 (1) | 2024.10.05 |
| LDAP 검색 스코프(base, one, subree, children) (1) | 2024.10.05 |
| LDAP에서 주요 objectClass 유형 (1) | 2024.10.05 |