LDAP 是一個輕量級的名錄服務協定,常常用在帳號與密碼的統一管理。
這裡介紹如何在 Ubuntu Linux 下安裝 LDAP Server,並且使用 LDAP 來管理使用者的帳號,這裡我們選擇在常見的 OpenLDAP 作為 LDAP Server。
在 Ubuntu 下安裝 OpenLDAP 很簡單,只需要一行指令:
sudo apt-get install slapd ldap-utils
這樣就裝好了,不過接下來的設定才是重點。
首先加入可能會用到的 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 了。
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 上面的帳號,還需要一些設定,首先安裝 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
基本上,這樣就可以使用剛剛加入的新帳號登入了。
與 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 正常運作了。