Skip to Content
Infra & DevOpsCentOS의 OpenLDAP 설정과 사용자·그룹 등록
☁️ Infra & DevOps2018년 7월 25일

CentOS의 OpenLDAP 설정과 사용자·그룹 등록

#openldap#linux#authentication#infra

CentOS에서 OpenLDAP을 설치하고 사용자와 그룹을 등록했던 메모입니다. 당시에는 slapd.conf와 BDB 데이터베이스, chkconfig를 사용하는 환경이었습니다. 현재 OpenLDAP의 신규 설치 절차와는 구분해서 볼 필요가 있습니다.

설정 파일을 준비하는 단계와 LDAP에 조직·계정을 추가하는 단계가 따로 있습니다. 설정을 먼저 확인한 뒤 서비스를 시작하고, 클라이언트 명령으로 데이터를 등록하는 순서로 정리하겠습니다.

패키지와 설정 파일

당시 사용한 패키지는 서버와 클라이언트 도구입니다.

bash
sudo yum install openldap-servers openldap-clients

설치 메모에는 배포판의 slapd.conf.obsolete 예제와 DB_CONFIG.example을 복사하는 과정이 있습니다. 이 파일들의 위치와 제공 여부는 패키지 버전에 따라 다릅니다.

slapd.conf는 텍스트 설정 파일이고, slapd.d는 cn=config 방식의 설정 디렉터리입니다. 원문에는 기존 slapd.d를 비우는 명령도 있었지만, 이미 운영 중인 디렉터리를 지우는 절차로 사용해서는 안 됩니다. 먼저 현재 서비스가 어느 설정을 읽는지 확인하고 설정과 데이터를 백업해야 합니다.

관리자 DN과 검색 시작 위치

당시 설정에서는 suffix에 디렉터리의 기준 DN을, rootdn에 관리 DN을 지정했습니다. 관리 비밀번호는 slappasswd로 생성한 해시를 rootpw에 넣었습니다.

bash
slappasswd

다음은 설정의 관계를 보여 주는 발췌입니다. 스키마·데이터 경로·접근 제어를 포함한 완전한 설정 파일은 아닙니다. rootpw의 자리표시는 직접 생성한 값으로 바꿔야 합니다.

text
database bdb suffix "dc=example,dc=com" rootdn "cn=Manager,dc=example,dc=com" rootpw <slappasswd로 생성한 해시>

관리 DN을 지정하는 것과 일반 사용자에게 조회·변경 권한을 부여하는 것은 별개입니다. 접근 제어는 사용 목적에 맞춰 따로 설정해야 합니다.

설정 변환과 서비스 시작

slaptest는 기존 설정 파일을 cn=config 형식으로 변환할 때도 사용할 수 있습니다. 아래는 운영 디렉터리를 덮어쓰지 않고, 별도의 빈 디렉터리에 변환하는 예입니다.

bash
config_dir=$(mktemp -d) slaptest -f /etc/openldap/slapd.conf -F "$config_dir"

명령의 실행 권한, 참조하는 스키마와 DB 경로도 준비돼 있어야 합니다. 변환한 설정을 서비스에 적용할 때는 실행 사용자의 소유권과 접근 권한을 맞춥니다. 검증에 사용한 임시 경로가 자동으로 운영 설정이 되는 것은 아닙니다.

메모에 있던 서비스 명령은 다음과 같습니다. 실제로 사용할 설정을 배치한 뒤 시작하는 순서입니다.

bash
sudo chkconfig slapd on sudo /etc/init.d/slapd start

기본 조직과 사용자 등록

아래 예시는 접속 범위를 로컬로 제한하고 DN을 example.com으로 통일했습니다. 우선 기준 조직과 사용자·그룹을 담을 OU를 등록합니다.

ldif
base.ldif
dn: dc=example,dc=com objectClass: top objectClass: dcObject objectClass: organization o: Example dc: example dn: ou=users,dc=example,dc=com objectClass: organizationalUnit ou: users dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups
bash
ldapadd -x -H ldap://127.0.0.1 \ -D 'cn=Manager,dc=example,dc=com' -W -f base.ldif

사용자는 account와 posixAccount로 등록했습니다. UID·GID는 실제 환경에서 충돌하지 않는 값을 선택해야 합니다. 아래 10001은 예시이며 root의 UID 0을 일반 계정에 할당하지 않습니다.

ldif
user.ldif
dn: uid=test1,ou=users,dc=example,dc=com objectClass: account objectClass: posixAccount uid: test1 cn: test1 uidNumber: 10001 gidNumber: 10001 homeDirectory: /home/test1

LDAP에 이 속성을 등록하는 것만으로 OS 계정 연동이나 홈 디렉터리 생성까지 이루어지지는 않습니다. 클라이언트의 계정 조회·인증 설정은 별도입니다.

그룹과 멤버 DN

당시 그룹은 groupOfNames를 사용했고, member에는 사용자의 전체 DN을 넣었습니다.

ldif
group.ldif
dn: cn=developers,ou=groups,dc=example,dc=com objectClass: groupOfNames cn: developers member: uid=test1,ou=users,dc=example,dc=com

사용자 LDIF를 먼저 추가한 뒤 그룹을 등록합니다.

bash
ldapadd -x -H ldap://127.0.0.1 \ -D 'cn=Manager,dc=example,dc=com' -W -f user.ldif ldapadd -x -H ldap://127.0.0.1 \ -D 'cn=Manager,dc=example,dc=com' -W -f group.ldif

groupOfNames의 멤버십과 사용자 gidNumber는 같은 연결 방식이 아닙니다. 위 그룹은 POSIX 기본 그룹을 생성하는 예시가 아닙니다. Hadoop 등 연동 대상에서 어떤 objectClass와 멤버 속성을 조회하는지 맞춰야 합니다.

비밀번호 설정과 조회 확인

사용자를 추가한 뒤 비밀번호를 설정하고, 해당 사용자로 인증되는지 확인합니다.

bash
ldappasswd -x -H ldap://127.0.0.1 \ -D 'cn=Manager,dc=example,dc=com' -W -S \ 'uid=test1,ou=users,dc=example,dc=com' ldapsearch -x -H ldap://127.0.0.1 \ -D 'uid=test1,ou=users,dc=example,dc=com' -W \ -b 'dc=example,dc=com' '(uid=test1)'

이 명령은 로컬 테스트용입니다. 다른 장비와 통신할 때는 TLS와 서버 인증서 검증을 구성해야 하며, -W로 입력한다고 전송 구간이 암호화되지는 않습니다.

인증 성공과 필요한 데이터의 조회 권한도 나눠 확인해야 합니다. 관리자로 조회되는 결과가 일반 사용자에게도 그대로 보이는 것은 아닙니다.

참고 자료

Last updated on