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 新網站

5 則留言:

  1. 不好意思,想請問您有在Redhat Enterprise 6.0 or CentOS 6.0上實作出OpenLdap的教學文章?
    By 城鄉風貌

    回覆刪除
  2. 我目前比較少用 Red Hat 系列的 Linux,所以沒有在這些系統上裝過,不過我想概念上通常是差不多的。

    回覆刪除
  3. 感謝有這麼詳細的說明,請問一下你用的ubuntu是那個版本的~

    回覆刪除
  4. 這裡用的版本是 Ubuntu 10.04.4 LTS

    回覆刪除
  5. 照着你的設法
    sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif

    得的結果

    SASL/EXTERNAL authentication started
    SASL username SSF :0
    ldap_add Other (e.g,.implementation specific) error (80)


    這是正常的嗎 ?
    thanks

    回覆刪除