在 Debian 7.7 系統中轉移 NIS 到 LDAP

By Shaform, Sat 13 December 2014, in category Notes

Debian, LDAP, linux, NIS, SSH

本文件紀錄了基本的 LDAP 設置。

設定 LDAP Master

基本設置

首先編輯 /etc/ldap/ldap.conf 填上適當的網域名稱。例如:

BASE    dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw
URI     ldap://ldap.lab.csie.ntu.edu.tw

其中 URI 必須是可以連上 Master server 的 IP 或網域名稱。

緊接著,安裝 OpenLDAP:

sudo apt-get install slapd ldap-utils

此時它只會要你設定一個 admin 密碼,如果希望看到完整設定,可以事先執行以下指令,並設定 Dialog 為不高於 Medium 的層級。不過我偏好不改動這個設定,而是事後再重新執行設定程式。

sudo dpkg-reconfigure debconf

事後重新設定的指令則是:

sudo dpkg-reconfigure slapd

可按照喜好自行設定,但 domain name 要跟 /etc/lapd/lapd.conf 一致:

Omit OpenLDAP server configuration? No
DNS domain name: lab.csie.ntu.edu.tw
Organization name: lab.csie.ntu.edu.tw
Administrator password: <PASSWORD>
Confirm password: <PASSWORD>
Database backend to use: HDB
Do you want the database to be removed when slapd is purged? No
Move old database? Yes
Allow LDAPv2 protocol? No

以後如果想重設 LDAP 也可重新執行上述指令。他會將 old database 移動到 /var/backups 資料夾,不過如果已經移動過一次則指令會失敗,此時可先手動砍除舊的 /var/backups/<ldap directory>

可以執行以下兩個指令來確認設置成功:

ldapsearch -x
slapcat

轉移 NIS 資料

首先安裝轉移工具組:

sudo apt-get install migrationtools

接著編輯設定檔 /usr/share/migrationtools/migrate_common.ph

# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "lab.csie.ntu.edu.tw";
# Default base
$DEFAULT_BASE = "dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw";
...
# Uncomment these to exclude Debian-managed system users and groups
$IGNORE_UID_BELOW = 1000;
# Don't uncomment this if you want to be able to add users to system groups
# $IGNORE_GID_BELOW = 1000;
# And here's the opposite for completeness
$IGNORE_UID_ABOVE = 29999;
$IGNORE_GID_ABOVE = 29999;

由於 Debian 的 LDAP 預設並沒有載入 misc.schema,所以如果要讀入 alias 資料就會出錯。因此我們只手動載入需要的部份,而不使用自動載入全部資料的方法。進入 /usr/share/migrationtools/ 資料夾後執行以下指令:

# create basic data
./migrate_base.pl | ldapadd -x -W -h localhost -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" -c

# migrate passwd
./migrate_passwd.pl /etc/passwd | ldapadd -x -W -h localhost -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" -c

# migrate group
./migrate_group.pl /etc/group | ldapadd -x -W -h localhost -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" -c

執行 migrate_base.pl 會有部份內容無法處理是正常的。

設定 LDAP Client

在要透過 LDAP 登入的主機上進行以下步驟,若 LDAP Master server 本身也想透過 LDAP 登入的話,也是採用相同辦法。首先安裝相關程式

sudo apt-get install libpam-ldapd libnss-ldapd nslcd

並回答相關問題:

LDAP server URI: <this answer is the same as what you put in '/etc/ldap/ldap.conf'>
ldap://ldap.lab.csie.ntu.edu.tw/

LDAP server search base:
dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw

Name services to configure:
group, password, shadow

接著如果要讓 root 可以在不輸入 LDAP 密碼的情況下修改別人密碼,則可修改 /etc/nslcd.conf,其中 rootpwmodpw 設為之前選擇的 LDAP 密碼:

ldap_version 3
rootpwmoddn cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw
rootpwmodpw <PASSWORD>

如果要讓 client 也能執行 ldapsearch 等指令,也可依 master 的方法修改 /etc/lapd/lapd.conf

可重新開機測試是否成功。

TLS 加密連線

以上的作法,在連線時不夠安全,因此我們可以啟用 TLS 加密連線。

建立憑證

假設你有可供使用的憑證當然很好,但是一般人除了等待 Let's Encrypt 以外,可能也只能自己的憑證自己建了。

在某個資料夾內建立相關憑證:

openssl genrsa -out my_root_key.pem 1024
openssl req -new -key my_root_key.pem -out my_root_csr.pem
openssl x509 -req -days 36500 -in my_root_csr.pem -signkey my_root_key.pem -out my_root_crt.pem

openssl genrsa -out ldap_key.pem 1024
openssl req -new -key ldap_key.pem -out ldap_csr.pem

openssl x509 -req -days 36500 -in ldap_csr.pem -CA my_root_crt.pem -CAkey my_root_key.pem -out ldap_crt.pem -set_serial 1

其中的資訊可以隨意填,但在建立 ldap_csr.pem 時,Common Name 一定要填 client 可以連到的,LDAP master server 的 domain name:

Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NTU Lab
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:ldap.lab.csie.ntu.edu.tw
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

然後在 master 上建立一個資料夾,並將相關檔案複製,設定適當的權限:

sudo mkdir /etc/ldap/ssl
sudo cp ldap_key.pem ldap_crt.pem /etc/ldap/ssl
sudo mkdir /usr/share/ca-certificates/my/
sudo cp my_root_crt.pem /usr/share/ca-certificates/my/my_root.crt
sudo chmod 644 /usr/share/ca-certificates/my/my_root.crt
sudo dpkg-reconfigure ca-certificates # choose to add my/my_root.crt
sudo update-ca-certificates

sudo chown -R root:openldap /etc/ldap/ssl
sudo chmod -R o-rwx /etc/ldap/ssl

然後在所有 client 上也可以複製 my_root_crt.pem

sudo cp my_root_crt.pem /usr/share/ca-certificates/my/my_root.crt
sudo chmod 644 /usr/share/ca-certificates/my/my_root.crt
sudo dpkg-reconfigure ca-certificates # choose to add my/my_root.crt
sudo update-ca-certificates

小心收藏剩餘的 key.pem,不要讓別人看到囉。

設定 LDAP Master Server

注意,這裡的設定若一不小心可能導致 LDAP server 無法運作,故設定時最好先備份所有檔案。

首先在 master 上更改 /etc/default/slapd,將 LAPD_SERVICES 改成以下內容,也就是只允許本機不透過 TLS 連線:

SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"

緊接著建立一個 tls.ldif 檔案:

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca-certificates.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap_crt.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap_key.pem

並套用設定:

ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif

同時更改 /etc/ldap/ldap.conf

URI     ldaps://ldap.lab.csie.ntu.edu.tw
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt

最後重新啟動 ldap:

sudo service slapd restart

設定 LDAP Client

修改 /etc/nslcd.conf

uri ldaps://ldap.lab.csie.ntu.edu.tw
#ssl off
tls_reqcert demand
tls_cacertfile /etc/ssl/certs/ca-certificates.crt

重啟服務:

sudo service nslcd restart

可測試是否可以登入。