分類: Linux

Ubuntu Linux 安裝 LDAP Server

LDAP 是一個輕量級的名錄服務協定,常常用在帳號與密碼的統一管理。

這裡介紹如何在 Ubuntu Linux 下安裝 LDAP Server,並且使用 LDAP 來管理使用者的帳號,這裡我們選擇在常見的 OpenLDAP 作為 LDAP Server。

安裝 OpenLDAP

在 Ubuntu 下安裝 OpenLDAP 很簡單,只需要一行指令:

sudo apt-get install slapd ldap-utils

這樣就裝好了,不過接下來的設定才是重點。

設定 OpenLDAP

首先加入可能會用到的 schema 檔案:

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

接著建立一個 backend.example.com.ldif 檔案,檔案內容如下:

# Load dynamic backend modules
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb.la

# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=example,dc=com
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=example,dc=com
olcRootPW: {SSHA}WPhI83F/giL3b9mEk94lX5Ua1mMh7bJy
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=example,dc=com" write by * read

其中 olcRootPW: {SSHA}WPhI83F/giL3b9mEk94lX5Ua1mMh7bJy 是經過 SSHA 編碼後的管理者密碼,可以使用 slappasswd 來產生,例如:

slappasswd -s my_password

請自行將這個部分替換成自己設定的密碼。另外 backend.example.com.ldif 中 類似 dc=example,dc=com 這種設定也都要記得換成自己的設定。

接著加入這個 LDIF:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f backend.example.com.ldif

這樣基本的 LDAP Server 就設定好了,接著就是要建立管理 Linux 帳號用的 LDAP Tree 了。

使用 ldapscripts 管理帳號

ldap-utils 套件中雖然已經有一些 LDAP 的管理工具,但是要使用那些基本的工具來管理 LDAP,實在很麻煩,尤其是要編寫 LDIF 檔案與執行一大堆很長的指令,很不方便,若沒有特殊需求的話,可以使用 ldapscripts 來管理使用者帳號比較方便,這是一個專門用來管理 LDAP 中的使用者帳號的工具集。安裝也很簡單,一行搞定:

sudo apt-get install ldapscripts

接著設定 ldapscripts,其設定檔是 /etc/ldapscripts/ldapscripts.conf,裡面其實都有寫好的範例與詳細的說明,只要把要用的設定注解拿掉就行了,基本上需要更動的地方大概也下面幾個:

SERVER=localhost
BINDDN='cn=admin,dc=example,dc=com'
BINDPWDFILE="/etc/ldapscripts/ldapscripts.passwd"
SUFFIX='dc=example,dc=com'
GSUFFIX='ou=Groups'
USUFFIX='ou=People'
MSUFFIX='ou=Computers'
GIDSTART=10000
UIDSTART=10000
MIDSTART=10000

這裡同樣要記得將 dc=example,dc=com 更改成自己的設定。另外新使用者的密碼設定方式,可以依照您的需求自行更改,筆者自己是喜歡用 pwgen 來產生亂數作為密碼(當然要先裝 pwgen),就加入:

PASSWORDGEN="pwgen"

這樣在新增使用者時,就會使用 pwgen 自動產生密碼,但是通常管理者要將設定好的密碼記下來並交給實際的使用者使用,如果要儲存心使用者的密碼,可以加入 RECORDPASSWORDS 參數,並設定將密碼存進 /var/log/ldapscripts_passwd.log

RECORDPASSWORDS="yes"
PASSWORDFILE="/var/log/ldapscripts_passwd.log"

這樣在新增完使用者之後,就會自動將使用者的密碼存進這個 log 檔,而管理者就可以使用類似 Perl 等工具,將帳號密碼整理後交給使用者了,但是儲存密碼是比較危險的動作,所以自己要注意這個檔案的安全,最好在使用完後就刪除。

設定完 ldapscripts.conf 後,再將 LDAP 管理者的密碼存入 /etc/ldapscripts/ldapscripts.passwd 檔案中(對應上面的 BINDPWDFILE),並且設定這個檔案只有 root 能夠讀取:

sudo sh -c "echo -n 'my_password' > /etc/ldapscripts/ldapscripts.passwd"
sudo chmod 400 /etc/ldapscripts/ldapscripts.passwd

