【第156期 September 5, 2010】
 

研發新視界

LDAP轉換至SQL Server實作研究

作者/劉耿谷

[發表日期:2010/8/26]




LDAP(Lightweight Directory Access Protocol)介紹

一、LDAP介紹

LDAP全名是「輕量級通訊協定」,主要是將分散式的資料以目錄結構方式提供資料儲存機制,透過特定的通訊協定(一般是389)存取。其主要組成要素有項目(entry)、物件類別(Object Class)。項目是LDAP的基本單元,一個項目可以包含多個物件類別,其中每個物件類別又有其屬性。

本文將以筆者近日接觸的某專案為例,本例主要是將LDAP當作人員管理的名錄使用,用以儲存企業機關的資料,例如帳號、企業機關代碼、電話、密碼等資料,符合LDAP的儲存資料少,異動性不高的特點,而且LDAP資料會經過排序,故在搜尋起來速度會較存放在資料庫裡的搜尋速度快。


《圖一》LDAP架構說明


二、LDAP和資料庫的差別


《圖二》LDAP與資料庫比較表


三、LDAP的儲存格式

LDAP的儲存格式為LDIF(LDAP Interchange Format)。其資料格式的表現方式如下圖所示:


《圖三》LDIF


如果透過市面上的中介軟體,例如LDAP Admin的軟體可以將資料轉成其他格式,例如CSV格式的資料,不限於LDIF格式。

LDAP資料轉換到SQL Server

在本文範例專案中,由於平台的轉換,需要將LDAP的資料轉換至MS SQL SERVER,以下說明轉換的兩種做法:

測試環境與相關軟體:
 作業系統:Windows 7
 資料庫系統:MS SQL Server 2005 sp3
 LDAP:OpenLDAP
 中介軟體:LDAP Admin

方法1、透過中介軟體轉換匯入

步驟一、透過LDAP Admin將查詢的資料另存成CSV檔


《圖四》透過LDAP Admin查詢資料



《圖五》轉出後存檔成CSV的樣式


步驟二、使用SQL Server的匯出匯入精靈將轉出的資料匯入至SQL Server


《圖六》CSV資料匯入SQL Server過程


如果一開始將資料庫中的欄位定義完整則匯入即可正常使用匯入的資料,但須注意在密碼方面LDAP是採取MD5以及SSHA的編碼格式,所以在使用密碼這個欄位需要特別處理。


《圖七》匯入SQL Server的LDAP資料


方法2、連結LDAP至SQL Server使用

另外介紹最近看到的其他做法,其大意是將LDAP透過SQL Server中的連結伺服器將LDAP納入SQL Server中,然後透過執行SQL語法查詢LDAP的資料。

步驟一:在SQL Server中建立伺服器,其方法有兩種,第一種方法,展開SQL Server在伺服器物件連結的伺服器右鍵新增連結的伺服器,如下圖:


《圖八》新增伺服器


輸入伺服器的參數設定,其中提供者選取”OLE DB Provider for Mircosoft Directory Services”,如此才可以適用Directory Service。第二種則是直接執行SQL產生伺服器,執行SQL如下



步驟二:打開系統預儲程式進階選項



步驟三:開啟特定分散式查詢選項



步驟四:測試SQL查詢LDAP



結論

由於本文所舉專案適巧需將LDAP的資料轉至MS SQL SERVER上,故整理常見的兩種方式,第一種方法是透過中介軟體將資料轉出再匯入SQL SERVER;第二種方法則是不透過資料匯出的方式,改將遠端的資料納入SQL Server中當作是自己的資料庫使用,可進行SQL的查詢,就像在資料存放在SQL Server裡一樣,但是對於分散式的系統架構下還需要測試,所找到的資料通常是AD和Server都在同一台機器上,因此SQL SERVER可以很正確的找到位置,沒有帳號或是權限的問題,值得注意的是,在分散式的環境下,對於LDAP伺服器的帳號、權限、位置等資料都需要很完整且正確描述,否則將無法連線成功。

另外在LDAP中儲存密碼的方式是使用MD5或SSHA的編碼格式,所以直接由LDAP匯出或查詢出來的密碼資料是一串不具意義的文字,如” ultebBg4BKaG4xvtttzm9I1Hny0=”,把這些資料存放在資料庫後,若將來程式要驗證帳號及密碼時,須將輸入的密碼進行編碼後再行比對是否和儲存在資料庫中的字串相符即可解決這個問題。

根據筆者經驗,第一種方式測試是可行的,現根據第二種方式進行評估測試後,將根據最後的結果導入專案,以確保資料轉換達到正確且快速的目的。若第二種方法將來有具體的測試成果,筆者將再分享相關經驗。

參考資料

1.@ONE爸爸的隨想手札
2.輕型目錄訪問協議,維基百科
3.How to Link Different Data Sources Together
4.http://www.dotblogs.com.tw/angi/Default.aspx