# Master Server 설정

## OpenLDAP Master Server 설정

> ***목차*** 1. package 설치 2. Openldap 초기화 1. OLC 및 ldap data 초기화 목표 2. LDAP 설정(olc) 및 LDAP data 초기화 3. LDAP client 설정 4. 초기화 확인 3. account 암호 설정 1. LDAP 관리자 암호 변경 2. Account 암호 변경

***참고!***

> 이 문서는 ***RHEL*** >=6, ***CentOS*** >=6, ***AnNyung*** >=2 에서의 설정을 테스트 하였습니다.\
> 이 문서는 ***모든 ldap data를 초기화*** 시킨 상태에서 설정하는 것을 기준으로 합니다.

### 1. package 설치

***RHEL/CentOS 참고!***

이 문서에서 설명하는 LDAP 관리도구인 ldap-auth-utils 와 ldap-auth-utils-passwd, genpasswd 패키지는 안녕 리눅스에서만 제공을 합니다. 그러므로 RHEL/CentOS 에서는 안녕 리눅스의 core package repository를 yum에 등록해 주십시오. 아래와 같이 repository를 추가를 하면, 기존의 RHEL/CentOS package를 변경 시키지 않고, 안녕 리눅스에서만 제공하는 패키지를 사용/관리 할 수 있습니다.

***RHEL/CentOS 7*** 에서는 다음과 같이 추가해 주십시오.

```bash
[root@host ~]$ cat <<EOF > /etc/yum.repos.d/AnNyung-core.repos
# AnNyung.repo
#
# LInux AnNyung 3 Yum repository
#

[AN:core]
name=AnNyung 3 Core Repository
mirrorlist=http://annyung.oops.org/mirror.php?release=3&arch=$basearch&repo=core
gpgcheck=1
gpgkey=http://mirror.oops.org/pub/AnNyung/3/RPM-GPG-KEY-AnNyung-3
exclude=php* whois httpd*
[root@host ~]$ yum clean all
```

***RHEL/CentOS 6*** 에서는 다음과 같이 추가해 주십시오.

```bash
[root@host ~]$ cat <<EOF > /etc/yum.repos.d/AnNyung-core.repos
# AnNyung.repo
#
# LInux AnNyung 2 Yum repository
#

[AN:core]
name=AnNyung 2 Core Repository
mirrorlist=http://annyung.oops.org/mirror.php?release=2&arch=$basearch&repo=core
gpgcheck=1
gpgkey=http://mirror.oops.org/pub/AnNyung/2/RPM-GPG-KEY-AnNyung-2
exclude=php* whois httpd*
[root@host ~]$ yum clean all
```

repository 준비가 다 되었다면, ldap-auth-utils 와 ldap-auth-utils-passwd 패키지를 설치 합니다. 이 패키지들을 설치를 하면, genpasswd, openldap-servers, openldap-clients 패키지가 의존성 설정으로 같이 설치가 됩니다.

```bash
[root@an3 ~]$ yum install ldap-auth-utils ldap-auth-utils-passwd
```

### 2. Openldap 초기화

> 초기화는 서버의 LDAP 설정및 데이터를 초기화 한 상태에서 진행을 하는 것을 가정 하에 진행을 합니다. 만약 다른 LDAP database를 구동하고 있다면, 이 문서를 참고하는 것을 포기 하십시오!
>
> 초기화 시에 모든 ldap database를 초기화 시켜 버립니다. 매우 주의 하십시오!!!

***openldap***&#xC740; ***splapd*** daemon을 이용하여 구동이 됩니다. 또한, 2.4.23 버전 부터는 ***slapd.conf*** 대신에 ***OLC(OnLineConfiguration, cn=config 구조)***&#xB85C; 변경이 되었습니다.

물론 기존의 ***slapd.conf***&#xB97C; migration 해 주는 방법을 제공하고 있기는 하나, 여기서는 그냥 ***OLC***&#xB97C; 이용하는 방법으로 설명을 합니다. ***AnNyung 2*** 에서도 동일하게 ***OLC*** 방식으로 설정을 해야 합니다. (RHEL 6 부터 ***OLC***&#xBC29;식으로 변경이 되었습니다.)

#### 2.1 OLC 및 ldap data 초기화 목표

ldap 초기화는 다음의 목표를 가지고 진행을 합니다.

