將 LDAP 目錄用於 Samba 認證


原文地址:

http://www.ibm.com/developerworks/cn/education/linux/smb-ldap/smb-ldap.html

 開放源碼 Samba 將 Unix 或 Linux 系統轉變成了用於 Microsoft Windows 網絡客戶機的文件和打印服務器。您可以配置 LDAP(輕量級目錄訪問協議,Lightweight Directory Access Protocol)來為 Samba PDC(主域控制器)提供用戶認證。

 

教程概述

未來之路

本教程詳細講述了將 LDAP(輕量級目錄訪問協議,Lightweight Directory Access Protocol)目錄用於存儲 Samba 用戶帳戶信息(通常存儲在 smbpasswd 文件中)所需的步驟。這里概述的過程是基於Samba 和 OpenLDAP 的當前穩定發行版的,在撰寫本文時它們分別是 2.2.4 和 2.0.23。如果您正在從頭構建系統,除非您有不這樣做的特殊需求或理由,那么建議您總是使用 Samba 和 OpenLDAP 的最新版本。對於 Samba 尤其是如此,因為目前正在進行大量關於程序的 LDAP 和 Windows 域集成的開發。Samba 當前的 CVS HEAD 分支(它是最新的開發樹,最終將成為 Samba 3.0)將使得與 LDAP 的集成更為輕松,因為管理員將不必象現在這樣擔心兩種用戶帳戶(UNIX smbpasswd 帳戶和 Windows 域帳戶)的同步;Samba 3.0 將取消對現有 smbpasswd 帳戶的需求。

學完本教程后,您應該對下列內容有清晰的理解:

  • 如何收集、構建和/或安裝必需的軟件。
  • 如何配置以便使用 OpenLDAP 服務器。
  • 如何配置 Samba,以及如何將用戶、組和機器帳戶添加到 OpenLDAP 服務器。
  • 還有如何維護(刪除和修改)帳戶信息。

本教程詳細講述配置 Samba 擔任 PDC(主域控制器,Primary Domain Controller)的機制。可以在 IBM eServer 開發者園地上另一篇題為Using Samba as a PDC 的教程上獲得這些信息。

假定條件

本教程假定以下條件:

  • 一個可正常運行的、完全配置好的 Linux/UNIX 系統。本教程是基於 Red Hat R7.3 的。它也在 RedHat 7.2 和 Gentoo Linux(用於高級用戶的“元分發版(metadistribution)”)上測試過 。理論上,給定的指示信息應該可以在任何 *NIX 操作系統上工作;路徑名和約定因分發版而異。
  • 可正常運行的、配置好的 Samba PDC 安裝。除了上一頁提到的 IBM eServer 開發者園地中的教程之外,F. Hagethorn 還創建了一組很棒的腳本,以幫助您快速地使用 Samba 創建 PDC。他將自己的產品稱為 VASC(十分高級的 Samba 配置,Very Advanced Samba Configuration),您可以在這里找到它。
  • 對 LDAP 所用概念和術語的基本理解(例如,專有名稱、組織單元、對象類等)。即使是對正確地實現 LDAP 服務器過程中背后的基本概念作一個簡介,其篇幅也可以輕易地達到密密麻麻的 50 頁內容。Adam Tauno Williams 為 LDAP 結構和約定准備了很好的介紹;可以下載其 PDF 格式。有關詳細信息,請參閱結束語和參考資料 一章。
  • 對常用管理術語和過程(如文件權限、創建用戶帳戶、移動和復制文件等)的基本理解。
  • 您需要足夠的計算機來處理文件共享和目錄查找的負載(假定 Samba 和 OpenLDAP 在同一機器上運行― 這是小到中型企業比較常用的配置),盡管對某些人來說這個問題可能很明顯。 本教程是根據在具有三個磁盤 ServeRAID 陣列、雙 P3 1.2 GHz 處理器和 1GB RAM 的 IBM eServer xSeries 型號 220 上編寫和測試的。根據配置,這台機器可以輕松地為 250-350 個用戶服務,這個數量取決於所服務的文件大小和並發用戶的數目。

為什么使用 LDAP 目錄?

在傳統的 Samba 安裝中,用戶帳戶和密碼信息存儲在 /usr/local/samba/private/smbpasswd 中(或者,根據配置,有時存儲在/etc/smbpasswd 中)。因為 LM/NT 密碼散列和 smbpasswd 散列之間的不兼容性,所以用戶必須首先存在於服務器的 /etc/passwd 文件中,然后將該用戶手工添加到 smbpasswd 文件中。對於少量用戶這很好,但隨着用戶群逐漸增大,這種方法的不利方面也隨之顯現。例如:

  • 必須串行執行所有認證查找。假定每次域登錄大約進行兩次查找(一次用於正常的會話連接,另一次在映射網絡驅動器或打印機時執行),對於大型站點,這是一個性能瓶頸。我們所需要的是象數據庫中所使用的那種建立索引的方法。
  • 想要將 smbpasswd 文件復制到多個 Samba 服務器的管理員只得使用外部工具(如 rsync 和 ssh),或者編寫定制的、內部腳本。
  • smbpasswd 文件的結構缺少用來存儲屬性的字段,這些屬性包括主目錄、密碼到期時間/日期以及其它密碼詳細信息(例如,能/不能更改)和用戶/組 RID(相對標識符,Relative Identifier)。

使用 LDAP 目錄服務會減輕這些限制,以及其它限制,並允許將集中資源用於所有用戶管理。

有兩件事是 Samba/LDAP 安裝無法“開包”即可完成的:

  • 從 Windows 2000 活動目錄(Active Directory)服務器檢索用戶帳戶信息。
  • 減少對 /etc/passwd 的需求。

暫定於 2002 年夏末發布的 Samba 3.0 發行版將解決這兩個問題。

 

收集和構建必需的軟件

關鍵字就是選擇……

