LDAP服務(wù)器的主要思想是將一個(gè)用戶(hù)的所有信息(聯(lián)系人詳細(xì)信息、登錄、密碼、權(quán)限)放在一個(gè)位置,這樣網(wǎng)絡(luò)管理員就更容易維護(hù)它。例如,您可以:1。使用相同的登錄名/密碼登錄到局域網(wǎng)和本地計(jì)算機(jī)上的。2。給一組用戶(hù)提供特定的權(quán)限。例如,有些可以訪問(wèn)內(nèi)部網(wǎng)的特定頁(yè)面,也可以訪問(wèn)共享驅(qū)動(dòng)器上的特定目錄。三.以O(shè)utlook為例,獲取公司中所有人的聯(lián)系方式。
1.LDAP目錄服務(wù)可以有效地解決眾多網(wǎng)絡(luò)服務(wù)的用戶(hù)賬戶(hù)問(wèn)題。
2.LDAP目錄服務(wù)規(guī)定了統(tǒng)一的身份信息數(shù)據(jù)庫(kù)、身份認(rèn)證機(jī)制和接口,實(shí)現(xiàn)了資源和信息的統(tǒng)一管理,保證了數(shù)據(jù)的一致性和完整性。
3.LDAP目錄服務(wù)是以樹(shù)狀的層次結(jié)構(gòu)來(lái)描述數(shù)據(jù)信息的,此種模型適應(yīng)了眾多行業(yè)應(yīng)用的業(yè)務(wù)組織結(jié)構(gòu)。[1]
跨平臺(tái)
可以在任何計(jì)算機(jī)平臺(tái)上,用很容易獲得的而且數(shù)目不斷增加的LDAP的客戶(hù)端程序訪問(wèn)LDAP目錄。而且也很容易定制應(yīng)用程序?yàn)樗由螸DAP的支持。
LDAP協(xié)議是跨平臺(tái)的和標(biāo)準(zhǔn)的協(xié)議,因此應(yīng)用程序就不用為L(zhǎng)DAP目錄放在什么樣的服務(wù)器上操心了。實(shí)際上,LDAP得到了業(yè)界的廣泛認(rèn)可,因?yàn)樗荌nternet的標(biāo)準(zhǔn)。產(chǎn)商都很愿意在產(chǎn)品中加入對(duì)LDAP的支持,因?yàn)樗麄兏静挥每紤]另一端(客戶(hù)端或服務(wù)端)是怎么樣的。LDAP服務(wù)器可以是任何一個(gè)開(kāi)發(fā)源代碼或商用的LDAP目錄服務(wù)器(或者還可能是具有LDAP界面的關(guān)系型數(shù)據(jù)庫(kù)),因?yàn)榭梢杂猛瑯拥膮f(xié)議、客戶(hù)端連接軟件包和查詢(xún)命令與LDAP服務(wù)器進(jìn)行交互。與LDAP不同的是,如果軟件產(chǎn)商想在軟件產(chǎn)品中集成對(duì)DBMS的支持,那么通常都要對(duì)每一個(gè)數(shù)據(jù)庫(kù)服務(wù)器單獨(dú)定制。
企業(yè)內(nèi)部需要認(rèn)證的服務(wù)很多,員工需要記住很多的密碼, 即使對(duì)這些服務(wù)進(jìn)行相同的密碼設(shè)置,也存在很大的安全隱患。筆者目前工作的企業(yè)就是如此,每一個(gè)新員工的到來(lái)管理員都要初始化很多密碼,而這些密碼都被設(shè)置成了“888888”等弱密碼,由于各種軟件的認(rèn)證機(jī)制之間沒(méi)有使用一個(gè)統(tǒng)一的標(biāo)準(zhǔn),員工無(wú)法一次性修改所有服務(wù)的密碼,這導(dǎo)致很多即使是入職很久的員工都還在使用這個(gè)“眾所周知”的密碼。
另外—個(gè)比較嚴(yán)重的問(wèn)題出現(xiàn)在公司增加內(nèi)部服務(wù)的時(shí)候,例如領(lǐng)導(dǎo)要在公司內(nèi)部提供郵件服務(wù)或把現(xiàn)有的Proftpd 換成更高效的Vsftpd,管理員需要重新為所有的員工初始化新的賬戶(hù)信息,對(duì)于一個(gè)有上千員工的企業(yè)來(lái)說(shuō)這將是一個(gè)“災(zāi)難”。
如果可以為各種軟件提供一個(gè)標(biāo)準(zhǔn)的認(rèn)證機(jī)制,所有軟件就可以不再用獨(dú)有的用戶(hù)管理方法, 而是通過(guò)這種統(tǒng)一的認(rèn)證機(jī)制進(jìn)行用戶(hù)認(rèn)證,這樣就解決了目前很多企業(yè)遇到的問(wèn)題。LDAP正是這樣一種標(biāo)準(zhǔn)的協(xié)議,LDAP的歷史可以追溯到1988年,之后誕生的很多軟件基本上都支持這個(gè)協(xié)議。近年隨著企業(yè)對(duì)LDAP需求的不斷增加,絕大多數(shù)有認(rèn)證機(jī)制的軟件都會(huì)首先提供對(duì)LDAP的支持。本文將介紹通過(guò)LDAP統(tǒng)一身份認(rèn)證的方法,以簡(jiǎn)化這種復(fù)雜的管理過(guò)程。
LDAP概述
LDAP是Light weight Directory Access Protocol(輕量級(jí)目錄訪問(wèn)協(xié)議)的縮寫(xiě),其前身是更為古老的DAP協(xié)議。它是基于X.500標(biāo)準(zhǔn)的,但是很簡(jiǎn)單,并且可以根據(jù)需要定制。與X.500不同,LDAP支持TCP/IP,這對(duì)訪問(wèn)Internet是必需的。LDAP的核心規(guī)范在RFC中都有定義, 大體上講LDAP協(xié)議定義了和后臺(tái)數(shù)據(jù)庫(kù)通信的方法及客戶(hù)端軟件和LDAP協(xié)議之間的通信標(biāo)準(zhǔn),如圖1所示(更詳細(xì)的說(shuō)明可以參見(jiàn)相關(guān)的RFC文檔)。
?
圖1? 客戶(hù)端、LDAP Server的關(guān)系
在圖1中,LDAP Client指各種需要身份認(rèn)證的軟件,例如Apache、Proftpd和Samba等。LDAP Sever指的是實(shí)現(xiàn)LDAP協(xié)議的軟件,例如OpenLDAP等。Datastorage指的是OpenLDAP的數(shù)據(jù)存儲(chǔ),如關(guān)系型數(shù)據(jù)庫(kù)(MySQL)或查詢(xún)效率更高的嵌入式數(shù)據(jù)庫(kù)(BerkeleyDB),甚至是平面文本數(shù)據(jù)庫(kù)(—個(gè)txt的文本文件)??梢?jiàn),OpenLDAP軟件只是LDAP協(xié)議的一種實(shí)現(xiàn)形式,并不包括后臺(tái)數(shù)據(jù)庫(kù)存儲(chǔ)。但在很多時(shí)候管理員經(jīng)常將LDAP Server和DataStorage放在同一臺(tái)服務(wù)器,這樣就產(chǎn)生了人們通常所說(shuō)的“LDAP數(shù)據(jù)庫(kù)”。雖然后臺(tái)數(shù)據(jù)庫(kù)(backend)可以是多種多樣,但LDAP協(xié)議還規(guī)定了數(shù)據(jù)的存儲(chǔ)方式。LDAP數(shù)據(jù)庫(kù)是樹(shù)狀結(jié)構(gòu)的,與DNS類(lèi)似,如圖2所示。
?
圖2 跨國(guó)公司員工信息的樹(shù)狀邏輯結(jié)構(gòu)
在圖中,以這種方式存儲(chǔ)數(shù)據(jù)最大的一個(gè)好處就是查詢(xún)速度快,LDAP數(shù)據(jù)庫(kù)專(zhuān)門(mén)對(duì)讀操作進(jìn)行了優(yōu)化, OpenLDAP配合Berkeley DB可使其讀操作的效率得到很大提高。LDAP數(shù)據(jù)庫(kù)的樹(shù)狀結(jié)構(gòu)的另一個(gè)好處是便于分布式的管理,有關(guān)這方面的內(nèi)容將在后面有所介紹。
實(shí)現(xiàn)思路
統(tǒng)一身份認(rèn)證主要是改變?cè)械恼J(rèn)證策略,使需要認(rèn)證的軟件都通過(guò)LDAP進(jìn)行認(rèn)證,如圖3所示。在統(tǒng)一身份認(rèn)證之后,用戶(hù)的所有信息都存儲(chǔ)在LDAP Server中。終端用戶(hù)在需要使用公司內(nèi)部服務(wù)的時(shí)候,都需要通過(guò)LDAP服務(wù)器的認(rèn)證。每個(gè)員工只需要記住一個(gè)密碼,在需要修改用戶(hù)信息的時(shí)候可以通過(guò)管理員提供的Web界面直接修改LDAP Server中的信息。
經(jīng)過(guò)2天的摸索,基本把ldap理明白了。下面是ldap在centos7上的安裝步驟,包括與samba和NFS使用ldap認(rèn)證的配置。中間遇到許多坑,會(huì)在其他文章里介紹。
為什么要用ldap呢?
ldap主要用作統(tǒng)一認(rèn)證服務(wù)器,samba和nfs提供文件共享的服務(wù)。比如要使用samba做文件共享,在windows中訪問(wèn)共享文件是需要輸入用戶(hù)名密碼,驗(yàn)證通過(guò)后才可以讀或者寫(xiě)文件。在未配置ldap服務(wù)器以前,samba用戶(hù)信息在本地保存,也就是說(shuō)如果有多個(gè)samba服務(wù)器則需要在多臺(tái)機(jī)器上重復(fù)建立認(rèn)證賬戶(hù)信息,管理不方便。建立ldap后就可以將需要認(rèn)證的用戶(hù)全部放到ldap服務(wù)器上,這樣就可以避免重復(fù)建立samba的認(rèn)證賬戶(hù),方便統(tǒng)一管理賬戶(hù)信息。
不管有沒(méi)有配置ldap,samba的用戶(hù)認(rèn)證都有自己獨(dú)立的一套密碼與系統(tǒng)用戶(hù)和ldap用戶(hù)分開(kāi)管理,提高安全性,在ldap中samba密碼是用戶(hù)類(lèi)的一個(gè)屬性。本人曾經(jīng)嘗試使用ldap用戶(hù)密碼或者系統(tǒng)密碼認(rèn)證samba,包括使用插件或者PAM認(rèn)證,但是均為成功,目前只發(fā)現(xiàn)可以雙向同步samba和系統(tǒng)用戶(hù)密碼的配置或者插件(samba-tools)。
ftp服務(wù)器用過(guò)的肯定不少,雖然可能有很多公司已經(jīng)摒棄不用,網(wǎng)上也有很多其他方案可以替代,但是還是有些特別的用途,還是有一定的用武之地的。在部署了ldap之后,我們當(dāng)然想盡可能多的將生產(chǎn)范圍內(nèi)的其他系統(tǒng)或應(yīng)用的認(rèn)證都對(duì)接到ldap上來(lái),所以這一次來(lái)使用ldap認(rèn)證登錄vsftp。
1、準(zhǔn)備工作
1
2
3
4
5
6
7
8
9
|
#停止iptables,并查看iptables狀態(tài) /etc/init .d /iptables ?stop iptables?-L?-n #禁用SELinux,并查看SELinux狀態(tài) setenforce?0 getenforce #編輯/etc/hosts,添加openldap?server的記錄 echo ?"192.168.49.138???ldapsrv01.contoso.com" ?>> /etc/hosts #添加成功后,最好ping一下,看是否能解析正常 |
2、安裝相關(guān)的軟件包
1
2
|
yum?-y? install ?vsftpd? ftp yum?-y? install ?nss-pam-ldapd?pam_ldap |
3、配置/etc/pam_ldap.conf
[root@server136 ~]# cp /etc/pam_ldap.conf?/etc/pam_ldap.conf.bak$(date +%F)
[root@server136 ~]# egrep -v "#|^$" /etc/pam_ldap.conf
host 127.0.0.1
base dc=example,dc=com
[root@server136 ~]# sed -i '/^host/s/host/#host/' /etc/pam_ldap.conf
[root@server136 ~]# sed -i '/^base/s/base/#base/' /etc/pam_ldap.conf
[root@server136 ~]# egrep -v "#|^$" /etc/pam_ldap.conf
[root@server136 ~]# echo "host ?192.168.49.138" >>/etc/pam_ldap.conf
[root@server136 ~]# echo "base ?dc=contoso,dc=com" >>/etc/pam_ldap.conf
[root@server136 ~]# echo "binddn ?cn=admin,dc=contoso,dc=com" >>/etc/pam_ldap.conf
[root@server136 ~]# echo "bindpw ?123456" /etc/pam_ldap.conf
[root@server136 ~]# egrep -v "#|^$" /etc/pam_ldap.conf
host ?192.168.49.138
base ?dc=contoso,dc=com
binddn ?cn=admin,dc=contoso,dc=com
bindpw ?123456
4、配置/etc/vsftpd/vsftpd.conf
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak$(date +%F)
vi /etc/vsftpd/vsftpd.conf
[root@server136 ~]# diff /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak2016-09-12
12c12
< anonymous_enable=NO
---
> anonymous_enable=YES
28d27
< anon_upload_enable=YES
33d31
< anon_mkdir_write_enable=YES
103,104d100
< chroot_local_user=YES
< #
124,126d119
< guest_enable=YES
< guest_username=ftp
< local_root=/opt/data
5、配置/etc/pam.d/vsftpd
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak$(date +%F)
[root@server136 ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
session ? ?optional ? ? pam_keyinit.so ? ?force revoke
session ? ?optional ? ? pam_ldap.so
auth ? ? ? sufficient ? pam_ldap.so
auth ? ? ? required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth ? ? ? required pam_shells.so
auth ? ? ? include password-auth
account ? ?sufficient ? pam_ldap.so
account ? ?include password-auth
session ? ?required ? ? pam_loginuid.so
session ? ?include password-auth
password ? required ? ? pam_ldap.so
6、創(chuàng)建ftp根目錄并啟動(dòng)vsftpd服務(wù)
1
2
3
4
|
mkdir ?-p? /opt/data chown ?-R? ftp : ftp ?/opt/data chkconfig?vsftpd?on /etc/init .d /vsftpd ?start |
7、使用ftp客戶(hù)端測(cè)試
[root@server136 ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (127.0.0.1:root): charleslv
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
#ldap用戶(hù)登錄成功
[root@server136 ~]# useradd user1
[root@server136 ~]# echo "111111" |passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@server136 ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (127.0.0.1:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
#本地用戶(hù)登錄成功
你基于 SQL 數(shù)據(jù)庫(kù)也要重新發(fā)明一套從 SQL 映射出樹(shù)形結(jié)構(gòu)并進(jìn)行查詢(xún)的方式
你基于 Web 也好 HTTP 也好還是需要重新定義一套 API 去查詢(xún)樹(shù)形的層級(jí)數(shù)據(jù)
LDAP 是一個(gè)被廣泛支持的、用于存儲(chǔ)和查詢(xún)樹(shù)形結(jié)構(gòu)的協(xié)議,它的價(jià)值就是「廣泛接受的標(biāo)準(zhǔn)」
在一個(gè)沒(méi)有閉源商業(yè)系統(tǒng)必須通過(guò) LDAP (以及 Kerberos、Radius 等等等等)整合的理想環(huán)境里你當(dāng)然可以全部走 web 協(xié)議,比如全套 Google Apps + OAuth 認(rèn)證連接 GitHub 的 web IDE 什么的——樓上某位要是活在這樣的環(huán)境請(qǐng)?jiān)试S我羨慕一下。
但是,考慮到這套服務(wù)的通用性,易用性,balabala,還是會(huì)考慮LDAP。
(簡(jiǎn)單粗暴的)分析:
如果使用數(shù)據(jù)庫(kù),你準(zhǔn)備讓使用服務(wù)的人如何接入?1給他開(kāi)數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限?那你是不是還得提供準(zhǔn)確的sql查詢(xún)腳本?2在數(shù)據(jù)庫(kù)之上,提供一套web服務(wù)?那接入方要嚴(yán)格按照你的api對(duì)接咯。這樣接入方更換認(rèn)證服務(wù)的時(shí)候,很可能是不統(tǒng)一的api,想想都麻煩。
認(rèn)證服務(wù)是LDAP的話(huà),接入方的平臺(tái)確認(rèn)了之后,接入調(diào)用的api就是確定的,只要更換服務(wù)的地址,目錄的信息就可以了,是不是簡(jiǎn)單很多。