技術討論區 > LDAP 討論區
LDAP over TLS
Niko:
各位好,又是小弟我 :P
這次是與各位大大們分享小弟的實作成果...
關於TLS與SSL可以參考wiki的說明 → http://zh.wikipedia.org/wiki/SSL
LDAP要走TLS/SSL,也就是加密,用最最最簡單來理解的話,有兩種方式
一 : 在server上作certificate就OK
二 : server與client都要作certificate,雙方都要通過驗證才可以 (較安全)
第二點在『man slapd.conf』中有提到 :
TLSVerifyClient <level>
Specifies what checks to perform on client certificates in an incoming TLS session, if any. The <level> can be specified as one of the following keywords:
never This is the default. slapd will not ask the client for a certificate.
所以,實作部份小弟就用最簡單的方式來完成,主要目的只要能夠走TLS就好。
另外還有一個非常非常重要的觀念,只要是有關LDAP over TLS/SSL的文章裡,每位大大都會提到的 :
TLS是走port 389,SSL才是port 636,也就是 TLS → ldap://xxx.xxx.tw SSL → ldaps://xxx.xxx.tw
小弟的環境是 :
網域為split.com.tw
IP網段為192.168.1.0/24
OS統一是CentOS 6.3
DNS server一台,跑dns、dhcp服務。hostname : dns
LDAP server兩台,使用mirror mode來互相複製。hostname : ldap1、ldap2
samba server兩台,分別為PDC與BDC,另外還有nfs、heartbeat、drbd等服務。hostname : smb1、smb2
client兩台,用來做測試,分別用nslcd與sssd來加入LDAP。hostname : client、client2
1. 建立TLS憑證 (以ldap1為例,ldap2也用相同作法)
使用簡單的方法,一次把cert和key做好
--- 代碼: ---[root@ldap1 ~]# cd /etc/pki/tls/certs
--- 程式碼結尾 ---
在certs目錄下有一個『Makefile』,是製作憑證的script,先修改裡面的內容,讓製作出來的憑證有效日期加長為10年。
--- 代碼: ---[root@ldap1 certs]# vim Makefile
--- 程式碼結尾 ---
在『%.pem:』這個項目中,找到
『/usr/bin/openssl req $(UTF8) -newkey rsa:2048 -keyout $$PEM1 -nodes -x509 -days 365 -out $$PEM2 -set_serial $(SERIAL)』這一行 (約41行),把『-days 365』修改成『-days 3650』。
產生ldap1.pem憑證
--- 代碼: ---[root@ldap1 certs]# make ldap1.pem
--- 程式碼結尾 ---
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 3650 -out $PEM2 -set_serial 0 ; \
cat $PEM1 > ldap1.pem ; \
echo "" >> ldap1.pem ; \
cat $PEM2 >> ldap1.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
...........+++
......................+++
writing new private key to '/tmp/openssl.LDBJkp'
-----
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) []:IT
Common Name (eg, your name or your server's hostname) []:ldap1.split.com.tw #重要,必須是server的FQDN
Email Address []:xxxx@gmail.com
修改憑證權限
--- 代碼: ---[root@ldap1 certs]# chmod 640 ldap1.pem
[root@ldap1 certs]# chown ldap:ldap ldap1.pem
--- 程式碼結尾 ---
將ldap1的憑證與CA的憑證放到openldap的certs目錄下
--- 代碼: ---[root@ldap1 certs]# ln -s `pwd`/ldap1.pem /etc/openldap/certs/
[root@ldap1 certs]# ln -s `pwd`/ca-bundle.crt /etc/openldap/certs/
--- 程式碼結尾 ---
修改系統的啟動設定檔,開啟LDAPS的功能
--- 代碼: ---[root@ldap1 certs]# vim /etc/sysconfig/ldap
--- 程式碼結尾 ---
SLAPD_LDAPS=yes #約16行
修改slapd.conf,加入憑證路徑
--- 代碼: ---[root@ldap1 certs]# vim /etc/openldap/slapd.conf
--- 程式碼結尾 ---
約71~73行
befort
TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password
after
TLSCACertificateFile /etc/openldap/certs/ca-bundle.crt
TLSCertificateFile /etc/openldap/certs/ldap1.pem
TLSCertificateKeyFile /etc/openldap/certs/ldap1.pem
# Certificate的File和KeyFile因為在製作時都已包含在內,所以指定同一個檔案即可
使用上面作法把ldap2也搞定
2. 本機驗證
兩台都做完成後,先來試看看能不能使用TLS (目前焦點還是在ldap1、ldap2上)
修改ldap.conf
--- 代碼: ---[root@ldap1 ~]# vim /etc/openldap/ldap.conf
--- 程式碼結尾 ---
新增
TLS_REQCERT never
--- 代碼: ---[root@ldap1 ~]# ldapsearch -x -ZZ
--- 程式碼結尾 ---
如果有查詢到資料並且在log中 :
conn=1000 op=0 STARTTLS
conn=1000 op=0 RESULT oid= err=0 text=
conn=1000 fd=16 TLS established tls_ssf=256 ssf=256
有出現類似訊息,就代表已經成功走TLS了。(如果client上有設定TLS,在log中都會出現類似的訊息)
3. 設定mirror mode
在slapd.conf裡的mirror mode參數中新增內容,ldap1、ldap2都是相同設定 (另一種Syncrepl模式,只要設定consumer就好)。
小弟用先前筆記的設定截取一部份來說明 :
serverID 1
syncrepl rid=123
provider=ldap://ldap2.split.com.tw
bindmethod=simple
binddn="cn=admin2,dc=split,dc=com,dc=tw"
credentials=redhat
searchbase="dc=split,dc=com,dc=tw"
schemachecking=on
type=refreshAndPersist
retry="60 +"
starttls=yes
tls_reqcert=never
mirrormode on
完成,就是這麼簡單 :P,以下設定client的方式其實都滿簡單的,是否有成功,觀察一下log就知道了
小提醒:只要動到slapd.conf的話都必須要 :
--- 代碼: ---[root@ldap1 ~]# rm -rf /etc/openldap/slapd.d/*
[root@ldap1 ~]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
[root@ldap1 ~]# chown -R ldap:ldap /etc/openldap/slapd.d
[root@ldap1 ~]# service slapd restart
--- 程式碼結尾 ---
Samba PDC/BDC(smb1、smb2設定相同)
先編輯『/etc/openldap/ldap.conf』
加入:
TLS_REQCERT never
再修改『/etc/samba/smb.conf』
找到『ldap ssl = No』這一行,改成『ldap ssl = start tls』,
如果沒有就自己新增進去,修改完後重新啟動samba即可。
Client
這裡要分兩部份介紹,第一部份是小弟先前用手動的方式加入LDAP,採用nslcd和pam_ldap;
第二部份則是RHEL 6使用的"系統安全性服務SSSD (System Security Services Daemon)",一種管理身份驗證的機制。
client(nslcd、pam_ldap)
修改ldap.conf
--- 代碼: ---[root@client ~]# vim /etc/openldap/ldap.conf
--- 程式碼結尾 ---
新增
TLS_REQCERT never
修改nslcd.conf
--- 代碼: ---[root@client ~]# vim /etc/nslcd.conf
--- 程式碼結尾 ---
把先前的設定
ssl no
修改成
ssl start_tls
tls_reqcert never
最後修改pam_ldap.conf (與sudo有關)
--- 代碼: ---[root@client ~]# vim /etc/pam_ldap.conf
--- 程式碼結尾 ---
約263行
tls_checkpeer no
先前的設定
ssl no
改成
ssl start_tls
Client(sssd)
有兩種方法,一種是『authconfig-tui』文字介面,另一種是『authconfig-gtk』圖形介面,前提都必須要有server的cert才可以。
依照上面作法來說明,server的certificate位置應該在/etc/pki/tls/certs目錄下,先分別把兩台的certificate處理一下(以ldap1為例,ldap2也用相同作法)
--- 代碼: ---[root@ldap1 ~]# cp /etc/pki/tls/certs/ldap1.pem /etc/openldap/certs/ldap1-cert.pem
[root@ldap1 ~]# chmod 755 /etc/openldap/certs/ldap1-cert.pem
--- 程式碼結尾 ---
--- 代碼: ---[root@ldap1 ~]# vim /etc/openldap/certs/ldap1-cert.pem
--- 程式碼結尾 ---
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
只留BEGIN CERTIFICATE到END CERTIFICATE這部份就好,其他的請刪除
接著要先在client的"/etc/openldap/"目錄下新增一個"cacerts"目錄
--- 代碼: ---[root@client ~]# mkdir /etc/openldap/cacerts
--- 程式碼結尾 ---
把ldap1-cert.pem、ldap2-cert.pem複製到client的"/etc/openldap/cacerts"目錄下
--- 代碼: ---[root@ldap1 ~]# scp /etc/pki/tls/certs/ldap1-cert.pem client:/etc/openldap/cacerts
[root@ldap2 ~]# scp /etc/pki/tls/certs/ldap2-cert.pem client:/etc/openldap/cacerts
--- 程式碼結尾 ---
所有事情都做好後,在client上就用authconfig-gtk這個圖形介面來玩玩 (authconfig-tui 作法也是一樣的)
開啟後長這樣,LDAP伺服器欄位的寫法 :『ldap://ldap1.split.com.tw ldap://ldap2.split.com.tw』(因為有兩台LDAP server)
『下載CA憑證』那個不用去理它,因為我們已經把憑證放好了。之所以要手動先放置好憑證的原因就是我們有兩台LDAP server,如果先去下載ldap1-cert.pem,再去下載ldap2-cert.pem,會把原本的ldap1-cert.pem給覆蓋掉。
設定好後直接按套用,此時cacerts目錄底下會長這樣 :
到此client也算完成了,不過最後小弟還要提一個東西,那就是用sssd加入LDAP後的sudo
檢查sudo版本與檔案
--- 代碼: ---[root@client ~]# rpm -qa|grep sudo
--- 程式碼結尾 ---
sudo-1.7.4p5-11.el6.x86_64
--- 代碼: ---[root@client ~]# ls /etc/sudo-ldap.conf
--- 程式碼結尾 ---
/etc/sudo-ldap.conf
編輯sudo-ldap.conf
--- 代碼: ---[root@client ~]# vim /etc/sudo-ldap.conf
--- 程式碼結尾 ---
uri ldap://ldap1.split.com.tw ldap://ldap2.split.com.tw
sudoers_base ou=Sudoers,dc=split,dc=com,dc=tw
ssl start_tls
tls_checkpeer no
編輯nsswitch.conf
--- 代碼: ---[root@client ~]# vim /etc/nsswitch.conf
--- 程式碼結尾 ---
新增
sudoers: ldap
以上就是小弟的筆記。 ;D
參考資料 :
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1032785
http://www.study-area.org/tips/smbldap/
http://blog.jangmt.com/2012/08/centos-6-ldap-server-ldap.html
http://www.weithenn.org/cgi-bin/wiki.pl?OpenLDAP-SSL_TLS_%E8%A8%AD%E5%AE%9A
http://www.l-penguin.idv.tw/article/ldap-5.htm
https://gist.github.com/4187388
2013/01/26
補上小弟用wireshark來觀察有TLS和沒有TLS的差別
沒有TLS
TLS
wlhfor:
給大大一個讚....
treble:
滿詳細的
Niko:
謝謝treble大大!!!!
小弟就是深怕有一天忘記又剛好要用到,所以能詳細點就詳細點,不要到時看不懂自己再寫什麼...XD
然後然後.....小弟有看到重點....原來牛的大腦作者就是treble大啊!!!最近在研究freeradius,剛好有找到大大的筆記耶!!不知道能不能給我舉手發問....
treble:
我只會簡單的,不可以問太難,haha
導覽
[0] 文章列表
[#] 下頁
前往完整版本