這樣 ldapscripts 就設定好了,接著使用 ldapinit 初始化 LDAP:

sudo ldapinit

這個指令會建立一個最基本的 tree,用來存放帳號的相關資訊,接著就可以開始建立帳號了,首先要先建立一個群組:

ldapaddgroup mygroup

然後建立使用者帳號:

ldapadduser user01 mygroup

這樣就新的 user01 帳號就可以使用了,不過這是 LDAP Server 端的部分,若要讓 Linux 實際可以登入,還需要一些設定。

設定 Linux 系統與 LDAP 認證

要讓 Linux 系統可以使用 LDAP 上面的帳號,還需要一些設定,首先安裝 libnss-ldap

sudo apt-get install libnss-ldap

在安裝的過程系統會詢問 LDAP 的設定,請依照您自己的設定填寫,若是不幸寫錯,可以再用下面的指令重新填寫:

sudo dpkg-reconfigure ldap-auth-config

接著用 auth-client-config 設定 LDAP profile:

sudo auth-client-config -t nss -p lac_ldap

最後更新系統 PAM 認證方式:

sudo pam-auth-update

基本上,這樣就可以使用剛剛加入的新帳號登入了。

TLS 與 SSL

與 LDAP Server 連線進行認證時,會傳送帳號與密碼等相關機密資訊,若是有經過外部網路傳送,最好使用加密的連線。這裡介紹如何設定加密的 LDAP 連線。

首先安裝 gnutls-bin 套件:

sudo apt-get install gnutls-bin

建立 private key:

 sudo sh -c "certtool --generate-privkey > /etc/ssl/private/cakey.pem"

建立 /etc/ssl/ca.info 檔案,內容如下:

cn = Example Company
ca
cert_signing_key

記得將 Example Company 修改成自己的名稱。

建立 self-signed CA certificate:

sudo certtool --generate-self-signed --load-privkey /etc/ssl/private/cakey.pem --template  /etc/ssl/ca.info --outfile /etc/ssl/certs/cacert.pem

產生 Server 的 private key:

sudo sh -c "certtool --generate-privkey > /etc/ssl/private/ldap01_slapd_key.pem"

建立 /etc/ssl/ldap01.info 檔案,內容如下:

organization = Example Company
cn = ldap01.example.com
tls_www_server
encryption_key
signing_key

建立 Server 的 certificate:

sudo certtool --generate-certificate --load-privkey /etc/ssl/private/ldap01_slapd_key.pem --load-ca-certificate /etc/ssl/certs/cacert.pem --load-ca-privkey /etc/ssl/private/cakey.pem --template /etc/ssl/ldap01.info --outfile /etc/ssl/certs/ldap01_slapd_cert.pem

最後更改 LDAP Server 的設定,執行:

sudo ldapmodify -Y EXTERNAL -H ldapi:///

這時候就可以使用指令更動 LDAP Server 的設定,將下面的內容貼上去:

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap01_slapd_cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap01_slapd_key.pem

然後最後按下 Ctrl-D 離開,畫面看起來應該像這樣:


root@host # sudo ldapmodify -Y EXTERNAL -H ldapi:///
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
--
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap01_slapd_cert.pem
--
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap01_slapd_key.pem

modifying entry “cn=config”

root@host #

修改 /etc/default/slapd 中的 SLAPD_SERVICES,讓 LDAP Server 啟用加密的模式:

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

openldap 這個使用者加入 ssl-cert 群組,並設定好金鑰的權限:

sudo adduser openldap ssl-cert
sudo chgrp ssl-cert /etc/ssl/private/ldap01_slapd_key.pem
sudo chmod g+r /etc/ssl/private/ldap01_slapd_key.pem

最後重新啓動 OpenLDAP:

service slapd restart

這樣就完成了,現在就可以使用加密的 ldaps 連線了。

為了使 LDAP Client 可以正確抓到 cert,必須修改 LDAP Client 機器上的 /etc/ldap/ldap.conf,加入一行:

TLS_CACERT /etc/ssl/certs/cacert.pem

然後把剛剛在 LDAP Server 上建立的 /etc/ssl/certs/cacert.pem 複製一份到 LDAP Client 上面的這個位置,這樣就可以讓 LDAP Client 正常運作了。

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

2 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago