技術討論區 > LDAP 討論區

LDAP over TLS

(1/3) > >>

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] 文章列表

[#] 下頁

前往完整版本