如果有一種精神可以實實在在地體現開放源碼軟件運動的特色,那就是“選擇”的觀念。我們可以選擇不同的分發版,因而又可以選擇捆綁軟件和多種文件系統布局。我們可以選擇不同的軟件包管理器和軟件分發版 ― 是源代碼還是預編譯的二進制文件?盡管就其本身而言,所有這些選擇的自由都是神聖而光榮的,但它也使提供如何構建復雜的結構(就象一台 LDAP 服務器,它擔任 300 台工作站的 Samba PDC ― 其中一半工作站使用漫游概要 ― 一樣復雜)的詳細指示信息變得很難。

為了進行簡化,並集中精力處理后面的任務,正如先前提到的那樣,本文是基於Red Hat R7.3 的。 為什么使用 Red Hat?因為它容易獲得,而且 Linux 管理員們相對比較了解 Red Hat 的文件系統布局和 init 腳本約定,而且手頭又恰好有 Red Hat 分發版。 最后聲明一下 ― 無論您使用 Red Hat、SuSE、Gentoo 還是 Slackware,基本過程都是相似的。但是,為了按照本教程的主題進行下去,我們必須從某處出發,該起點是一個正確的 Red Hat 安裝、一些 RPM 包和一些 Perl 腳本。

必需的軟件包

如果您打算遵循本教程中提供的指示信息,則需要下載或預安裝下列軟件包:

  • 最新的穩定 Samba 發行版(www.samba.org)。撰寫本文時是 2.2.4。
  • 最新的穩定 OpenLDAP 發行版(www.openldap.org),目前是 2.0.23。
  • 因特網上差不多有數百個由管理員和程序員們編寫的腳本,它們用來減輕將用戶帳戶信息填充到 LDAP 目錄的手工過程。IDEALX 上有一個 Perl 腳本包,它允許管理員創建必需的 Samba 對象類並管理目錄。PADL 上的人們發布了一個腳本集,它允許管理員從常用 UNIX 配置文件(如 /etc/passwd, /etc/group、NIS 詳細信息等)遷移多種帳戶信息。關於 Samba 到 LDAP 的遷移腳本有必要警告一句:一組對於某個安裝有效的腳本未必對另一個安裝有效。開放源碼應用程序在不同的修訂版之間變化很大,Linux 分發版以使用自己獨特的文件系統布局而“聲名狼藉”,每個管理員都喜歡以自己的方式做事。所有這些累積起來,造成了前面提到的無規律狀態。本教程使用來自 IDEALX 的腳本,因為它們看起來相對精練一些。如果您沒有獲得此處詳細描述的腳本,則請嘗試另一套腳本。無論您用哪一套腳本,都請確保在非生產系統上測試您選擇的腳本。

從源代碼編譯 Samba

第一步是下載最新的 Samba 源代碼 tar 包(或者從 SAMBA_2_2 CVS 樹檢出最新版本;可在 Samba 網站上找到 CVS 下載說明)。之所以需要源代碼,是因為必須將 Samba 配置成使用 LDAP 目錄進行用戶認證,這一配置必須在編譯程序組件之前完成。您可能會找到為 LDAP 預構建的 RPM 包,但這種包少之又少(IDEALX.org 過去常常構建基於 LDAP 的 Samba RPM,但我上次發現他們已經將該包從他們的站點上刪除了)。

將源代碼復制到方便的位置(例如,/usr/local/src),然后用下列命令對它解壓縮:

tom@phaedrus src $ tar xvzf samba-latest.tar.gz

現在,用“cd”命令進入 samba/source 目錄,然后輸入 ./configure --help 來查看配置選項列表。出於本教程的目的,此處列出構建 Samba 的方法:

tom@phaedrus source $ ./configure \
--with-smbmount \
--with-automount \
--with-configdir=/etc/samba \
--with-ldapsam \

上述配置的關鍵是 --with-ldapsam 選項;就是該選項通知 Samba 將 LDAP SAM 而不是 smbpasswd 用於用戶認證。--with-smbmount是僅用於 Linux 的選項,您可以完全按照自己的個人喜好來改換 Samba 配置文件的位置。

當配置過程完成時,輸入 make && make install。現在,如果不出現任何錯誤,Samba 就已准備就緒了。

注意:可以將 Samba 配置成使用加密密碼或明文密碼。大多數管理員會選擇前者。但是,加密密碼與 PAM(可插入的認 證模塊,Pluggable Authentication Modules)是互斥的。如果您構建 Samba 時使用了 --with-pam 選項,並且嘗試同時使用加密密碼和 LDAP 目錄,那么最終結果是您會碰到一些令人頭疼的、前后不一致的行為。在這一點上請相信我。

來自簡單 RPM 的 Samba

如果您是鐵桿 RPM 迷,或者只是想確保 RPM 數據庫的完整性,以下是如何從 Samba SRPM(源 RPM)構建三個必需的 RPM 的方法。

  • 首先從 Red Hat(ftp.redhat.com 或本地鏡像)獲取最新的 samba-2.2.X-X.src.rpm。
  • 安裝 RPM:rpm -ivh samba-2.2.X-X.src.rpm
  • 編輯 /usr/src/redhat/SPECS/samba.spec 文件並添加您想要的選項。使用上一頁的示例:--with-smbmount --with-pam --with-ldapsam
  • 現在構建 RPM:cd /usr/src/redhat/SPECS/ && rpm -ba samba.spec。這個操作將創建三個 RPM 文件,samba-common-X.X.X-X、samba-client-X.X.X-X 和 samba-X.X.X-X

處理 RPM 時的一個警告:如果您正在從 Red Hat 以外的來源(例如,從 Samba 站點下載的 RPM)安裝 RPM,請總是卸載任何現有的 Samba 包。我多次看到許多人最終在他們的系統上得到兩個不同的 Samba 副本,因為他們所安裝的第三方 RPM 放置二進制文件的位置與 Red Hat 不同(也就是,新安裝並未覆蓋先前的安裝)。這個警告同樣適用於任何從源代碼安裝 RPM 的人 ― 首先卸載任何現有的 RPM

從 Red Hat 系統卸載 Samba RPM:

[root@pdc root]# rpm -qa | grep samba
samba-common-2.2.3a-3
samba-2.2.3a-3
samba-client-2.2.3a-3
[root@pdc root]# rpm -e samba

安裝 OpenLDAP

安裝 OpenLDAP 很容易;如果您進行了標准的服務器安裝,就已經完成了三分之二的 OpenLDAP 安裝工作。

以下是您的“路線圖”……在 Red Hat 7.2 和 7.3 上執行缺省的服務器安裝,則會安裝 openldap-version.rpm 和 openldap-clients-version.rpm,但卻忽略安裝 openldap-servers-version.rpm。因此,您應該做的第一件事就是進行檢查,以確保撰寫本文以來,Red Hat 的人們沒有更改他們的安裝策略:

[root@pdc root]# rpm -qa | greg samba

瀏覽上述操作產生的輸出。您應該已經安裝了三個 RPM:一個常用組件(只是 openldap)、一個客戶機組件和一個服務器組件。您可能必須從安裝 CD 找到服務器 RPM 並安裝它。沒有服務器 RPM,您將丟失一些關鍵配置文件、模式目錄以及實際的 LDAP 守護進程。

安裝 IDEALX Perl 腳本

對於安裝而言,最后一些問題是安裝由 IDEALX 維護的一組腳本。盡管並非絕對必需(您可以總是使用 OpenLDAP 提供的實用程序手工插入記錄),但在配置和填充服務器時,它們確實使工作變得輕松。實際上除此以外有許多許多與 LDAP 和 Samba 進行相互操作的腳本和程序,因此,如果您不喜歡 IDEALX 所提供的版本,請在 Google 上進行搜索並找到您喜歡的腳本。

可以從這里獲得 RPM 格式和 TGZ 格式的 IDEALX 腳本。將它們下載到硬盤並解壓縮到選定的目錄。出於本教程的用途,我們將腳本放置在/usr/local/sbin 中。

現在,所有必需的軟件都已就位,我們可以開始配置。

 

配置 OpenLDAP

LDAP 配置過程

安裝了服務器軟件之后,下一步是將 OpenLDAP 配置成 Samba 的用戶認證源。本章討論下列內容:創建必需的 LDAP 配置文件、添加特定於 Samba 的模式、用一些基本項填充 LDAP 目錄和配置 LDAP 以使用 PAM(可插入的認證模塊)進行用戶認證。

有許多規划 LDAP 樹的方法。出於本教程的目的,我們創建了如下的 DN(專有名稱,Distinguished Name)樹:

  • 我們的頂級 DN:dc=syroidmanor,dc=com
  • 頂級下面有三個組織單元(ou)
    • ou=Users ― 用來存儲用戶帳戶,對於由 UNIX 和 Windows 系統混合組成的域而言,是 nis.schema 的 shadowAccount 和 samba.schema 的 sambaAccount;對於僅由 Windows 系統組成的域而言,是 samba.schema 的 sambaAcount。
    • ou=Computers ― 用來存儲 Windows 系統的計算機帳戶(sambaAccount)
    • ou=Groups ― 用來存儲 Windows 系統和基於 UNIX 的系統(以及其它知道 LDAP 的客戶機)的用戶組(nis.schema 的 posixGroup)。

注:不使用影子密碼(shadow password)的 UNIX 系統不需要 shadowAccount 對象;在此類情況下,posixAccount 對象布局(也是來自於 nis.schema)就足夠了。

步驟 1:復制 samba.schema

第一步是將 samba.schema 復制到 /etc/openldap/schema

如果從源代碼編譯 Samba,則該文件位於 [base-src-dir,通常是,/usr/local/src/samba]/example/LDAP/] 目錄。如果將修改過的 RPM 用於安裝,則該文件可能(布局因分發版而異)在 /usr/share/doc/samba-version/examples/LDAP/ 下。