1. ***ldap 관리자***&#xB85C; ***cn=Manager,${BASEND}*** 설정
2. ***ldap 관리자*** 암호 설정
3. UID 0 권한으로 ldap 설정 변경 시에 암호 없이 접근 가능 (-Y EXTERNAL -H ldapi:/// 권한 이용)
4. ldap log를 /var/log/slapd.log 에 남기도록 설정
5. ***ADMIN***, ***People***, ***Group*** OU(Organization Unit) 생성
   * ***Admin*** OU : ***Poeple***, ***Group*** OU를 관리하기 위한 user 및 group account
   * ***People*** OU : ldap 에서 서비스 할 user account
   * ***Group*** OU : ldap 에서 서비스 할 group account
6. host 제한 연동
7. sudo 권한 연동
8. ldap access policy
   1. ldapadmins group의 member는 ***dc=oops,dc=org*** database에 대한 모든 권한을 가진다.
   2. ldapROusers group의 member는 ***dc=oops,dc=org*** database에 대한 모든 읽기 권한을 가진다.
   3. 일반 account는 password entry만 제외하고 읽기 권한을 가진다.
   4. 일반 account는 자신의 password entry를 변경할 수 있다.
   5. anonymous account는 접근을 불허 한다.
   6. Ldap server의 system root(UID 0)는 ***cn=manager*** 와 동일한 권한을 가진다.

설치 후, 미리 등록되는 사용자 및 group은 다음과 같습니다.

1. Manager Group
   1. **ldapadmins** : ldap 관리를 할 수 있는 group
   2. **ldapROusers** : ldap 전체 data에 접근할 수 있는 readonly gruop
   3. **ldapmanagers** : ldap을 관리하기 위한 account들의 default group
   4. ldap 관리를 위해서는 사용자를 위의 세 그룹에 권한에 맞게 등록해 주면 자동으로 권한을 획득하게 됩니다.
2. Manager User
   1. **ssoadmin**
      * ldap 관리를 할 수 있는 account
      * ***ldapadmins*** gruop member
      * ***DN***: uid=ssoadmin,ou=Admin,dc=oops,dc=org
   2. **ssomanager**
      * tree 전체의 데이터에 접근 가능한 readonly account
      * ***ldapROusers*** group member
      * 인증 통합시에, 각 client 서버에서 ldap에 연결하기 위한 account
   3. **replica**
      * replication에 사용하기 위한 account (readonly account)
      * ***ldapROusers*** group member
3. System Group
   1. **ldapusers**
      * 생성할 LDAP account들의 default Group

#### 2.2 LDAP 설정(olc) 및 LDAP data 초기화

초기화는 ***ldap-auth-utils***&#xC758; ***ldap\_auth\_init*** 명령을 이용합니다.

다시 강조하지만, 이 작업은 기존의 ldap data를 제거하니, 주의 하시기 바랍니다.

먼저, ***ldap\_auth\_init***&#xB97C; 동작 시키기 위하여, slapd 서비스를 정지 시킨 후 기존의 설정을 제거합니다.

```bash
[root@an3 ~]$ service slapd stop
Redirecting to /bin/systemctl stop  slapd.service
[root@an3 ~]$ rm -rf /etc/openldap/{slapd*.conf,slapd.d}
```

설정 제거 후, ***ldap\_auth\_init***&#xB97C; 실행 시키고 다음의 과정을 진행 하십시오.

```bash
[root@an3 ~]$ ldap_auth_init
1. ldap 패키지 설치


Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.premi.st
 * epel: ftp.riken.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: mirror.premi.st
Package openldap-servers-2.4.40-9.el7_2.x86_64 already installed and latest version
Package openldap-clients-2.4.40-9.el7_2.x86_64 already installed and latest version
Nothing to do



2. syslog 설정
   . /etc/rsyslog.d/slapd.conf                                    ... Done
     Redirecting to /bin/systemctl restart  rsyslog.service
   . /etc/logrotate.d/openldap                                    ... Done


3. SLAPD 설정 및 구동
   . /etc/logrotate.d/openldap                                    ... Done
     Redirecting to /bin/systemctl restart  slapd.service

4.기본 정보 설정
   BASE DN 입력 : DC=oops,DC=org
   LDAP 관리자 암호 입력   : ****
   LDAP 관리자 암호 재입력 : ****

   결과:
           BASE           => oops
           BASE DN        => DC=oops,DC=org
           ADMIN Password => asdf
           ADMIN Password => {SSHA}pct+aDwN4y4BR3ujyxgWjUBGVqo7fg1/


5. BASE DN 설정
   . /etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif ... Done
   . /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif   ... Done
   . /etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif  ... Done
   . /etc/openldap/slapd.d/cn=config/olcDatabase={2}bdb.ldif      ... Done


6. 어드민 암호 설정
   SASL/EXTERNAL authentication started
   SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
   SASL SSF: 0
   modifying entry "olcDatabase={0}config,cn=config"
   modifying entry "olcDatabase={2}bdb,cn=config"
     Redirecting to /bin/systemctl restart  slapd.service


7. 기본 트리 구조 초기화
   adding new entry "DC=oops,DC=org"
   adding new entry "ou=Admin,DC=oops,DC=org"
   adding new entry "ou=People,DC=oops,DC=org"
   adding new entry "ou=Group,DC=oops,DC=org"
Done


8. 기본 그룹 생성
   adding new entry "cn=ldapadmins,ou=Admin,DC=oops,DC=org"
   adding new entry "cn=ldapROusers,ou=Admin,DC=oops,DC=org"
   adding new entry "cn=ldapmanagers,ou=Admin,DC=oops,DC=org"
   adding new entry "cn=ldapusers,ou=Group,DC=oops,DC=org"
   adding new entry "uid=ssoadmin,ou=Admin,DC=oops,DC=org"
   adding new entry "uid=ssomanager,ou=Admin,DC=oops,DC=org"
   adding new entry "uid=replica,ou=Admin,DC=oops,DC=org"
Done


9. LDAP 기본 설정
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
   modifying entry "olcDatabase={-1}frontend,cn=config"
Done

[root@an3 ~]$
```

#### 2.3 LDAP client 설정

초기화를 한 LDAP database 를 관리하기 위한 client 설정은 ***/etc/openldap/ldap.conf*** 와 ***/etc/openldap/ldap-auth-utils.conf*** 에서 합니다.

먼저 ***/etc/openldap/ldap.conf***&#xC5D0; ***ldap\_auth\_init***&#xC5D0;서 설정한 BASE DN과 LDAP 서버 URI를 설정 합니다.

```bash
[root@an3 ~]$ cat <<EOF >> /etc/openldap/ldap.conf
URI ldapi:///
BASE DC=oops,DC=org
EOF
[root@an3 ~]$
```

다음, ***/etc/openldap/ldap-auth-utils.conf***&#xB97C; 설정 합니다. ***ldap-auth-utils.conf*** 에서는 ***ldap\_auth\_init***&#xB85C; 초기화를 한 경우에는 별로 건드릴 것이 없습니다만, 몇몇 튜닝이 가능한 옵션에 대해서만 여기서 설명을 합니다. 자세한 사항은 "***man ldap-auth-utils.conf***" 명령으로 man page를 참조 하십시오.

***ldap-auth-utils.conf***&#xB294; ldap account를 관리하기 위한 기본 값을 지정 합니다.

***ldap-auth-utils*** 패키지에서 관리할 최소 UID/GID, 기본 Group ID, 기본 shell, home directory prefix, 암호 알고리즘, 암호 만기, 암호 복잡도 등의 설정을 가지고 있습니다.

일단, ***ldap\_auth\_init***&#xB97C; 이용하여 초기화를 한 경우, 일단 고려를 한 것은 암호 알고리즘에 대해서 고민을 해야 합니다. ***ldap-auth-utils.conf***&#xC5D0;서 암호 알고리즘은 다음의 옵션값으로 지정 합니다.

```bash
[root@an3 ~]$ cat /etc/openldap/ldap-auth-utils.conf | grep "^PASSWD_MECH"
PASSWD_MECH                  = sha512
[root@an3 ~]$
```

***ldap-auth-utils***&#xC758; 기본 암호화 알고리즘은 ***sha512***&#xB97C; 사용합니다. 그리고 RHEL/CentOS 6 이나 AnNyung 2 부터는는 ***PAM***&#xC5D0;서 기본으로 ***sha512***&#xB97C; 지원합니다. 만약 인증 통합을 할 서버들 중에 ***sha512*** 암호화를 지원하지 않는 배포본들이 있다면 ***PASSWD\_MECH***&#xC758; 값을 ***md5***&#xB85C; 변경을 하십시오.

또한, ***ISMS*** 심사에 대비하여, 암호 만기 설정이 90일로 되어 있으니, 이 기간이 너무 짧다고 생각이 되면 ***PASS\_MAX\_DAYS*** 값을 늘려 주십시오.

암호 복잡도 설정은 ***PASS\_MINLEN*** 와 ***PASS\_CLASSES*** 에서 할 수 있습니다.

> 주의!\
> 이 설정은 ***ldap account***&#xB97C; 위한 설정입니다. 즉, ***ldap\_adduser*** 명령을 이용할 경우 적용이 되는 것들로, system의 ***adduser***&#xC640;는 별개 입니다.

```bash
[root@an3 ~]$ cat /etc/openldap/ldap-auth-utils.conf
  .. 상략..
#
# Password configuration
#

# Specify the encryption method.
# support: md5, sha256, sha512
# default: sha512
#
# If there is a host that does not support sha512, please specify the md5
# for compatibility.
PASSWD_MECH                  = sha512

#
# Pasword expire configuration
#
# If the value is not specified, the value that is set to
# /etc/login.defs will be used.
#
#   PASS_MAX_DAYS   Maximum number of days a password may be used.
#   PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#   PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS                = 90
PASS_MIN_DAYS                = 0
PASS_WARN_AGE                = 7

#
# Strength of password
#
# minimum length of password
PASS_MINLEN                  = 9

# Password complexity configuration [ 0 - 4 ]
#
# vSetting of the complexity of the password. Number of the character classes.
# Character class is upper case and lower case letters, numbers and special
# characters.
PASS_CLASSES                 = 3
[root@an3 ~]#
```

### 2.4 초기화 확인

***ldap\_auth\_init***&#xC744; 이용하여 초기화를 한 후에, 다음과 같이 ldap 관리 account와 gruop, 그리고 ldap account의 default group이 잘 등록이 되었는지 확인을 합니다.

```bash
[root@an3 ~]# ldap account 확인
[root@an3 ~]$ ldapsearch -Y EXTERNAL  "(objectClass=posixAccount)" dn
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <DC=oops, DC=org> (default) with scope subtree
# filter: (objectClass=posixAccount)
# requesting: dn
#

# ssoadmin, Admin, oops.org
dn: uid=ssoadmin,ou=Admin,dc=oops,dc=org

# ssomanager, Admin, oops.org
dn: uid=ssomanager,ou=Admin,dc=oops,dc=org

# replica, Admin, oops.org
dn: uid=replica,ou=Admin,dc=oops,dc=org

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3
[root@an3 ~]$
[root@an3 ~]$ # ldap group 확인
[root@an3 ~]$ ldapsearch -Y EXTERNAL  "(objectClass=posixGroup)" dn
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <DC=oops, DC=org> (default) with scope subtree
# filter: (objectClass=posixGroup)
# requesting: dn
#

# ldapadmins, Admin, oops.org
dn: cn=ldapadmins,ou=Admin,dc=oops,dc=org

# ldapROusers, Admin, oops.org
dn: cn=ldapROusers,ou=Admin,dc=oops,dc=org

# ldapmanagers, Admin, oops.org
dn: cn=ldapmanagers,ou=Admin,dc=oops,dc=org

# ldapusers, Group, oops.org
dn: cn=ldapusers,ou=Group,dc=oops,dc=org

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4
[root@an3 ~]$
```

## 3 account 암호 설정

### 3.1 LDAP 관리자 암호 변경

LDAP 관리자라고 함은, ***slapd***&#xC758; 관리자를 말합니다.

Section 2의 작업대로 하였을 경우, LDAP의 기본 정보는 다음과 같습니다.

> ***관리자 DN*** : cn=manager,dc=oops,dc=org\
> \&#xNAN;***관리자 PW*** : asdf

***BASE DN***&#xC5D0; 설정한 account의 경우에는 ***ldappasswd*** 명령을 이용하여 변경을 할 수 있지만, LDAP 관리자의 암호는 ***slapd*** 설정 파일에 포함되어 있기 때문에 ***ldapmodify*** 명령을 이용해야 합니다.

***slappasswd*** 명령을 이용하여 암호를 encrypt 한 후에, ldif 형식을 이용하여 업데이트 할 수 있습니다.

```bash
[root@an3 ~]$ export CHGPASSWD=$(slappasswd -s 'asdf!asdf')
[root@an3 ~]$
[root@an3 ~]$ cat <<EOL | ldapmodify -Y EXTERNAL -H ldapi:///
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: ${CHGPASSWD}

dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: ${CHGPASSWD}
EOL
[root@an3 ~]$ unset CHGPASSWD
```

### 3.2 Account 암호 변경

***ldap\_auth\_init***&#xC73C;로 LDAP database를 초기화를 하면, 기본적으로 ***ssoadmin***, ***ssomanager***, ***replica*** account가 암호 없이 생성이 됩니다. 특히 ***ssoadmin***&#xC758; 경우에는 ***BASE DN***&#xC758; 데이터를 변경할 수 있는 권한을 가지고 있고, ***ssomanager*** 와 ***replica*** account는 인증 통합시에 사용하는 권한이기 때문에 데이터베이스 전반에 대한 read 권한을 가지고 있습니다.

그러므로, ***ldap\_auth\_init***&#xC73C;로 데이터베이스를 초기화 했을 경우, 꼭 이 3 계정의 암호를 지정해 주어야 합니다.

암호 변경은 ***ldap\_passwd*** 명령을 이용합니다. ***openldap***&#xC758; ***ldappasswd***&#xC640; 비슷하니 주의 하십시오. ***ldap\_passwd***&#xB294; root 권한으로 실행을 해야 하며, 보안 상 ***localhost***&#xC758; ldap database만 관리할 수 있습니다.

***ldap\_passwd***&#xB97C; 사용할 경우, account는 ***"ACCOUNT\@DOMAIN"***&#xC758; 형식을 사용합니다. 즉, ***BASE DN***&#xC774; ***DC=oops,DC=org*** 라면, ***DOMAIN***&#xC740; ***oops.org***&#xAC00; 됩니다.

ssoadmin, ssomanager, replica account의 OU는 People이 아니라 Admin 이기 때문에 ***-u*** 옵션으로 OU를 변경해 줘야 합니다. -u 옵션을 주지 않으면 기본으로 People OU를 사용하게 됩니다.

```bash
[root@an3 ~]$ # ssoadmin account 암호 변경
[root@an3 ~]$ ldap_passwd -u Admin ssoadmin@oops.org
New password     : ***********
Re-New password  : ***********

Your Informations:

    * Account: ssoadmin@oops.org
    * RDN : uid=ssoadmin,ou=Admin,dc=oops,dc=org
    * Host: ldapi:///
    * Privilieges: -Y EXTERNAL
    * Commnad: /usr/bin/ldapmodify -H "ldapi:///" -Y EXTERNAL
    * Hash: {CRYPT}$6$nTeAanL57QGjvsdv$fd6YrbOqI4hFTJEZxm5GIuu8HUGMfcNz6Tx0AmaEsC78TJ0SBh/lEYqCI1KP.95H3TeTBsA1wX7nBnprwv0Hz0

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "uid=ssoadmin,ou=Admin,dc=oops,dc=org"

0
Done
[root@an3 ~]$
[root@an3 ~]$ # ssomanager account 암호 변경
[root@an3 ~]$ ldap_passwd -u Admin ssomanager@oops.org
New password     : ***********
Re-New password  : ***********

Your Informations:

    * Account: ssoadmin@oops.org
    * RDN : uid=ssomanager,ou=Admin,dc=oops,dc=org
    * Host: ldapi:///
    * Privilieges: -Y EXTERNAL
    * Commnad: /usr/bin/ldapmodify -H "ldapi:///" -Y EXTERNAL
    * Hash: {CRYPT}$6$htk01t9cUA5aFM/a$9H4.kig058cRESS6MGdjn8armHHP6IAQO9Qykr6iroW9laqugz.bIOPNzBUgk8N4H01QkeklEwQg05FBzSrfz/

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "uid=ssoadmin,ou=Admin,dc=oops,dc=org"

0
Done
[root@an3 ~]$
[root@an3 ~]$ # replica account 암호 변경
[root@an3 ~]$ ldap_passwd -u Admin replica@oops.org
New password     : ***********
Re-New password  : ***********

Your Informations:

    * Account: ssoadmin@oops.org
    * RDN : uid=replica,ou=Admin,dc=oops,dc=org
    * Host: ldapi:///
    * Privilieges: -Y EXTERNAL
    * Commnad: /usr/bin/ldapmodify -H "ldapi:///" -Y EXTERNAL
    * Hash: {CRYPT}$6$Qo.Btjze5bY/pXGl$zUltslxPOandgoPrXb3OkESk5R7pgqAmU.Q8gGsbYxGPsx9mMnSEWVH/kdHuW4Gn7lIIBx5zr260LRoxPSMWL.

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "uid=ssoadmin,ou=Admin,dc=oops,dc=org"

0
Done
[root@an3 ~]$
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://joungkyun.gitbook.io/annyung-3-user-guide/chapter2/chapter2-3-auth-integrate/chapter2-3-auth-integrate-openldap/chapter2-3-auth-integrate-openldap-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
