企業內部需要認證的服務很多,員工需要記住很多的密碼, 即使對這些服務進行相同的密碼設置,也存在很大的安全隱患。筆者目前工作的企業就是如此,每一個新員工的到來管理員都要初始化很多密碼,而這些密碼都被設置成了“888888”等弱密碼,由於各種軟件的認證機制之間沒有使用一個統一的標准,員工無法一次性修改所有服務的密碼,這導致很多即使是入職很久的員工都還在使用這個“眾所周知”的密碼。
另外—個比較嚴重的問題出現在公司增加內部服務的時候,例如領導要在公司內部提供郵件服務或把現有的Proftpd 換成更高效的Vsftpd,管理員需要重新為所有的員工初始化新的賬戶信息,對於一個有上千員工的企業來說這將是一個“災難”。
如果可以為各種軟件提供一個標准的認證機制,所有軟件就可以不再用獨有的用戶管理方法, 而是通過這種統一的認證機制進行用戶認證,這樣就解決了目前很多企業遇到的問題。LDAP正是這樣一種標准的協議,LDAP的歷史可以追溯到1988年,之后誕生的很多軟件基本上都支持這個協議。近年隨着企業對LDAP需求的不斷增加,絕大多數有認證機制的軟件都會首先提供對LDAP的支持。本文將介紹通過LDAP統一身份認證的方法,以簡化這種復雜的管理過程。
LDAP概述
LDAP是Light weight Directory Access Protocol(輕量級目錄訪問協議)的縮寫,其前身是更為古老的DAP協議。它是基於X.500標准的,但是很簡單,並且可以根據需要定制。與X.500不同,LDAP支持TCP/IP,這對訪問Internet是必需的。LDAP的核心規范在RFC中都有定義, 大體上講LDAP協議定義了和后台數據庫通信的方法及客戶端軟件和LDAP協議之間的通信標准,如圖1所示(更詳細的說明可以參見相關的RFC文檔)。
在圖1中,LDAP Client指各種需要身份認證的軟件,例如Apache、Proftpd和Samba等。LDAP Sever指的是實現LDAP協議的軟件,例如OpenLDAP等。Datastorage指的是OpenLDAP的數據存儲,如關系型數據庫(MySQL)或查詢效率更高的嵌入式數據庫(BerkeleyDB),甚至是平面文本數據庫(—個txt的文本文件)。可見,OpenLDAP軟件只是LDAP協議的一種實現形式,並不包括后台數據庫存儲。但在很多時候管理員經常將LDAP Server和DataStorage放在同一台服務器,這樣就產生了人們通常所說的“LDAP數據庫”。雖然后台數據庫(backend)可以是多種多樣,但LDAP協議還規定了數據的存儲方式。LDAP數據庫是樹狀結構的,與DNS類似,如圖2所示。
圖2 跨國公司員工信息的樹狀邏輯結構
在圖中,以這種方式存儲數據最大的一個好處就是查詢速度快,LDAP數據庫專門對讀操作進行了優化, OpenLDAP配合Berkeley DB可使其讀操作的效率得到很大提高。LDAP數據庫的樹狀結構的另一個好處是便於分布式的管理,有關這方面的內容將在后面有所介紹。
實現思路
統一身份認證主要是改變原有的認證策略,使需要認證的軟件都通過LDAP進行認證,如圖3所示。在統一身份認證之后,用戶的所有信息都存儲在LDAP Server中。終端用戶在需要使用公司內部服務的時候,都需要通過LDAP服務器的認證。每個員工只需要記住一個密碼,在需要修改用戶信息的時候可以通過管理員提供的Web界面直接修改LDAP Server中的信息。
圖3修改后的認證策略
目前大部分主流軟件都對LDAP提供很好地支持,但由於各種軟件對LDAP的支持程度不同,在做實施的時候也要區別對待。軟件對LDPA的支持可以大概分為兩大類:
一類是完全支持,也就是在軟件的配置文件中加入和LDAP有關的選項就可以完成。這種方式的好處是不需要借助其他的工具或軟件,由軟件的開發團隊直接完成對LDAP的支持。可能的缺陷也在此,由於各個軟件開發團隊的水平和開發者經驗有所差異,雖然同樣是支持了LDAP,但稍微復雜一些的高級功能就無法提供,有的時候甚至出現運行錯誤導致整個軟件出現問題。筆者曾遇到過一個基於Web的CVS瀏覽軟件,安裝文檔中說明了支持LDAP,但實際使用當中遇到了很多問題導致整個軟件crash。一些比較主流的軟件,例如Apache 2.X對LDAP的支持已經近乎完美。
另一類軟件由於很多原因並不直接支持LDAP,而是通過PAM 做身份認證,由於PAM本身支持LDAP,這樣也同樣可以實現使用LDAP做身份認證。這種方式對LDAP的支持同樣有其優勢,軟件開發人員不需要修改代碼支持LDAP協議,減少了軟件本身產生安全漏洞的可能。缺點是在一些不希望使用PAM 的系統中,這樣的軟件就無法通過LDAP進行用戶認證,而且雖然PAM對LDAP的支持已經很完善,但一些高級、復雜的功能還是無法實現。正由於這些原因,這類軟件為數不多,比較典型的就是Vsftpd和CVS。
使用LDAP做身份認證
介紹到這里可能很多讀者會問為什么需要使用LDAP數據庫?用傳統的關系型數據庫不可以嗎?從上文可以看到,LDAP服務器就是起到了一個認證Server的作用,從技術本身而言,這個認證Server具體使用的是何種數據庫並不重要,如果使用一個關系型數據庫也可以達到統一身份認證的目的,但LDAP 自身的優勢使得很多公司最終選擇它。以下筆者列舉了一些選擇LDAP的重要原因:
◆LDAP是一個開放的標准協議,不同於SQL數據庫,LDAP的客戶端是跨平台的,並且對幾乎所有的程序語言都有標准的API接口。即使是改變了LDAP數據庫產品的提供廠商,開發人員也不用擔心需要修改程序才能適應新的數據庫產品。這個優勢是使用SQL語言進行查詢的關系型數據庫難以達到的。
◆由於LDAP數據庫的數據存儲是樹結構,整棵樹的任何一個分支都可以單獨放在一個服務器中進行分布式管理,不僅有利於做服務器的負載均衡,還方便了跨地域的服務器部署。這個優勢在查詢負載大或企業在不同地域都設有分公司的時候體現尤為明顯。
◆LDAP支持強認證方式,可以達到很高的安全級別。在國際化方面,LDAP使用了UTF-8編碼來存儲各種語言的字符。
◆更靈活添加數據類型,LDAP是根據schema的內容定義各種屬性之間的從屬關系及匹配模式的。例如在關系型數據庫中如果要為用戶增加一個屬性,就要在用戶表中增加一個字段,在擁有龐大數量用戶的情況下是十分困難的,需要改變表結構。但LDAP只需要在schema中加入新的屬性,不會由於用戶的屬性增多而影響查詢性能。
◆LDAP數據庫是對讀操作進行優化的一種數據庫,在讀寫比例大於7比1的情況下,LDAP會體現出極高的性能。這個特性正適合了身份認證的需要。
目前,很多公司都把LDAP和自己的產品、技術結合在一起,增加LDAP在各個領域中的有效性,這一切都來源於LDAP是一個開放的協議,很容易和其他標准協議共存。
LDAP軟件的選擇
目前,幾乎所有大IT廠商都有自己商用的LDAP產品,每個廠商的LDAP產品都有其特點,很多時候用戶更多地選擇開源的OPenLdap。
OpenLDAP與其他的商用軟件相比有很多優勢, 商用的軟件版本更新很慢,對Bug的反應速度比開源軟件差許多,OpenLDAP還包含了很多有創造性的新功能,能滿足大多數使用者的要求。筆者曾使用過許多商用LDAP產品,OpenLDAP是其中最輕便且消耗系統資源最少的一個。OpenLDAP是開源軟件,近年國內很多公司開發的LDAP產品都是基於OpenLDAP開發的。
OpenLDAP的源代碼可以到官方網站(http://www.openldap.org)下載,安裝過程也很簡單。由於openldap需要Berkeley DB來存放數據,所以需先安裝Berkeley DB 4.4.20,可到它的網站下載,網址見上。
# tar -zxvf db-4.4.20.tar.gz
解完壓后,會生成一個db-4.4.20目錄,進入該目錄下的build_unix目錄。執行以下命令進行配置安裝。
# ../dist/configure
# make
# make install
# tar -zxvf openldap-stable-20090411.tgz
解壓完成后,會生成一個openldap目錄。進入該目錄,執行以下命令進行配置安裝。
#env CPPFLAGS="-I/usr/local/BerkeleyDB.4.2/include" LDFLAGS="-L/usr/local/BerkeleyDB.4.4/lib" ./configure -prefix=/usr/local/openldap --enable-ldbm
注意以上配置語句,要設置資料庫的include和lib路徑,否則在配置到資料庫相關內容時會提示Berkeley DB版本不兼容,並中斷配置。如果沒有--enable-ldbm選項,在make test時會提示ldbm找不到。為了減少出錯,還是加上為好。
#make depens
#make
#make test
在make test階段要花費較長時間進行測試,好像有16項吧。你可以放松一下,這個時間應該是最緊張的了。
#make install
通過配置命令可以看出,我們把openldap安裝到/usr/local/openldap目錄下。建議以源碼安裝的軟件都放到獨立的目錄下,不要放到軟件默認的目錄。好處是方便管理和控制,所有文件在統一的目錄下,卸載軟件只要刪除整個目錄就可以了。在此過程中需要注意如下幾個地方:
◆在執行configure之前要確定安裝了Berkeley DB,雖然OpenLDAP可以使用很多數據庫做back-end,但BerkeleyDB仍然是OpenLDAP開發團隊強烈推薦的。
◆如果需要更安全的方式訪問OpenLDAP,在配置執行configure之前要確定已經安裝了cyrus-sasl。
◆有些用戶在安裝OpenLDAP的時候忽略了最后的make test。經驗告訴我們,很多的錯誤都會在執行make test的過程中暴露出來,OpenLDAP的開發團隊很注意維護軟件的Test Case, 整個測試非常全面,很多在日常使用中很少用到的功能都會被測試到,很好的保證了軟件在投入使用以后的穩定性。
默認情況下,OpenLDAP的配置文件保存在/usdlocal/etc/openIdap下的sIapd.conf中,配置文件中記錄着OpenLDAP的管理員密碼。默認情況下密碼是用明文表示,可以用slappasswd命令產生密文替換配置文件中的明文。以圖3為例,配置文件的相關項應做如下更改:
Suffix “dc=ldap_abc,dc=org”
Rootdn “cn=manager,dc=ldap abc,dc=org"
directory /usr/Iocal/var/openldap-data
其中directory參數為數據文件在服務器上的位置,出於穩定性和性能方面的考慮,數據文件最好放在獨立的分區或磁盤陣列上。配置文件的ACL部分也十分重要,很多讀取或修改操作不能正常完成都是由於ACL的寫法錯誤造成的。下面是默認情況下ACL部分的配置:
Access to attrs=userPassword
By self write
By * auth
Access to *
By * read
輕松搞定LDAP賬號管理
在這里筆記告訴大家使用PHP語言開發基於Web的LDAP管理器,並着重分析該管理器中類屬性與對象類的繼承關系、修改過程的遞歸關系時所用到的相關技術及相關算法,使得我們在使用和管理LDAP賬號等方面變得更為簡便。
LDAP Account Manager(LAM)采用PHP 4/5編寫,是基於Web的LDAP用戶、用戶組、主機和LDAP目錄的管理系統,管理員可以通過SSUTLS加密方式進行操作,增強了安全性。LAM支持管理的賬號類型有Samba 2/3、Unix、Kolab 2、地址簿接口和計算機管理需要的信息,包括NIS映射、Email假名、MAC地址等。
1)LDAP Account Manager的強大功能
◆使用LAM,可以通過Web接口較為直觀的、簡便的管理存儲在LDAP 目錄里的用戶、用戶組和計算機系統賬戶。
◆可以管理Unix的用戶、用戶組、主機、域名。
◆具備強大的過濾和排序功能。
◆具有賬號屬性管理。
◆多構造屬性。
◆直觀的樹狀察看模式。
◆計划查看模式。
◆開放式的編輯器。
◆通過文件上傳創建賬戶。
◆所有賬號可導出為PDF文件格式。
◆可以管理用戶、用戶組、配額和自動創建,刪除用戶的Home 目錄。
◆支持LDAP+SSL加密模式。
◆多國語言支持,如Catalan、Chinese(Traditional)、Dutch、English、French、German、Hungarian、Italian、Japanese和Spanish等。
2)安裝需求
◆PHP4/5語言環境和Perl語言環境
◆Openldap2.0或更高版本
◆支持CSS的網頁瀏覽器
◆Apache webserver,建議安裝SSL、PHP-Module(PHP-Module with ldap,gettext,XML,mcrypt+mhash)等模塊。
3)安裝和使用
首先從http://lam.sourceforge.net/下載LAM壓縮包,解壓縮並修改PHP的配置文件php.ini的如下內容:
* memory_limit=64M
接下來復制文件到Web服務器的html-file目錄中,如apache/htdocs,並給下面的文件設置合適的讀寫權限:
◆-lam/sess:設置給apache用戶寫權限;
◆-lam/tmp:設置給apache用戶寫權限;
◆-lam/config:(包括子目錄)設置給Apache用戶寫權限;
◆-lam/lib lamdaemon.pl:必須設置為可執行權限。
然后配置conflg.cfg文件,創建一個配置屬性,設置密碼,並復制config.cfg_到配置目錄。最后,在瀏覽器中打開index.html,在Configuration Login處可以使用默認密碼“lan”登錄進行相關操作,如圖4所示。
圖4
4)配置管理LAM
成功登錄進入LAM 系統后,通過網頁的形式對我們的LDAP進行管理就變得十分的直觀和簡單了,通過鼠標點擊就可以輕松查看和管理我們的LDAP,還可以在線編輯和數據導出。在LAM 系統中,我們主要可以進行如下的操作:
◆LAM系統配置LAM的具體配置,如圖5所示。
圖5
◆LAM模塊選擇和管理:讓LAM 列出用戶信息。
◆修改用戶信息,在LAM 中查看和修改用戶屬性,如圖6所示。
圖6
不僅如此,LAM的管理功能十分全面, 還可以對用戶進行很多操作,如列出用戶組信息、列出所管理的服務器主機信息、通過文件上傳方式創建用戶、樹狀查看方式、SAMBASAM信息查看修改、開放式在線編輯模式和LDAP信息PDF文件格式輸出等,對於系統管理員來說實在是太方便了。
配置Apache支持LDAP
雖然各種軟件支持LDAP的方法有兩種,但本質上是一樣的,只是一些軟件希望自主開發LDAP的支持,另一些軟件使用PAM已經開發好的LDAP支持。任何一個軟件要通過LDAP做用戶認證,至少要在軟件的配置文件中提供兩個認證所需要的信息,一個是LDAP服務器的IP地址,另一個是需要認證的用戶在LDAP數據庫中的位置。前面提到過,LDAP數據庫是和DNS類似的樹狀結構,每個用戶作為葉子節點被放置在這棵樹上,而這些用戶的父節點就是認證所要提供的用戶在LDAP數據庫中的位置。如圖3所示,如果要給亞洲地區市場部的所有員工提供FTP登錄賬號,需要提供的用戶在LDAP數據庫中的位置就是“ou=Sales,I=Asia,o=ldap_ abc.org”。下面以Apache為例介紹一下軟件的配置。
Apache和LDAP整合可以用來限制用戶以HTTP方式訪問文件的權限,Apache使用LDAP做用戶認證有很多現實意義,首先可以限制用戶對公司內部HTTP敏感內容的訪問。此外,很多版本管理軟件(如Subversion)都提供了LDAP支持,這樣在用戶需要通過Web方式訪問文件的時候,可以通過Apache的設置來限制用戶對文件的訪問權限。Apache是從2.0.41以后才開始支持 LDAP的,如果希望使用LDAP做身份認證就要安裝Apache 2.0.41以上的版本,企業版本的Red Hat AS 3/4/5默認安裝的Apache2.0就已經把L DAP相關的模塊進行了編譯,用戶只需正確修改Apache的配置文件就可以支持L DAP認證。
下面代碼是對保護目錄/var/www/htm/internal設置了一定權限。
<Directory /var/www/html/internal>
AuthName “WeIcome to Linux"
AuthLDAPEnabled on
AuthLDAPURL ldap://192.168.1.2/ou=Sales,I=Asia,o=ldap_abc.org?uid
Require valid-user
</Directory>
◆AuthName是可選項,用戶在訪問受保護目錄的時候,瀏覽器會彈出—個提示窗口,要求輸入用戶名和密碼,AuthName設置的內容會出現在彈出窗口的標題欄(此項內容支持中文)。
◆AuthLDAPEnabled是可選項,默認值為on。當已經把目錄/var/www/htm/intemal設置為需要認證,但又需要將var/www/htm/internal/pub目錄設置為公開時,就可以將此項設置成off。
◆AuthLDAPURL為必填項,192.168.1.2即為LDAP服務器的IP地址,ou=SaIes,I=Asia,o=ldap abc.org為用戶在LDAP數據庫中的位置,uid表示使用每個用戶uid屬性的值作為認證過程中使用的用戶名。
◆require valid-user表示只有認證成功的用戶才能訪問指定的資源。LDAP樹結構的設計下面用一個實際的案例簡單介紹一下樹結構的設計。某上百人的IT企業,總公司設在北京,且在上海、廣州設有分部,公司的市場部、開發部、管理部及人力資源部在三個城市都有分部,公司要求所有員工每天更新自己在這一天內的工作成果,並為每個員工設有企業內部的FTP共享空間,程序開發人員使用CVS提交代碼,公司內部有多台Linux服務器,只允許有權限的賬號登錄。
員工使用到上述服務的時候需要進行身份認證。在這樣的情況下,既可以選擇購買幾台昂貴的數據庫服務器,裝上大型的商業數據庫來解決這個問題;也可以選擇更廉價且高效 的辦法,使用開源軟件的解決方案。首先要考慮的是數據的拓撲,根據企業的需要做數據庫設計是關鍵。公司在北京、上海和廣州設有分公司,如果數據庫服務器只存放在一個城市,在網絡流量高峰期會影響認證速度,降低員工的工作效率,因此數據庫設計可以有以下兩種方案:一種是把主LDAP服務器放在北京,同時在上海和廣州同時放有LDAP服務器,類似於DNS的區域授權,總公司把上海和廣州員工的管理下放,各地的員工通過本地的LDAP服務器進行認證,既提高了效率,又保證了服務器出現問題都不會影響到其他兩個城市的認證服務。這種數據庫設計並不是把公司的所有員工割裂成了沒有聯系的三個部分。
如圖7所示,三台服務器上的LDAP分支是在同一棵樹上通過類似於“引用”的特殊屬性連接在一起的,三個城市都有自己的管理員來維護各自的分支。三台服務器連接在一起有很多好處,在需要搜索或查詢公司所有員工信息的時候就會十分方便。如果某個城市的員工較多或負載過重還可以在這個城市增加LDAP服務器,增加的服務器就如同本地服務器的鏡像,可以起到負載均衡的作用。需要注意的是,在這個設計方案里每個LDAP服務器都是可以讀寫的。
圖7 樹結構的設計
另一種方案是在北京存放一台主LDAP服務器,同時在北京、廣州和上海三個城市分別放置一台輔LDAP服務器。主LDAP服務器只負責寫入數據,輔LDAP服務器只讀,任何數據庫的修改都要先寫入主LDAP服務器之后再同步到三個輔LDAP 服務器,這樣的拓撲結構也比較適合認證服務器的需要,因為寫操作相對於讀操作更少,這種設計的優勢在於能根據員工的多少或各分公司的負載情況靈活增加或減少服務器,任何一台輔LDAP服務器的癱瘓都不會影響到整個認證系統。在國外的一些案例中,輔LDAP服務器會多達幾十甚至上百台。但這種設計也有缺陷, 如果主LDAP出現問題,那么所有的寫操作就會受到影響, 目前OpenLDAP還不支持多個主LDAP 服務器的情況,因為設置多個主LDAP服務器有可能會造成整個數據的不一致, 只有少數商用的LDAP 支持多主LDAP的功能。
統一身份認證的未來
在國外,LDAP應用於身份認證已經十分成熟,最近幾年國內才開始逐漸流行起來。前面提到的認證方式還存在一些不足,例如用戶在使用FTP服務后,如果再使用Samba服務就需要再次輸入用戶名和密碼,目前微軟的Active Directory通過管理域用戶已經完美的實現了單點登錄,Linux可以通過OpenLDAP和Samba實現大部分Active Directory能夠實現的功能。相信在不久的將來,用LDAP做身份認證的技術還會滲透到更多領域,包括網絡計算機、門禁系統,甚至智能IC卡的應用。
原文地址:http://www.cangfengzhe.com/wangluoanquan/3.html