提示:一些較早的 Samba 包(2.2.x 之前)在 samba.schema 中列出了一種屬性類型 displayName。這一項復制了 inetorgperson.schema 中的相同項。在此類情況下,通過在關聯塊的每行前面放置一個井號(#)來編輯 samba.schema 並注釋掉 displayName 屬性類型。

步驟 2:編輯/創建 slapd.conf

下一步是創建或編輯 /etc/openldap/slapd.conf;一些 OpenLDAP 安裝創建一個基本 slapd.conf 文件以用作出發點,另一些則不是這樣。

下一頁將討論下列清單中相關項的說明。

# /etc/openldap/slapd.conf
# last modified, 4/20/02 by TMS

include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/redhat/rfc822-MailMember.schema
include /etc/openldap/schema/redhat/autofs.schema
include /etc/openldap/schema/redhat/kerberosobject.schema
include /etc/openldap/schema/samba.schema

pidfile	//var/run/slapd.pid
argsfile	//var/run/slapd.args

#Sample Access Control
#	Allow read access of root DSE
#	Allow self write access
#	Allow authenticated users read access
#	Allow anonymous users to authenticate
access to dn="" by * read
access to *
        by self write
        by users read
        by anonymous auth
# if no access controls are present, the default is:
#	Allow read by all
# rootdn can always write

###############################################
############# ldbm database definitions#############
###############################################
database ldbm
suffix "dc=syroidmanor,dc=com"
rootdn "cn=Manager,dc=syroidmanor,dc=com"
rootpw secret

# The database directory MUST exist prior to running slapd AND 
# should only be accessibleby the slapd/tools. Mode 700 recommended.
directory	/var/lib/ldap

# Indices to maintain
index   primaryGroupID  eq
index   rid             eq
index   uid             eq
index   uidNumber       eq
index   gidNumber       eq
index   cn              pres,sub,eq
index   objectClass     eq
index   default         sub
# ends

詳細討論 slapd.conf

注:下面的討論是關於上一頁中顯示的 slapd.conf 的:

  • 文件名是 slapd.conf而不是 某些人猜想中的 sldap.conf
  • slapd.conf 的用途是控制/配置 OpenLDAP 服務器守護程序。
  • include 語句告知 LDAP 服務器為對象存儲啟用哪種模式;確保您列出了 samba.schema。
  • 一些模式具有依賴性。許多人沒有意識到這一點,他們最后為設法找出其 LDAP 服務器不能啟動的故障原因而大傷腦筋。依賴性總是在模式文件(模式文件只是文本;要快速地檢查模式文件類型:less nameofschema.schema)的開始部分列出。例如,samba.schema 依賴於 cosine.schema 中 uid 屬性和 inetorgperson.schema 的 displayName 屬性;與此相反,core.schema 是“頂級”模式,沒有依賴性。
  • 請注意關於訪問控制的注釋 ― 如果沒有訪問控制,那么所有用戶都只能進行讀操作;而 rootdn(cn=Manager)總是可以讀/寫。
  • 項是區分大小寫的。“cn=Manager”與“cn=manager”不同。這一事實使得許多管理員成天撓着頭皮設法搞清楚為什么他們不能訪問自己的目錄。
  • rootpw 項正如其名稱一樣 ― rootdn 或“Manager”在對目錄進行寫操作時必須提供的密碼。顯然“secret”不是好的選擇。好的密碼應該混合大、小寫和標點符號,並至少有 8 個字符長。而且,假定 root 密碼是存儲在純文本中,確保小心地保護對該文件的訪問,以切實避免它“對全世界都可讀”。大多數安裝都正確地配置了該文件,但進行復核沒有壞處。在 Red Hat 下,OpenLDAP 服務器是作為用戶/組 ldap.ldap 運行的。
  • database 項確定目錄數據的存儲格式。取決於為該目錄服務的后端類型,這一項可以是 ldbmshell 或 passwd 中的一種。也存在使用象 MySQL 或 DB2 這樣的關系數據庫來存儲目錄對象的選項。請參閱 man slapd.conf 以獲取詳細信息(請牢記,man 命令是您的朋友!)。通常,對 RDBM 的支持需要重新編譯 OpenLDAP。

下一步我們將創建 /etc/openldap/ldap.conf 文件。

步驟 3:創建 ldap.conf

與 /etc/openldap/slapd.conf 相比,/etc/openldap/ldap.conf 相對簡單些。ldap.conf 由 OpenLDAP 客戶機和庫使用。警告:在一些 LDAP 配置中,服務器上出現了兩個ldap.conf文件:/etc/ldap.conf(由 PAM 使用)和 /etc/openldap/ldap.conf(由 LDAP 客戶機和庫使用);不要混淆這兩者。

# /etc/openldap/ldap.conf
# LDAP defaults for clients and libraries
# At a minimum, HOST and BASE need to be set
# See man ldap.conf for further settings and options

HOST 127.0.0.1
BASE dc=syroidmanor, dc=com

# ends

其它可用於 ldap.conf 的選項包括搜索超時、最大返回搜索大小、連接端口(如果不是缺省的話)和用於通過 Cyrus SASL 進行連接的幾個安全性特性。注:每個用戶都可以通過創建 .ldaprc 並將它放置在自己的主目錄中來指定唯一的設置。管理員也可以通過強制 LDAP 只讀取/etc/openldap/ldap.conf 文件來覆蓋這個選項。

步驟 4:啟動服務器

最后,啟動 OpenLDAP 服務器。在基於 Red Hat 的系統上,輸入 /etc/init.d/ldap start。服務器啟動時應該有錯誤或聲明。如果不是這樣:

  • 驗證您裝入了正確的模式並滿足了所有依賴性。
  • 驗證 /var/lib/ldap 存在並由被指派運行服務器的用戶/組(在 Red Hat 下是 ldap.ldap)所擁有。
  • 對所有配置文件的拼寫、正確的“dn”項等進行復核。
  • 着手閱讀 LDAP 文檔(man ldapinfo slapd 和 www.openldap.org 是三個不錯的起點)。

初始項

既然 LDAP 服務器已經在運行了,是用一些初始項填充目錄的時候了。有兩種進行這一操作的方法:

  • 一,使用我們在本教程先前部分下載並安裝的 smbldap-tools 腳本。
  • 二,創建文本文件(base.ldif)並用 ldapadd 命令添加項。

我們將從 smbldap-tools 方法入手……

使用 smbldap-populate.pl

根據第 2 章中提供的安裝指示信息,首先用“cd”命令進入 /usr/local/sbin。您會在那里找到一個名為 mkntpwd.tar.gz 的文件。進行下列操作以解壓縮、構建和編譯程序:

[root@thor sbin]# tar xvzf mkntpwd.tar.gz
[root@thor sbin]# cd mkntpwd
[root@thor sbin]# make
[root@thor sbin]# make install
# Note: this will place the built executable in /sbin; 
# I prefer all my smbldap files together in one place,
# so the following further steps are required.
[root@thor sbin]# cd .. && rm -rf ./mkntpwd (remove the directory 
so the file can be copied back)
[root@thor sbin]# mv /sbin/mkntpwd /usr/local/sbin

