酷!學園
技術討論區 => LDAP 討論區 => 主題作者是: Niko 於 2013-01-22 23:07
-
各位好,又是小弟我 :P
這次是與各位大大們分享小弟的實作成果...
關於TLS與SSL可以參考wiki的說明 → http://zh.wikipedia.org/wiki/SSL (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 作法也是一樣的)
(http://i823.photobucket.com/albums/zz160/SPLIT926/auth1_zps4c33707c.jpg)
開啟後長這樣,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目錄底下會長這樣 :
(http://i823.photobucket.com/albums/zz160/SPLIT926/auth2_zps280bbd95.jpg)
到此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://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1032785)
http://www.study-area.org/tips/smbldap/ (http://www.study-area.org/tips/smbldap/)
http://blog.jangmt.com/2012/08/centos-6-ldap-server-ldap.html (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.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 (http://www.l-penguin.idv.tw/article/ldap-5.htm)
https://gist.github.com/4187388 (https://gist.github.com/4187388)
2013/01/26
補上小弟用wireshark來觀察有TLS和沒有TLS的差別
沒有TLS
(http://i823.photobucket.com/albums/zz160/SPLIT926/notls_zps5586dc0d.jpg)
TLS
(http://i823.photobucket.com/albums/zz160/SPLIT926/tls_zps3990506b.jpg)
-
給大大一個讚....
-
滿詳細的
-
謝謝treble大大!!!!
小弟就是深怕有一天忘記又剛好要用到,所以能詳細點就詳細點,不要到時看不懂自己再寫什麼...XD
然後然後.....小弟有看到重點....原來牛的大腦作者就是treble大啊!!!最近在研究freeradius,剛好有找到大大的筆記耶!!不知道能不能給我舉手發問....
-
我只會簡單的,不可以問太難,haha
-
HAHA!!!大大太謙虛了..
小弟的作法是WiFi WPA2 + eap-peap + mschap + openldap
目前大致成功,ios、android、winxp都可驗證通過並連線,但是win7就是不行 (mac手邊沒有 :P)
radius server上也出現"Sending Access-Accept",但是在win7使用內建軟體就是出現無法連線,如果用其它軟體去連線又是可以(如dlink的Wireless Connection Manager)
忘了補充,等小弟整理好後再PO上來請教大大!!!
-
是無線做802.1x嗎?因為聽很多負面的事情,所以這部份我就沒去實做了
win7應該是要最容易成功的說
-
是啊!!但是小弟用戶驗證的方式是用PEAP及MSCHAPv2來做的....
開debug模式去看,是有Access-Accept,但是win7確跟我說無法連線...冏
小弟會邊找方法邊把做法整理好再貼上來給各位大大們看看,是否哪裡有漏掉沒設定好的
-
太好了,又可以學到新東西了,期待你的實作過程
-
哇!這個不推不行!
讚~~~
-
小弟找到原因了,非常....囧
win7的問題是出在usb無線網卡的光碟driver太舊,似乎在win7上有問題,重新下載個新的就可以了.....
netman大大,小弟只是一個小小的MIS,還有許多地方要跟你們各位大大學習!!! ;D
-
太棒了
以後找相關文獻就快多了
-
太棒了
以後找相關文獻就快多了
XD,有人跟小弟說讓user越無腦越好,所以client端要改成用Captive Portal的方式,有稍微做了點功課,最簡單的方式是買台高級點的無線AP或是所謂的無線閘道器就可以辦到,但是要花錢......不過在linux上還有另外找到一個叫CoovaChilli的套件似乎就可以辦到....年關將近比較忙一點,所以還沒開始仔細研究,看來小弟的筆記又得延後了,不知道過年連假能不能完成.....