用PHP通過LDAP操作活動目錄(AD)的筆記

用PHP通過LDAP操作活動目錄(AD)的筆記

 
最近一週一直在研究AD這方面的問題,主要難題就是用跑在Linux上的PHP通過LDAP來讀寫Windows上的活動目錄中用戶的信息。一般來說需要這麼做的情況不常見,因爲既然是用AD了就可以用很多現在的LDAP模塊,但是我現在要做的是把已有的一個非標準的用戶/密碼的庫轉換到AD裏去,所以必須親自來完成一些底層的工作。這方面的文章網上不多見,所以這裏綜述一下。

首先,是安裝配置AD本身的這部分工作:
主要包括:裝Win2k3(或2008哈),建立域控制器,建DNS服務,把要加入域的幾個機器加進域來,然後建設OU(放用戶的OU及放計算機的OU),建立安全組(我用它來限制哪些用戶可以登錄哪些計算機),設立組策略並應用到各OU等。
這部分內容的文章很多,微軟給的文檔就足夠詳細了,比如這個Step by Step的教程:http://www.microsoft.com/china/technet/prodtechnol/windowsserver2003/technologies/directory/activedirectory/stepbystep/default.mspx
(ps.這中間在密碼策略上浪費了大量時間,後來才弄清一個域中只能在根下設置密碼策略,就算把帶有密碼策略的組策略應用在OU上,也是無效的。2008裏已經可以針對安全組甚至用戶設置獨立的密碼策略了,期待~~)

然後是一些爲了就乎linux的準備工作:
先去http://www.microsoft.com/windowsserversystem/sfu/downloads/default.mspx下載一套Windows Services for UNIX,這個裝上以後AD裏用戶的屬性頁裏會出現一個UNIX屬於頁,有uid,gid什麼的,這是爲了讓linux能結合AD驗證用戶登錄的(比如pam),我目前沒用上,不過裝它沒壞處。
還有是要建立一個proxyuser,這個user是ldap客戶端連AD時登錄用的,想讓PHP實現對AD的什麼操作,就給這個proxyuser賦予什麼權限。
這裏推薦一套很好的文檔,是微軟的Windows Security and Directory Services for UNIX Guide(還是要pf一下m$,文檔就是全,這裏對linux中安全體系的介紹比專方介紹的文檔都詳細。。。)


下面就是資料不好找的工作啦,一步一步來:

1.關於AD與ldap的符合性。AD被做成基本符合ldap的模式,每個用戶和計算機或是組什麼的都有一個DN,形如CN=loudly,OU=bbs,DC=bdwm,DC=net這樣子,而用戶的每個屬性就是這條記錄裏的一個attribute,所以可以用ldap_search(),ldap_add()這些標準的函數來操作AD。一個特殊但是關鍵的地方就是用戶的密碼,很不易地找到這兩個文檔介紹這個事情:
How To Change a Windows 2000 User's Password Through LDAP
User Management with Active Directory—LDAP Password Modification
文章中的核心內容就是:用戶的密碼是一個叫unicodePwd的屬性表示的,這個屬於只能寫不能讀,寫的時候的格式是用一對雙引號括起密碼原文,再編碼爲unicode傳給它,還有,要想改用戶密碼,必須是通過SSL方式連接LDAP(636端口,而不是普通的389端口)。因爲如上要求,就要有以下步驟的工作了。

2.生成根證書
用SSL的話嘛,就需要證書。可以在域控制器上開啓認證服務來創建企業的CA(注意這個服務開啓後域的設置就不能改了,包括域名,這個機器的名等,所以要在進行這步之前設置好)。這裏要做的就是創建CA,然後驗證一下是不是ok的。其實這部分內容我也不懂,主要就是照着下面兩篇參考着做的,具體步驟怎麼回事(尤其是驗證的時候)我也不知道是在做什麼。
a.Install an enterprise root certification authority
b.就是上面提到的Windows Security and Directory Services for UNIX Guide第二卷的第Chapter4的Build a Certification Authority那一節
如果不自己建CA,而是從別處獲得CA,那就看下面這篇:
c.How to enable LDAP over SSL with a third-party certification authority
下面這篇也可以參考,不過該文的主題是別的
d.如何在 Windows 2000 域控制器中配置數字證書來確保 LDAP 和 SMTP 複製的安全
上面的工作做好後,如果正常,那麼域控制器就會開始listen 636端口,也就可以通過SSL連AD了(一般ldap客戶端的規矩是:連的時候直接寫DC地址就是用非加密方法連,連的時候如果寫ldaps://地址,就是用SSL方法連接DC)

3.LDAP客戶端的配置
客戶端,就是要去連AD的機器,也就是本文中跑着PHP的那個機器,要做的工作主要是把DC上的CA導出成.cer,然後拷到客戶端上來,然後轉化爲.pem(可是我的.cer和.pem文件是一樣的)放到某個位置,然後再修改一下/etc/openldap/ldap.conf,這樣連DC的時候系統就可以去查相應的證書。主要參考的文檔是這篇:
Communicating between OpenLDAP and Active Directory over SSL
下面兩篇也可以參考:
Configuring Microsoft Active Directory for SSL access
LDAP over SSL - Modifying Active Directory with PHP
上面的文章裏最後都要用linux下的ldapsearch命令來測試連接是否可以進行,不過語法不同,我最後成功地連上DC用的語句是:
ldapsearch -x -H "ldaps://theDC.yourdomain.net" -s base -D "cn=proxyuser,cn=users,dc=yourdomain,dc=net" -W -b "dc=yourdomain,dc=net"(回車後提示輸proxyuser的密碼)
還有,要強調的是,連DC一定要用它的域名,不要用IP或是NetBIOS名,因爲CA裏寫的是域名,要匹配
另,上面說的是linux的ldap客戶端,win下也有啊,比如說win2k和2k3的support-tools裏的ldp.exe,可是我還沒搞清楚它應該怎麼才能以SSL連AD。。。

4.用PHP來操作活動目錄
這步算是最輕鬆的了,就是學一學PHP的相關函數的語法就好了。不過大概是沒幾個人用到ldap這方面的功能吧,PHP manual中ldap這部分的說明很簡略,特別是用TLS的文檔裏寫着這部分沒有文檔。。。所以最好的辦法還是看一些源代碼,這裏推薦的是我在SourceForge上找到一個的PHP連AD的類:http://adldap.sourceforge.net/
這個類寫的並不是特別好,比如添用戶時非要求填幾個沒用的屬性,還有至少在一層的OU裏的樣子,所以推薦它主要是爲了看它的原碼(30k左右,不是很多)學習用ldap來添加、查詢、修改、加組等操作應該怎麼寫,如果你的應用比較複雜,建議還是自己來寫,不直接用它的類。
下面幾個地址也列出來考慮吧,它們都是我google到的別人問的問題,本身沒有確切解答,不過還是有功勞的,比如我認識到了沒有驗證一個用戶的密碼對不對的函數,要做的就是用那個用戶名和密碼去bind一下,bind上了就是對,否則就是錯。
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/Q_21296510.html?qid=21296510
http://topic.csdn.net/t/20060524/10/4774581.html
http://www.ideawu.net/ideablog/category6/article238.html
http://topic.csdn.net/t/20030520/15/1809327.html#


上面列出的文章鏈接真的不是那麼好挑選出來,真怕他們哪天沒了,回頭我下載完打包傳上來吧


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章