現在,在您喜歡的文本編輯器里打開 /usr/local/sbin/smbldap_conf.pm,然后開始編輯。您將找到略少於一頁的指示信息(## Configuration Start here),它確切地指出了哪些項需要更改。如果您已經脫離了本章先前討論的組織單元,則必須更改$usersdn$computersdn 和 $groupsdn 項。此外:

  • 在 $binddn 下輸入 dn=Manager而不是“manager”(如果您采用本教程中所使用的示例的話;關鍵在於確保與所有 LDAP 和 SMBLDAP 工具配置文件上的大小寫匹配)。
  • 不要忘記對 $_userSmbHome/$_userProfile 節中使用的任何反斜杠進行轉義操作(“\\”)。
  • 確保到 smbpasswd 的路徑是正確的(我的項讀取 /usr/local/samba/bin/smbpasswd)。
  • 檢查所有屬於 UIDGID 等的項,以確保所用的項與您的用戶/組編號約定匹配。

最后,執行 smbldap-populate.pl。如果配置是正確的,腳本將輸出一串“adding entry...”資料,並且用一組基本對象填充目錄。如果得到任何“credential”或“cannot bind”錯誤,則說明 smbldap_conf.pm 中某處存在拼寫錯誤 ― 回頭重新檢查您的項。

用 LDIF 文件進行手工填充

OpenLDAP 當然可以滿足那些喜歡手工執行操作的管理員。填充 LDAP 目錄的第二種方法是使用 LDIF 文件。LDIF 文件是文本文件,具有多個遵循特定格式的項。下面是兩個樣本目錄對象項。

dn: dc=syroidmanor,dc=com
objectClass: domain
dc: syroidmanor

dn: ou=Users,dc=syroidmanor,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Users
description: System Users

用上述格式創建一個名為 base.ldif 的文件並創建您希望的對象。將該文件保存到您所選擇的目錄,然后執行下列命令:

[root@thor root]# ldapadd -x -h localhost -D "cn=Manager,dc=syroidmanor,dc=com"
-f /root/base.ldif -W

系統將提示您輸入“Manager”的密碼(在所提供的示例中是“secret”),如果文件中沒有語法錯誤,則用該文件的內容填充目錄。

輸入 man ldapadd 以獲取上述選項開關作用的說明。可在結束語和參考資料 一章獲取樣本 base.ldif 文件。

為 PAM 認證配置 LDAP

如果您選擇使用 PAM(請牢記先前的警告 ― PAM 與 Samba 和加密密碼的合作並不好),則需要配置 LDAP 以使用 PAM 進行用戶認證(這是個與使用 LDAP 認證 Samba 用戶截然不同的問題)。幸運的是,在 Red Hat 下這個過程很簡單,因為有捆綁的程序:/usr/sbin/authconfig/usr/sbin/authconfig

作為 root 用戶,從命令行或終端窗口,輸入 authconfig 並選擇下列選項/復選框:

  • Cache Information
  • Use LDAP
  • “不要”選擇 Use TLS ― 除非您徹底了解您的安全認證協議,否則啟動和運行 TLS 是一個痛苦的過程
  • Your Server 是 127.0.0.1(除非 LDAP 服務器物理上位於另一個系統上)
  • Base DN: dc=syroidmanor,dc=com
  • Use Shadow Passwords
  • Use MD5 Passwords
  • Use LDAP Authentication
  • 再次選擇,Server: 127.0.0.1
  • Base DN: dc=syroidmanor,dc=com

Cache Information 選項意味着使用 nscd(名稱服務高速緩存守護程序,Name Service Caching Daemon)服務;它高速緩存頻繁使用的 LDAP 請求。在最后一個對話框上選擇 OK 將自動啟動 nscd 守護程序。最后一個難題是編輯/etc/ldap.conf 文件。

編輯 /etc/ldap.conf

正如本章先前部分所提到的,當使用 PAM 認證時,LDAP 使用另一個 ldap.conf 文件。打開您喜歡的文本編輯器並將下列內容添加到/etc/ldap.conf 中:

# /etc/ldap.conf
# LDAP authentication configuration
# last modified, 4/15/02, TMS
host 127.0.0.1
# your LDAP server
base dc=syroidmanor,dc=com 
# your DN search base
# point the nss modules to the correct search base
nss_base_passwd   dc=syroidmanor,dc=com?sub
nss_base_shadow   dc=syroidmanor,dc=com?sub
nss_base_group     ou=Groups,dc=syroidmanor,dc=com?one
ssl no
pam_passwd  md5
# ends

在上述示例中,因為目錄樹的組織而使用了“?sub”查詢選項;我們選擇分離出“ou=Computers”和“ou=Users”。有關 ?sub 和 ?one 選項的更多詳細信息,請在因特網上搜索 RFC2307。還可獲得一份 PDF 文檔,它解釋了 PAM 和 NSS 背后的概念和實現;請參閱結束語和參考資料 一章以獲取更多信息。

測試

最后,關鍵時刻到來了 ― 這一切都有效嗎?

轉到包含 SMBLDAP Perl 腳本的目錄;所提供的示例在 /usr/local/sbin 中。使用 smbldap-tools 創建新用戶時輸入下列命令:

[root@thor sbin]# ./smbldap-useradd.pl -m testuser2
adding new entry "uid=testuser2,ou=Users,dc=syroidmanor,dc=com"
[root@thor sbin]# ./smbldap-passwd.pl testuser2
Changing password for testuser2
New password :
Retype new password :
all authentication tokens updated successfully
[root@thor sbin]#

現在,嘗試用剛才創建的帳戶從另一台計算機登錄到系統上。如果正確地配置了一切,則應該正確地認證您:

[tom@phaedrus tom]$ ssh testuser2@thor
testuser2@thor's password:
Last login: Thu Apr 25 11:28:24 2002 from 192.168.1.100
[testuser2@thor testuser2]$ id
uid=1000(testuser2) gid=100(users) groups=100(users)

現在,讓我們轉過頭來研究一下等價的 Samba 端。

 

配置 Samba

配置

在完成 LDAP 部分的配置之后,所剩下的工作就只是告知 Samba 執行用戶認證時要使用 LDAP 目錄服務而不是自身的密碼文件 smbpasswd。這是個相對簡單的過程,尤其是當假定了這樣的起點:我們已經有一個配置正確、功能正常的 Samba PDC。首先,給出一些背景知識說明:

  • Samba 將其所有的配置信息存儲在一個文件中,這就是 smb.conf。這個文件的位置因安裝選項而異;缺省目錄是/usr/local/samba/lib
  • 我們的服務器正在進行域認證的域名為 SYROIDMANORsmb.conf 中的“workgroup =”選項)。
  • 該服務器的 NETBIOS 名是 THOR
  • 該服務器被配置成該網絡的“主瀏覽器(master browser)”。
  • 該服務器被配置成提供“漫游”概要;它們存儲在 /home/samba/profiles 下。
  • 當用戶登錄時,位於 /home/netlogon 目錄中的任何腳本都將運行。

