解決問題 OpenLDAP (1)

教學目標

主要解決如何在 Red Hat Enterprise Linux 7 作業系統上安裝和設定 LDAP 伺服器的問題。

重點概念

OpenLDAP 主要為輕量型目錄存取協定的開放源始碼套件,在企業中實作 LDAP 將可以讓所有網域中的電腦從 LDAP 目錄中存取資訊,在 LDAP 目錄中主要儲存不同類型的資料,我們可以將其看成通訊錄,所以主要會包括企業員工的聯絡資訊、組織結構資訊、電腦管理資訊、憑證和金鑰、…等資訊,通常 LDAP 目錄伺服器相較於資料庫伺服器會專門針對讀的效能進行最佳化,所以一般情況下,我們會透過 LDAP 進行使用者登入機制的實作。但是我們要如何在 Red Hat Enterprise Linux 7 作業系統上安裝和設定 LDAP 伺服器,其實只要簡單三個階段即可完成 LDAP 伺服器的安裝和設定,分別為:

  1. 安裝 LDAP 伺服器
  2. 設定 LDAP 伺服器
  3. 測試 LDAP 伺服器

安裝 LDAP 伺服器

安裝 OpenLDAP 伺服器相關套件

1
$ yum install -y openldap openldap-clients openldap-servers migrationtools

複製 LDAP 資料庫範例檔。

1
2
$ cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
$ chown ldap /var/lib/ldap/DB_CONFIG

產生資料庫檔案,出現錯誤是正常(?)

1
2
3
4
$ slaptest
59924dd5 hdb_db_open: database "dc=my-domain,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).
59924dd5 backend_startup_one (type=hdb, suffix="dc=my-domain,dc=com"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)

設定 /var/lib/ldap/* 相關檔案權限

1
$ chown ldap:ldap /var/lib/ldap/*

設定和啟動 slapd 服務

1
2
$ systemctl enable slapd
$ systemctl start slapd

檢查 LDAP 啟動狀況

1
2
3
$ netstat -lt | grep ldap
tcp 0 0 0.0.0.0:ldap 0.0.0.0:* LISTEN
tcp6 0 0 [::]:ldap [::]:* LISTEN

設定 LDAP 伺服器

將 LDIF 檔案導入系統中,主要以 Cosine and Internet X.500 和 Network Information Services 綱要為主。

1
2
3
4
5
6
7
8
9
10
11
$ cd /etc/openldap/schema
$ ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"
$ ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"

建立 SSL 安全通訊協定的憑證和金鑰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ openssl req -new -x509 -nodes -out /etc/openldap/certs/certificate.pem -keyout /etc/openldap/certs/privatekey.pem -days 3650
Generating a 2048 bit RSA private key
.....................................................................+++
...................................+++
writing new private key to '/etc/openldap/certs/privatekey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank

For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----

Country Name (2 letter code) [XX]:TW
State or Province Name (full name) []:Taiwan
Locality Name (eg, city) [Default City]:Taipei
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ip-172-31-24-216.ldapserver.com
Email Address []:

設定 SSL 安全通訊協定的憑證和金鑰的權限

1
2
3
$ cd /etc/openldap/certs
$ chown ldap:ldap *
$ chmod 600 privatekey.pem

取得加密之後的密碼

1
2
3
$ slappasswd -s redhat -n > /etc/openldap/passwd
$ vi /etc/openldap/passwd
{SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

建立 changes.ldif 檔案

1
$ vi /etc/openldap/changes.ldif

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=ldapserver,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=ldapserver,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/certificate.pem

dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/privatekey.pem

dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: -1

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=ldapserver,dc=com" read by * none

將 changes.ldif 檔案導入至 LDAP 伺服器中。

1
$ ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/changes.ldif

建立 base.ldif 檔案

1
$ vi /etc/openldap/base.ldif

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dn: dc=ldapserver,dc=com
dc: ldapserver
objectClass: top
objectClass: domain

dn: ou=People,dc=ldapserver,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

dn: ou=Group,dc=ldapserver,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

將 base.ldif 檔案導入至 LDAP 伺服器中。

1
ldapadd -x -w redhat -D cn=Manager,dc=ldapserver,dc=com -f /etc/openldap/base.ldif

增加系統記錄檔

1
$ vi /etc/rsyslog.conf

1
local4.* /var/log/ldap.log

重新啟動系統記錄服務

1
$ systemctl restart rsyslog

測試 LDAP 伺服器

建立使用者帳號進行測試。

1
2
3
$ mkdir /home/guests
$ useradd -d /home/guests/ldapuser01 ldapuser01
$ passwd ldapuser01

設定 migrate_common.ph 內容

1
2
$ cd /usr/share/migrationtools
$ vi migrate_common.ph

1
2
$DEFAULT_MAIL_DOMAIN = "ldapserver.com";
$DEFAULT_BASE = "dc=ldapserver,dc=com";

在 LDAP 伺服器中建立目前的使用者與群組

1
2
3
4
5
6
7
8
9
10
$ grep ":10[0-9][0-9]" /etc/passwd > passwd
$ ./migrate_passwd.pl passwd users.ldif
$ ldapadd -x -w redhat -D cn=Manager,dc=ldapserver,dc=com -f users.ldif
adding new entry "uid=ldapserver-user,ou=People,dc=ldapserver,dc=com"
adding new entry "uid=ldapuser01,ou=People,dc=ldapserver,dc=com"
$ grep ":10[0-9][0-9]" /etc/group > group
$ ./migrate_group.pl group groups.ldif
$ ldapadd -x -w redhat -D cn=Manager,dc=ldapserver,dc=com -f groups.ldif
adding new entry "cn=ldapserver-user,ou=Group,dc=ldapserver,dc=com"
adding new entry "cn=ldapuser01,ou=Group,dc=ldapserver,dc=com"

測試 ldapuser01 使用者。

1
$ ldapsearch -x cn=ldapuser01 -b dc=ldapserver,dc=com

總結只要簡單三個階段即可在 Red Hat Enterprise Linux 7 作業系統上完成 LDAP 伺服器的安裝和設定。

相關資源