2025년 6월 23일 월요일

[Linux] Rocky9에 Openldap 설치 및 조직 설정

 

1. 관련 프로그램 설치 

기본 레파지토리에는 openldap-servers가 존재하지 않으므로 레피지토리에 추가

#  dnf config-manager --set-enabled plus

# dnf repolist 





# dnf update

# dnf -y install openldap openldap-servers openldap-clients

# systemctl enable slapd

# systemctl start slapd

# firewall-cmd --permanent --add-service={ldap,ldaps}

# firewall-cmd --reload

 

2. 관리자 패스워드 설정 

#  slappasswd

New password : *******

Re-enter new password : *******  

 {SSHA}***********************************  <--복사필요

# vi admin_pass.ldif 

dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}***********************************  <--위화면 패스워드 붙여넣기

# ldapadd -Y EXTERNAL -H ldapi:/// -f admin_pass.ldif   <--루트 패스워드를 변경함.




 

3. Base DN을 설정 

# vi base_structure.ldif 

 # base_structure.ldif
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=example,dc=com

# ldapadd -Y EXTERNAL -H ldapi:/// -f base_structure.ldif <--적용 

 

4. 기본 스키마 로드 

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif


 

5. 기본 조직 설정

# vi initial_org.ldif

# 조직의 루트 DIT(Directory Information Tree) 항목 정의
# dc=example,dc=com은 설치 시 설정한 기본 도메인에 맞춰 변경해야 합니다.
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: My Company
description: My Company's main LDAP directory

# 사용자들을 위한 조직 구성 단위(OU) 정의
dn: ou=users,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: users
description: All user accounts in My Company

# 그룹들을 위한 조직 구성 단위(OU) 정의
dn: ou=groups,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: groups
description: All user groups in My Company

# 부서들을 위한 조직 구성 단위(OU) 정의
dn: ou=departments,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: departments
description: Departments within My Company

# IT 부서 OU 정의 (부서 OU 아래에 위치)
dn: ou=IT,ou=departments,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: IT
description: Information Technology Department

# HR 부서 OU 정의 (부서 OU 아래에 위치)
dn: ou=HR,ou=departments,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: HR
description: Human Resources Department

 

ldapadd -x -W -D "cn=admin,dc=example,dc=com" -f initial_org.ldif 


※ 패스워드는 이전에 설정한 관리자 패스워드를 입력 

 

 

6. Base Dn : cn=admin,dc=example,dc=com  , 관리자 패스워드 사용하여 관리 가능

 -  사용자 추가(HR 부서의 홍길동)

# slappassword  <--사용할 패스워드의 해시값으로 변환

New password: 홍길동
Re-enter new password: 홍길동
{SSHA}48cA5xSMTaz61+xo46Ek17DC07rapLtJ   <-- 해시값 복사

 # vi add_hong.ldif

 dn: uid=honggildong,ou=HR,ou=departments,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: 홍길동
sn: 홍
givenName: 길동
mail: hong.gildong@example.com  
uid: honggildong
userPassword: {SSHA}48cA5xSMTaz61+xo46Ek17DC07rapLtJ

 

ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f add_hong.ldif  



- Apache Directory Studio 프로그램에서 보면 정상적으로 추가되었음을 볼 수 있음.


 

만약 HR부서에 속한 인원을 조회시

# ldapsearch -x -b  "ou=HR,ou=departments,dc=example,dc=com" "(objectClass=person)" cn

인증이 필요한 경우

#  ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "ou=IT,dc=example,dc=com" "(objectClass=person)" cn

  -x : 간편 인증 / -W 비밀번호 묻기

  -b : 검색 기준(Base DN)

  -D : Bind DN 로그인 계정 주소 

  (objectClass=Person) : 인원객체를 검색(추가 검색 조건 추가가능

   ex>이름(cn)이 홍길동일 경우 (&(objectClass=Person)(cn=홍길동))

  cn : 조회결과 속성

 

메일링 그룹을 만들시 goupofNames 또는  groupOfUniqueNames 객체를 사용하여 구성

 # vi group.ldif

dn: cn=all-users,ou=Groups,dc=example,dc=com
objectClass: top
objectClass: groupOfNames
cn: all-users
description: All Users Mailing List
member: cn=John Doe,ou=IT,dc=example,dc=com
member: cn=Jane Smith,ou=HR,dc=example,dc=com
member: cn=Alice Kim,ou=Finance,dc=example,dc=com 

# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f group.ldif

그룹 멤버 추가 방법

1. 매뉴얼로 수정 처리하는 방법

 - 스크립터로 구성 가능 

 ldapsearch -x -b "dc=example,dc=com" "(objectClass=person)" dn | grep "^dn:" | awk '{print "member: "$2}''

실행시 멤버 대상으로 생성되며 이를  LDIF로 만들어 생성할 수 있음.

 

2. 특정 그룹에 포함된 모든 대상자를 자동 포함시

- 추가 스키마가 필요하므로 추가 

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif

 -  vi group.ldif

dn: cn=all-users,ou=Groups,dc=example,dc=com
objectClass: groupOfURLs
cn: all-users
memberURL: ldap:///dc=example,dc=com??sub?(objectClass=person)
description: All Users Mailing List 

# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f group.ldif 


Postfix와 연동시

 /etc/postfix/ldap-groups.cf 

server_host = ldap://localhost
search_base = ou=Groups,dc=example,dc=com
query_filter = (cn=%s)
result_attribute = member
bind = yes
bind_dn = cn=admin,dc=example,dc=com
bind_pw = yourpassword 

 

 main.cf에 적용

virtual_alias_maps = ldap:/etc/postfix/ldap-groups.cf 

a11-user@example.com으로 이메일 전송시 해당 멤버에게 자동으로 이메일 전송됨.