下一步是添加必需的特定於 LDAP 的選項。這些選項都放置在 smb.conf 的 [global] 節中。

LDAP 服務器詳細說明

下列配置片段顯示了“引導”Samba 將目錄服務用於用戶認證所需的特定於 LDAP 的選項:

;LDAP-specific settings
   ldap admin dn = "cn=Manager,dc=syroidmanor,dc=com"
   ldap server = localhost
   ldap port = 389
   ldap ssl = no
   ldap suffix = "ou=Users,dc=syroidmanor,dc=com"
  • 第一行告知 Samba 誰是 LDAP 目錄的管理員;即 Samba 在添加、刪除或修改用戶帳戶時的登錄用戶。注:這一項必須與 slapd.conf 文件的 rootdn 項匹配(要完全匹配 ― 注意大小寫!)。
  • 下一行指定了主管 LDAP 目錄的計算機的名稱。在本教程提供的案例中,Samba 和 OpenLDAP 位於同一系統中。如果在您的網絡拓撲結構中 LDAP 駐留在另一個系統上,則用該計算機的名稱替換 localhost。也可以使用靜態 IP 代替計算機名稱。
  • 第三行是配置 LDAP 服務器“偵聽”的端口。端口 389 是標准的非加密端口;636 是標准的加密端口。如果將下一行設置成 ldap ssl = on,則 Samba 會自動嘗試與端口 636 上的目錄服務器通信。
  • ldap ssl 選項決定是否對 PDC 和 LDAP 服務器之間的通信加密。如果您正在使用 SSL 加密,則將 ldap ssl = no 更改成yes(或“on”)。我們不設置成加密通信,因為兩種服務都基於同一服務器。
  • ldap suffix 是在搜索目錄時使用的基本 DN。如果除去該選項,則 LDAP 將從樹頂(即 dc=syroidmanor,dc=com)開始所有搜索。將這個選項設置成常用搜索點(如“Users”)會加快查找時間。

上一節還可以再添加一條選項:ldap root passwd =。如果有其它選項存在,那么將管理員密碼原封不動地留在配置文件中就決不是一個好主意(在 /etc/openldap/slapd.conf 情況下,不存在其它選項)。在這種情況下我們確實另有選擇 ― 可以將它作為秘密隱藏在 tdb 數據庫中。

管理秘密

整個練習的目的是將所有用戶認證信息存儲到一個中央資源庫(也即 LDAP 目錄)中。但是 Samba 守護程序必須代表 LDAP 管理員更改那里存儲的信息。這意味着 Samba 必須知道管理員的密碼。我們加密了該密碼並將它儲存在只有 Samba 能夠訪問的 tdb 數據庫中,而不是將該密碼放在他人可能“闖入”的文件中。完成這一操作的命令是:

smbpasswd -w yoursecretpassword

這一操作將創建一個名為 secrets.tdb 的文件,在缺省安裝的情況下該文件存儲在目錄 /usr/local/samba/private 中。注:您在上述操作中輸入的密碼必須與 /etc/openldap/slapd.conf 中包含的“秘密”密碼匹配。

腳本更新

我們需要對 smb.conf 作的最后的更改是兩個選項行,其中一行允許用戶從客戶機更改其密碼,另一行允許在必要時自動添加機器帳戶。下面是這兩個選項行:

;password sync
   passwd program = /usr/local/sbin/smbldap-passwd.pl -o %u
   passwd chat = *New*password* %n\n *Retype*new*password* 
   %n\n *passwd:*all*authentication*tokens*updated*
   unix password sync = Yes

;automatically add trust accounts
   add user script = /usr/local/sbin/smbldap-useradd.pl
   -m -d /dev/null -g computers -s /bin/false

如您所見,我們只是用本教程中先前安裝的 Perl 腳本替換了 /usr/local/samba/bin/smbpasswd 命令。之所以這樣更改,是因為smbpasswd 不知道如何與 LDAP 服務器交互;而取代它的 Perl 腳本則知道。下一頁是完整的 smb.conf 清單。

完整的 smb.conf

# /usr/local/samba/lib/smb.conf
# samba configuration file
# last updated: 4/19/2002 by tms

[global]

   ;basic server settings	   
   workgroup = SYROIDMANOR
   netbios name = THOR
   server string = Samba-LDAP PDC running %v
   socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192

   ;PDC and master browser settings
   os level = 64
   preferred master = yes
   local master = yes
   domain master = yes
   wins support = yes

   ;security and logging settings
   security = user
   encrypt passwords = yes
   log file = /var/log/samba/log.%m
   log level = 2
   max log size = 50
   hosts allow = 127.0.0.1 192.168.1.0/255.255.255.0

   ;password sync
   passwd program = /usr/local/sbin/smbldap-passwd.pl -o %u
   passwd chat = *New*password* %n\n *Retype*new*password* %n\n
   *passwd:*all*authentication*tokens*updated*
   unix password sync = Yes

   ;LDAP-specific settings
   ldap admin dn = "cn=Manager,dc=syroidmanor,dc=com"
   ldap server = localhost
   ldap port = 389
   ldap ssl = no
   ldap suffix = "ou=Users,dc=syroidmanor,dc=com"

   ;user profiles and home directory
   logon home = \\%L\%U\
   logon drive = H:
   logon path = \\%L\profiles\%U
   logon script = netlogon.bat
   
   ;automatically add trust accounts
   add user script = /usr/local/sbin/smbldap-useradd.pl
   -m -d /dev/null -g computers -s /bin/false

# ==== shares ====

[homes]
  comment = Home Directories
  valid users = %S
  browseable = no
  writeable = yes
  create mask = 0664
  directory mask = 0775

[profiles]
  path = /home/samba/profiles
  writeable = yes
  browseable = no
  create mask = 0600
  directory mask = 0700

[netlogon]
  comment = Network Logon Service
  path = /home/netlogon
  read only = yes
  browseable = no
  write list = tom

扔掉開關……

關鍵時刻已經來到……現在是測試您手藝的時候了。在控制台(或控制台窗口中)以 root 用戶輸入(在 Red Hat 系統上,一些分發版對其初始化腳本使用不同的布局):

/etc/init.d/smb start [或者如果 Samba 已經運行,restart]

使用 Samba 總是很容易知道您是否拼錯了選項或參數 ― 守護程序將在沒有任何錯誤警告的情況下啟動和退出。這就是為什么總是在 ps -ef | grep smb 命令后面跟上 Samba start|restart 是個好主意的原因。您應該看到至少一個 smbd 和一個 nmbd 守護程序正在運行。

如果 Samba 啟動失敗:

  • 輸入 testparm(或者 /usr/local/samba/bin/testparm,因 Samba 安裝而異)並檢查輸出。如果有語法錯誤,testparm 將指出它出現的行號。
  • 檢查您的網絡連接(以 root 用戶運行 ifconfig -a);Samba 在運行之前需要檢查活動的網絡接口。
  • 檢查 Samba 日志以獲取任何內部信息。日志位置也是取決於構建時的配置;在缺省編譯上,您會在 /usr/local/samba/var 下找到它們。

接下來我們將研究使用 IDEALX 腳本編制實用程序進行帳戶管理。

 

用戶管理

管理 Samba 用戶

在開始執行將用戶添加到 LDAP 目錄的實際操作之前,迅速復習一下與用戶/機器帳戶有關的 Samba 規則以及這些規則是如何在訪問 LDAP 存儲時規范 Samba 的行為,這樣做是沒有壞處的。

  • 規則一:在可以將用戶添加到 smbpasswd 密碼文件之前,該用戶必須在托管 Samba 服務的系統上擁有 UNIX/Linux 帳戶(通常存儲在/etc/passwd 中)。如果您嘗試使用 /usr/local/samba/bin/smbpasswd 實用程序添加用戶帳戶,則會被告知這種情況。如果您嘗試用 smbldap-useradd.pl 腳本添加用戶(我們將稍后討論它),則不會獲得這一情況的警告。
  • 規則二:如果您嘗試用前面提到的 Perl 腳本添加用戶帳戶(對於用戶,我的意思是說用戶帳戶或機器帳戶),則會為上述用戶在 LDAP 目錄中創建 POSIX 帳戶。然后,該用戶就能夠登錄到通過該 LDAP 服務器進行認證的任何基於 POSIX 的機器上。這個用戶將能訪問任何由該 LDAP 服務器認證並由 Samba 服務器托管的 Samba 共享。這是因為該用戶存在於 LDAP 樹的 posixAccount 分支中,而不是在 sambaAccount 分支中。
  • 規則三:(該規則是上述的規則一和二的結合),如果希望用戶同時在 LDAP 服務器上具有 POSIX 帳戶和 Samba 帳戶,則首先確保它們在 Samba 服務器上擁有現成的系統帳戶,然后用 smbldap-useradd.pl 將它們添加到 LDAP 目錄。

LDAP 的帳戶結構

迄今為止,我們對 LDAP 帳戶結構的大多數討論,都太過理論化了。為了進一步了解 LDAP 下的 POSIX 帳戶和 Samba 帳戶的差異,同時為了更詳細地說明前一頁中討論的帳戶創建過程,讓我們研究一個示例。下面顯示了一位用戶的 LDIF(LDAP 目錄信息文件,LDAP Directory Information File)輸出,該用戶是用下列命令創建的:/usr/local/sbin/smbldap-useradd.pl -m -P tom (“-m”基於 /etc/skel 中包含的模板創建用戶目錄和概要;“-P”在添加了該用戶之后提示輸入密碼)。要產生實際 LDIF 輸出:/usr/local/sbin/smbldap-usershow.pl tom

[root@thor sbin]# /usr/local/sbin/smbldap-usershow.pl tom
dn: uid=tom,ou=Users,dc=syroidmanor,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
cn: tom
uid: tom
uidNumber: 500
gidNumber: 100
homeDirectory: /hometom
loginShell: /bin/bash
gecos: User
description: User
userPassword:: e1NTSEF9bWxBL1RHZFNoTkREEWlGTndZOFlCWUVUdWp3MGgrbTc=

接下來,讓我們將另一個用戶添加到同一用戶項,並執行下列操作:

root@thor root # useradd -p test tom2
root@thor root # /usr/local/samba/bin/smbpasswd tom2
New SMB password: typesecretpassword
Retype new SMB password: typesecretpassword
User added
All authentication tokens updated
root@thor root #

現在,如果輸入 /usr/local/sbin/smbldap-usershow.pl tom,則獲得下列輸出:

dn: uid=tom,ou=Users,dc=syroidmanor,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: sambaAccount
cn: tom
uid: tom
uidNumber: 500
gidNumber: 100
homeDirectory: /hometom
loginShell: /bin/bash
gecos: User
description: User
userPassword:: e1NTSEF9bWxBL1RHZFNoTkREEWlGTndZOFlCWUVUdWp3MGgrbTc=
lmPassword: 552902031BEDE9EFAAD3B435B51404EE
pwdCanChange: 0
pwdMustChange: 2147483647
ntPassword: 878D8014606CDA29677A44EFA1353FC7
pwdLastSet: 1010179230
rid: 2000

如您所見,用戶 tom 的 LDIF 現在同時具有 posixAccount 詳細信息和 sambaAccount 信息。

側欄:uid、gid 和 RID

您也許在 Samba 文檔或者可能是在 LDAP 帳戶的輸出中見到過對術語 RID 的引用。那么什么是 RID 呢?UNIX 操作系統(包括象 Linux 這樣的派生物)通過整數 uid(用戶標識,User ID)唯一地標識用戶,並通過整數 gid(組標識,Group ID)唯一地標識組。當以某一用戶登錄時,通過輸入 id 即可訪問這個信息。

當前的 Microsoft 操作系統通過稱為 RID 的值唯一地標識用戶和組,該值通常是一個用十六進制表示的整數。在 UNIX 下,用戶和組存在於獨立的名稱空間中。而在 Microsoft 操作系統上,用戶和組存在於一個名稱空間中。

Samba 使用下列公式將 UNIX uid 和 gid 映射為 RID:

rid = 2 (uid) + 1000
rid = 2 (gid) + 1001

因此,如果工作在 Red Hat 系統上的用戶 tom,其 uid 為 500,gid 為 500,則映射到 Microsoft 域中的 RID 分別為 2000 和 2001。

 

結束語和參考資料

更多的參考資料:LDAP 和 OpenLDAP

下列參考資料將引導您開始理解和實現 LDAP 目錄服務的旅程:

  • 到 www.openldap.org 查找關於 OpenLDAP 項目一切權威的資料來源。您不僅可以在此處找到最新 OpenLDAP 發行版(當撰寫本文時是 2.0.23),而且可以找到許多好文檔。特別地,查看 OpenLDAP 2.0 Administrator's Guide
  • 在巨大的萬維網上,有無數關於 LDAP 配置和實現的參考資料。打開您喜歡的瀏覽器,上 Google.com 輸入“LDAP and OpenLDAP”作為搜索短語,以獲取內容廣泛的列表。真正的竅門在於分清良莠。我所發現的兩個特別有用的參考資料是 Meer 和 Biondo 編寫的 LDAP Implementation HOWTO,以及 YoLinux LDAP Tutorial。YoLinux 教程上還有非常不錯的 OpenLDAP 鏈接。另一份好的參考資料是 Luiz Ernesto Pinheiro Malere 編寫的 LDAP Linux HOWTO。就個人而言,我發現沒有一篇 HOWTO 向我提供了我所需要的全部知識,因此,從大量參考資料中獲取最有用的信息是很重要的。
  • IBM 的紅皮書一直是高級的和特定於平台的信息的良好來源。在紅皮書站點上的一次簡單搜索將為您網羅 40 個以上使用術語“ldap”的鏈接結果。我個人向您推薦的書籍是 Understanding LDAP(SG24-4986-00)和 LDAP Implementation Cookbook(SG24-5110-00)。
  • Adam Tauno Williams 編寫了兩份很好的教程,它們詳細講述了如何以及為什么使用 PAM 和 NSS 認證和 LDAP V3。兩者都有 PDF 文件。
  • 本教程中討論的名稱服務模塊 nss_ldap 和 pam_ldap 是由 PADL Software 維護和分發的。

更多參考資料:Samba

與 LDAP 類似,Web上的 Samba 參考資料也很豐富:

  • 正式 Samba 站點是 www.samba.org。在這里,您會找到最新穩定源代碼(各種平台和分發版的 RPM 和 TGZ 文件)的最新下載,以及通過 CVS 提供的最新開發成果。Samba 站點上的可用文檔也很多。尤其是獲取 Samba-HOWTO-Collection;它有 PDF 和 HTML 兩種格式。Samba 郵件列表也是經驗和信息的很棒的來源。
  • 不要忘記瀏覽隨 Samba 一起提供的文檔。假定基本安裝的目錄是 /usr/local/samba,則可以在 ../swat/using_samba 下找到 O'Reilly 的 Using Samba 一書的完整文本,並可在 ../swat/help 下找到一些有用的 HTML 文檔。
  • 當然,配置 Samba 擔任 Windows 域控制器的權威指南是我編寫的 Samba as a PDC,該教程目前位於 IBM eServer 開發者園地
  • IDEALX.org 是獲取本教程中使用的 Samba/LDAP Perl 腳本的地方。同一位置還有一份 Samba PDC/LDAP HOWTO 可下載;但是,它不完整並有很多模糊之處,而且沒有反映 Samba 的最新功能。
  • PADL Software 站點除了托管前面提到的 nss_ldap 和 pam_ldap PAM 模塊外,還有遷移腳本集,您也許有興趣查看一下。類似於 IDEALX 腳本,它們是用 Perl 編寫的,PADL 腳本旨在遷移諸如 /etc/hosts、/etc/group、/etc/networks 和 /etc/passwd 之類的 UNIX 配置文件,而不是針對 Samba 用戶管理。
  • 最后,是 Ignacio Coupeau 維護的一篇 Samba-PDC LDAP V3 HOWTO。它在許多方面也不完整,但為您指出了大方向。它還有一些關於配置 Samba 以使用 SSL 和 TLS 進行認證的好參考資料。注:HEAD 補丁 Coupeau 列表已經集成到 Samba HEAD CVS 樹中。

祝您好運,玩得開心點!

反饋

請將您對本教程的反饋發送給我們。我們盼望獲得您對本教程的意見!

參考資料

  • 這樣您就擁有了它 ― 一個完全配置的、將為 Samba PDC 提供用戶認證的 OpenLDAP 服務器。或者至少假定您最終得到了。這並非取笑您,毫無疑問,本教程中所包含內容所處的環境,會因為某些原因而對某些人無效。還記得我們先前在收集和構建必需的軟件 中討論的開放源碼軟件的選擇么?有時,選擇是一把雙刃劍。選擇也增加了一層復雜性,因為並非“條條大路通羅馬”。因此我們修修補補,最終找到一個解決方案 ― 但最終,它也可能只比原始方案更好些。然后,本着開放源碼模型的精神,我們又將那些解決方案回報給社區。

    因為本教程中的主題范圍所限,所以不能討論某些背景資料。例如,我們在本教程開始時假定您已經有效地啟動和運行了 Samba PDC;我們還假定您對 LDAP 幕后的術語和概念有基本的理解。如果您發現自己對 LDAP/Samba 的了解有一些缺陷,則請看一看后兩頁中列出的參考資料。它們包含一些優秀的背景材料和深入的看法,即使是對於經驗豐富的管理員,這些參考資料也肯定會使他們受益匪淺。

    我相信,您已經發現此處提供的參考資料對於您的特定實現是有用和有益的。與往常一樣,感謝提出意見、指出缺點和勘誤。請填寫最后一頁的反饋表單,或者直接給我發郵件(ibm-feedback@syroidmanor.com)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM