互通性

使用 Active Directory 對 Linux 用戶端進行身份驗證

Gil Kirkpatrick

 

概覽:

  • 如何在 Windows 和 Linux 中進行身份驗證
  • 使用 Samba 和 Winbind
  • 實施策略
  • 逐步瞭解 Linux 與 Active Directory 的集成

目錄

Windows 身份驗證
Linux 身份驗證
Samba 和 Winbind
三種身份驗證策略
我們的實施計畫
查找適當的軟體
構建 Samba
配置 Linux 網路
配置 Linux 時間同步
配置 PAM 和 NSS
安裝和配置 Samba
ID 映射問題
加入域並登錄
如果域不能正常工作該怎麼辦?
既然域能正常工作,您又應該怎麼辦?
協力廠商解決方案

共和黨和民主黨。 牙膏和桔子汁。 Linux 和 Windows。 有些東西放在一起就是不搭配,對吧?我曾參與過的每個 IT 商店都分成兩大陣營:Windows 團隊和 Linux 團隊。 它們彼此既不互相競爭,也不互相協作。 事實上,有些地方甚至還在地板上畫上一道黃線,以絕對確保兩組之間沒有不適當的友善關係。

我是 Windows 這一邊的,當然也曾嘲弄過那些使用 Linux 的同事,但我們的目標是一致的,全都希望為公司提供高品質且經濟高效的 IT 服務。 我們實現此目標的方法之一是共用內核軟體基礎結構,如 Active Directory。 幾乎所有的 IT 組織都採用 Active Directory,為它們的 Windows 桌面和伺服器提供身份驗證服務。 與其針對 Linux 環境維護一個不同的身份驗證基礎結構(加上一組不同的使用者名和密碼),還不如讓 Linux 電腦也採用 Active Directory,這樣豈不是更好?我贊同這樣做,而且我將在本文中向您介紹如何實現這一目的。

Windows 身份驗證

Windows 推出集成網路身份驗證和單一登入系統至今已有一段時間了。 在 Windows 2000 之前,Windows NT 網域控制站 (DC) 使用 NT LAN Manager (NTLM) 協定為 Windows 用戶端提供身份驗證服務。 雖然 NTLM 不像當初想像的那樣安全,但它還是非常有用的,因為它完美地解決了需要在網路上跨多個伺服器維護重複使用者帳戶的問題。

自 Windows 2000 開始,Microsoft 便從 NTLM 移到了 Active Directory 及其集成 Kerberos 身份驗證服務。 與 NTLM 相比,Kerberos 更安全,而且更適合調整。 此外,Kerberos 更是 Linux 和 UNIX 系統早已採納的行業標準,從而為這些平臺打開了與 Windows 集成的大門。

Linux 身份驗證

Linux(以及在其上面運行的 GNU 工具和庫)當初並不是以單一身份驗證機制的設計理念進行構建的。 因此,Linux 應用程式開發人員就逐漸養成了一種習慣,即創建他們自己的身份驗證方案。 他們設法通過在 /etc/passwd(包含 Linux 使用者憑據的傳統文字檔)中查詢名稱和密碼雜湊,或者提供截然不同(和個別)的機制,來實現這一目標。

由此產生了很多身份驗證機制,以至於無法對其進行管理。 1995 年,Sun 提出了稱為“可插入身份驗證模組”(Pluggable Authentication Modules, PAM) 的機制。 PAM 提供了一組所有應用程式開發人員都可以使用的通用身份驗證 API,以及管理員配置的後端,允許多種“可插入”身份驗證方案。 通過使用 PAM API 進行身份驗證以及使用 Name Server Switch (NSS) API 來查詢使用者資訊,Linux 應用程式開發人員可以少編寫一些代碼,並且 Linux 管理員可從同一個地方配置和管理身份驗證過程。

大多數 Linux 發佈版本都會隨附多個 PAM 身份驗證模組,其中包括支援對 LDAP 目錄進行身份驗證和使用 Kerberos 進行身份驗證的模組。 您可以使用這些模組對 Active Directory 進行身份驗證,但這其中存在一些明顯的限制。 稍後,我將在本文中討論這些限制。

Samba 和 Winbind

Samba是一種開放原始程式碼專案,旨在在 Windows 與 Linux 環境之間提供集成。 Samba 包含的元件使 Linux 電腦有權訪問 Windows 檔和列印服務,同時還提供了基於 Linux 的服務來類比 Windows NT 4.0 DC。 使用 Samba 用戶端元件,Linux 電腦便可利用 Windows NT 和 Active Directory DC 所提供的 Windows 身份驗證服務。

Samba 在這個專案中對我們來說最有趣的一部分叫做 Winbind。 Winbind 是在 Samba 用戶端上運行的幕後程式(在 Windows 中稱為服務),它的作用是充當在 Linux 電腦上運行的 PAM 和 NSS 與在 DC 上運行的 Active Directory 之間通信的代理。 具體來說,Winbind 使用 Kerberos 來對 Active Directory 和 LDAP 進行身份驗證,以檢索使用者和組資訊。 Winbind 還提供其他服務,如使用類似于 Active Directory 中 DCLOCATOR 的演算法來查找 DC 的功能,以及通過使用 RPC 與 DC 進行通信來重置 Active Directory 密碼的功能。

Winbind 解決了多個僅使用 Kerberos 和 PAM 無法解決的問題。 具體來說,Winbind 並不是將 DC 進行硬編碼以便按照 PAM Kerberos 模組的方式進行身份驗證,而是以類似于 Microsoft DC LOCATOR 模組運行的方式通過搜索 DNS 定位程式記錄來選擇 DC。

三種身份驗證策略

假設 Linux 電腦上提供了 LDAP、Kerberos 和 Winbind 三種身份驗證,我們可以採用三種不同的實現策略允許 Linux 電腦使用 Active Directory 來進行身份驗證。

使用 LDAP 身份驗證使用 Active Directory 進行身份驗證的最簡單但成效最低的方法是,將 PAM 配置為使用 LDAP 身份驗證,如圖 1 所示。 雖然 Active Directory 屬於 LDAPv3 服務,但 Windows 用戶端使用 Kerberos(回退到 NTLM)而不是 LDAP 進行身份驗證。

LDAP 身份驗證(稱為 LDAP 綁定)通過網路以明文形式傳遞使用者名和密碼。 對於大多數用途來說,這不僅不安全,而且也是無法接受的。

fig01.gif

圖 1 使用 LDAP 對 Active Directory 進行身份驗證(按一下圖像可查看大圖)

降低以明文形式傳遞憑據的風險的唯一方法是使用類似于 SSL 的協定加密用戶端與 Active Directory 進行通信所使用的通道。 這絕對可行,但會增加在 DC 和 Linux 電腦上管理 SSL 證書的負擔。 此外,使用 PAM LDAP 模組並不支援更改已重置的或過期的密碼。

使用 LDAP 和 Kerberos 利用 Active Directory 進行 Linux 身份驗證的另一種策略是,將 PAM 配置為使用 Kerberos 身份驗證,以及將 NSS 配置為使用 LDAP 查找使用者和組資訊,如圖 2 所示。 此方案的優點是,它相對來說比較安全,而且它利用的是 Linux 的“內置”功能。 但是它不利用 Active Directory DC 發佈的 DNS 服務位置 (SRV) 記錄,所以您會被迫挑選一組特定的 DC 來進行身份驗證。 對於管理即將過期的 Active Directory 密碼或是直至最近的適當組成員身份查詢,它提供的方法也不是很直觀。

fig02.gif

圖 2 使用 LDAP 和 Kerberos 對 Active Directory 進行身份驗證(按一下圖像可查看大圖)

使用 Winbind 使用 Active Directory 進行 Linux 身份驗證的第三種方法是,將 PAM 和 NSS 配置為調用 Winbind 幕後程式。 Winbind 將使用 LDAP、Kerberos 或 RPC(使用其中最合適的一個),將不同的 PAM 和 NSS 請求轉換為相應的 Active Directory 調用。 圖 3 說明了這一策略。

fig03.gif

圖 3 使用 Winbind 對 Active Directory 進行身份驗證(按一下圖像可查看大圖)

我們的實施計畫

由於與 Active Directory 的集成的增強,我選擇在 Red Hat Enterprise Linux 5 (RHEL5) 上使用 Winbind 來進行我的 Linux 與 Active Directory 集成專案。 RHEL5 是最新的商用 Red Hat Linux 發佈版本,而且它在企業資料中心中相當受歡迎。

使 RHEL5 對 Active Directory 進行身份驗證基本上需要下列五個不同的步驟:

  1. 查找並下載適當的 Samba 以及其他依存元件。
  2. 構建 Samba。
  3. 安裝並配置 Samba。
  4. 配置 Linux,特別是 PAM 和 NSS。
  5. 配置 Active Directory。

本文的下麵幾節將詳細介紹這些步驟。

查找適當的軟體

Linux 與 Windows 之間最大的區別之一是,Linux 由一個小型作業系統內核和大型的可單獨下載和安裝的元件集構成。 這雖然可以創建為某些任務而進行優化的特定 Linux 配置,但也會使伺服器的配置和管理變得極為複雜。 不同的發佈版本處理這種情況的方式也不一樣。 Red Hat(及其非商用版 Fedora)使用 Red Hat Package Manager (RPM) 來安裝和管理這些元件。

適用于 Red Hat 的 Linux 元件包含兩種形式。 RPM 檔包含針對元件版本、Linux 發佈版本和 CPU 體系結構的特定組合而預先編譯和構建的二進位檔案。 因此,您可以下載和安裝二進位檔案,例如,針對在 Intel x86 體系結構 CPU 上運行的 Fedora 版本 10 構建的通用 UNIX 列印系統 (Common UNIX Printing System, CUPS) 的 1.3.8-5 版本。 假如有十多種不同的 CPU 體系結構、100 多個 Linux 發佈版本,還有上千個套裝程式和版本,則要選擇的二進位 RPM 的數量之多便可想而知。

另一方面,源 RPM 檔包含給定套裝程式的實際原始程式碼。 但您需要自己下載和安裝源、配置構建選項,以及編譯和連結二進位檔案。 構建您自己的作業系統元件這一想法使習慣于 Microsoft 在 Windows 安裝 CD 上提供什麼就安裝什麼的 Windows 使用者十分畏怯,但是套裝程式管理器可使整個過程相當輕鬆,而且非常可靠。 Samba 小組發佈更新和安全修補程式的速度驚人,僅在 2008 年七、八月兩個月內,就發佈了四個版本的 Samba 3.2,總共包含 100 多個錯誤和安全修補程式。 對於此專案,我下載了最新的 Samba 穩定版本 3.0.31 版的源。

為什麼要下載 Samba 源,而不下載預先編譯的二進位檔案集呢?當然,我剛開始也嘗試過這麼做,但在調試器上花了數小時之後,我發現下載的二進位檔案並不是使用支援 Active Directory 身份驗證的正確選項構建而成的。 具體來說,在 Active Directory 中支援 Linux ID 映射的代碼在預設版本中被關閉了,因此我必須使用適當的構建選項重建 Samba。 稍後,我將在本文中詳細討論 ID 映射。

雖然 Linux 原本是小型內核,但 Red Hat Enterprise 發佈版本預先安裝了許多套裝程式。 這通常會使生活變得更輕鬆,因為您從完全正常運行的作業系統開始著手,但預先安裝的套裝程式有時會與您以後想要安裝的軟體發生衝突。

我在安裝 Red Hat 時,因為想要使用較新的版本,所以並沒有包含 Samba(通常會預設安裝 Samba)。 但是,較新版本的 Samba 要求已安裝的幾個其他庫和實用工具也要使用新版本。 這類的依賴問題非常煩人,不過,使用 RPM 就可以輕鬆解決。

承載二進位 RPM 套裝程式的網站很多。 我使用的網站(勿庸置疑,是我找到的第一個網站)稱為 PBONE,網址為 rpm.pbone. net。 該網站提供了搜索套裝程式的簡便方法,並且具有我的 CPU 體系結構 (i386) 和作業系統發佈版本 (Red Hat Enterprise Linux 5/Fedora 7&8) 所需的所有二進位檔案。

我必須下載和更新圖 4 中列出的套裝程式來構建和安裝最新的 3.0 版 Samba(但我從未嘗試過較新的 3.2 版)。 請注意,這些套裝程式主要針對 Fedora Core (fc) 發佈版本。 Red Hat 以 Fedora 使用的相同源為基礎,而且完全可與它交互。 針對 Fedora Core 7 及更高版本構建的套裝程式,不需要任何修改即可在 RHEL5 上運行。 請將下載的 RPM 檔放在 /usr/src/redhat/RPMS 目錄中。

圖 4 構建和安裝 Samba 3.0.31 所需的套裝程式

samba-3.031-0.fc8.src.rpm Samba 3.0.31 源 RPM
gnutls1.6.3-3.fc7.i386 GNU 傳輸層安全性 (TLS) 庫
gnutils-devel-1.6.3-3.fc7.i386 GNU TLS 開發檔
popt-1.12-3.fc8.i386 命令列參數分析庫
popt-devel-1.12-3.fc8.i386 命令列參數分析開發檔
cups-libs-1.2.12-11.fc7.i386 通用 UNIX 印表機系統庫
cups-devel-1.2.12-11.fc7.i386 通用 UNIX 印表機系統開發檔
cups-1.2.12.11.fc7.i386 通用 UNIX 印表機系統二進位檔案

構建 Samba

構建 Samba 的第一歩是下載適當的源 RPM。 我從 PBONE 網站下載了 Samba 3.0.31 的源 RPM。 然後,將下載的源 RPM 檔放到 /usr/src/redhat/SRPMS 中,這是構建過程中用於源 RPM 的標準目錄。

打開終端會話(在 Windows 中稱為命令列視窗)並移至 SRPMS 資料夾。 完成後,使用該命令安裝來源程式包,如圖 5 所示。

fig05.gif

圖 5 安裝 Samba 源 RPM(按一下圖像可查看大圖)

如果您看到“使用者 mockbuild 不存在,請使用根”錯誤警告,請不要擔心。 這個錯誤指出尚未安裝 Mock 構建實用工具,但沒有這些實用工具,構建過程也可以進行。

然後,移至 /usr/src/redhat/SPECS 目錄並編輯檔 SAMBA.SPEC,該檔包含了 Samba 構建選項。 搜索以“CFLAGS=”開頭的那一行,並確保存在“--with-shared-modules=idmap_ad,idmap_rid”選項。 此選項可確保構建過程包含將 Linux UID(唯一識別碼)適當轉換到 Active Directory 的代碼。 圖 6 顯示了此選項。

fig06.gif

圖 6 with-shared-modules 構建選項(按一下圖像可查看大圖)

接下來,您可能必須更新電腦上的一些庫,才能適當構建和安裝 Samba,具體取決於您安裝的是哪個版本的庫。 在我的例子中,我必須使用 rpm --install 命令安裝圖 4 中列出的套裝程式;在某些情況下,我必須使用 --force 選項來克服一些依賴問題。

要構建 Samba,請移至 /usr/src/redhat 目錄,並運行命令 rpmbuild –bb SPECS/samba.spec,如圖 7 所示。 此過程將新的 samba-3.0.31-0.i386 RPM 檔留在 /usr/src/redhat/RPMS 目錄中。 我們稍後將在此專案中安裝這個 RPM 檔。

fig07.gif

圖 7 創建 Samba 二進位 RPM 檔(按一下圖像可查看大圖)

配置 Linux 網路

為了使用 Active Directory 進行身份驗證,您的 Linux 電腦必須能夠與 DC 通信。 您必須配置三個網路設置才能與 DC 通信。

首先,重要的是通過使用動態主機設定通訊協定 (DHCP) 或使用 ifconfig 命令為 Linux 電腦分配適當的 IP 位址和網路遮罩,來確保適當配置該電腦的網路介面。 在 RHEL5 下,通過從“系統”|“管理”功能表中選擇“網路”來配置網路,如圖 8 所示。

fig08.gif

圖 8 配置網路(按一下圖像可查看大圖)

接著,確保將 Linux 電腦的 DNS 解析程式設置為與 DC 使用相同的 DNS 名稱伺服器;在大多數情況下,假定您要使用 Active Directory 集成的 DNS,則該 DC 是您想要加入 Linux 電腦的域中的 DC。 在用於配置網路的相同網路配置實用工具的 DNS 選項卡上,配置 DNS 解析程式,如圖 9 所示。

fig09.gif

圖 9 設置主 DNS 解析程式(按一下圖像可查看大圖)

最後,完成上述步驟後,您必須設置 Linux 電腦的主機名稱稱以反映它在域中的名稱。 雖然您可以使用網路配置應用程式設置主機名稱稱,但這一方法不一定始終適用。

但是,可直接編輯 /etc/hosts 檔,並在具有 <IP 位址> <fqdn><主机名称> <主機名稱稱> 形式的 localhost.localdomain 條目下添加條目。 (例如,“10.7.5.2 rhel5.linuxauth.local linuxauth”)。 請注意,如果不這麼做,當您將 Linux 電腦加入到域後,會在目錄中創建錯誤的電腦物件。

配置 Linux 時間同步

Kerberos 協定需要身份驗證系統具有能在相對較小的時間內同步的時鐘。 預設情況下,Active Directory 可允許的偏差時間最長為五分鐘。 為了確保您的 Linux 系統與 DC 的系統時鐘維持在這個時間內,您應該將 Linux 系統組態為使用 DC 的網路時間協定 (NTP) 服務。

然後,在 Linux 伺服器上,從“系統”|“管理”功能表中運行日期與時間實用工具,然後按一下“網路時間協定”選項卡。 選中“啟用網路時間協定”框,然後添加您要用作網路時間源的 DC 的 IP 位址。 請注意,這通常應該是在域中擔任網域主控站 (PDC) 模擬器靈活單主機操作 (FSMO) 角色的 DC。 圖 10 顯示了如何設置 Linux 網路時間源的一個示例。

fig10.gif

圖 10 配置網路時間協定(按一下圖像可查看大圖)

配置 PAM 和 NSS

PAM 和 NSS 提供 Linux 應用程式(如桌面)與 Winbind 之間的聯繫媒介。 與許多 Linux 服務一樣,您可以通過文字檔來配置 PAM 和 NSS。 我們先來討論一下如何配置 PAM。

PAM 為使用它的應用程式提供了四個與身份驗證相關的功能。 身份驗證設施允許應用程式確定使用它的使用者。 帳戶設施提供的帳戶管理功能(如登錄時間限制)與身份驗證並不是特別相關。 密碼設施提供請求和管理密碼的機制。 會話設施執行與使用者相關的安裝和應用程式的拆卸任務,例如,在使用者特定的目錄中記錄或創建檔。

Red Hat 下的 PAM 將它的設定檔存儲在 /etc/pam.d 目錄中,其中包含使用 PAM 進行身份驗證的每個應用程式的文字檔。 例如,檔 /etc/pam.d/gdm 包含 Gnome Desktop Manager (GDM) 的 PAM 配置資訊,即 Red Hat 的預設視窗運行環境。 每個 PAM 設定檔都包含多行內容,其中每行分別定義 PAM 身份驗證過程的某個方面。 圖 11 顯示了 GDM 的 PAM 設定檔的內容。

fig11.gif

圖 11 Gnome Desktop Manager 的 PAM 設定檔(按一下圖像可查看大圖)

PAM 設定檔中的每個專案都具有 <管理組> <控制> <模組> <參數> 的形式,其中 <管理組> 對應于配置條目所屬的設施:身份驗證、帳戶、密碼或會話。 圖 12 中描述的控制關鍵字可控制 PAM 處理配置條目的方式。 該檔的第三欄包含 /lib/security 目錄中的 PAM 共用庫的名稱。 共用庫包含可動態載入的可執行代碼,類似于 Windows 中的 DLL。 模組名稱後的其他術語都是 PAM 傳遞到共用庫的參數。

圖 12 PAM 控制關鍵字

關鍵字 描述
Required 如果模組成功,則 PAM 將繼續評估管理組的其餘專案,並且結果將由其餘模組的結果決定。 如果模組失敗,PAM 將繼續評估,但向調用應用程式返回失敗消息。
Requisite 如果模組成功,PAM 將繼續評估管理組條目。 如果模組失敗,PAM 將返回到調用應用程式,並且不做進一步處理。
Sufficient 如果模組成功,PAM 將向調用應用程式返回成功消息。 如果模組失敗,PAM 會繼續評估,但結果將由後續模組決定。
Optional 除非模組是為管理組指定的唯一模組,否則 PAM 將忽略模組的結果。
Include PAM 包括引用的 PAM 設定檔的內容,並且還會處理該設定檔包含的條目。

您可以看到每個管理組都包含多個條目。 PAM 按照調用命名的模組的連續處理條目。 然後,該模組返回成功或失敗消息,而 PAM 將繼續根據控制關鍵字進行評估。

您可能會注意到,GDM 的 PAM 設定檔在它的所有管理組中都包含系統身份驗證。 這正是 PAM 為 GDM 建立預設身份驗證行為的方式。 通過修改系統身份驗證,您可以修改在其 PAM 配置中包含系統身份驗證檔的所有應用程式的身份驗證行為。 圖 13 仲介紹了預設系統身份驗證檔。

fig13.gif

圖 13 PAM 系統身份驗證檔(按一下圖像可查看大圖)

Name Service Switch (NSS) 模組將隱藏系統資料存儲的詳細資訊以防應用程式開發人員看見,這與 PAM 隱藏身份驗證的詳細資訊的方式大體相似。 NSS 允許管理員指定存儲系統資料庫的方式。 具體來說,管理員可以指定如何存儲使用者名和密碼資訊。 因為我們希望應用程式使用 Winbind 在 Active Directory 中查詢使用者資訊,所以我們必須修改 NSS 設定檔才能顯示此資訊。

Red Hat 包含一個小型的圖形小程式,可用來配置 PAM 和 NSS,稱為 system-config-authentication。 它負責管理您需要對系統身份驗證和 nss.conf 檔進行的大部分(而非全部)更改。

運行 system-config-authentication 應用程式後,您會看到如圖 14 所示的對話方塊。 選中“使用者資訊”(用於配置 nss.conf 檔)和“身份驗證”(用於修改系統身份驗證檔)這兩個選項卡上的 Winbind 選項。

fig14_L.gif

圖 14 systemconfig-authentication 對話方塊

按一下“配置 Winbind”按鈕,您將看到如圖 15 所示的對話方塊。 在 Winbind 域欄位中輸入要對使用者進行身份驗證的域的名稱,並選擇“ads”作為安全模式。 在 Winbind ADS 領域欄位中輸入 Active Directory 域的 DNS 功能變數名稱稱。 在 Winbind 網域控制站欄位中,輸入您希望該 Linux 系統對其進行身份驗證的 DC 的名稱,也可以輸入星號,表明 Winbind 應通過查詢 DNS SRV 記錄來選擇 DC。

fig15.gif

圖 15 配置 Winbind 對話方塊

選擇您的 Active Directory 使用者應該具有的適當預設命令列介面,在本例中,我選擇的是 Bourne-again Shell 或 BASH。 此時,不要按下“加入域”按鈕,稍後,再將此電腦加入到域。

在將 /etc/pam.d/system-auth 檔修改為支援 Winbind 後,還需要對其進行另一個更改。 當 Linux 使用者登錄時,系統要求該使用者必須擁有主目錄。 主目錄包含許多使用者特定的首選項和配置條目,與 Windows 註冊表非常相似。 問題在於,因為您要在 Active Directory 中創建使用者,所以 Linux 不會自動為使用者創建主目錄。 幸運的是,您可以將 PAM 配置為在其會話配置期間為使用者創建主目錄。

打開 /etc/pam.d/system-auth 檔,然後向下滾動到底部,在標有“session optional map_mkhomedir.so skel=/etc/skel umask=0644”會話部分中的最後一行之前插入一行(請參見圖 16)。 這一行將 PAM 配置為創建使用者的主目錄(如果使用者沒有主目錄)。 它將目錄 /etc/skel 用作“框架”或範本,而且將許可權遮罩 0644(所有者具有的讀寫許可權、主要組具有的讀取許可權,以及其他人具有的讀取許可權)分配給新資料夾。

fig16.gif

圖 16 為使用者創建主目錄(按一下圖像可查看大圖)

安裝和配置 Samba

要安裝您剛剛創建的 Samba 二進位檔案,請轉至 /usr/src/redhat/RPMS 目錄。 由 rpmbuild 命令創建的所有 RPM 檔都會顯示在此目錄中。 請記住,Samba 包括允許 Linux 用戶端訪問 Windows(或 Samba)檔共用的二進位檔案,以及允許 Linux 系統充當 Windows 檔案伺服器、Windows 印表機伺服器和 Windows NT 4.0-style DC 角色的代碼。

要讓 Linux 對 Active Directory 進行身份驗證,我們根本用不到這麼多角色,其實我們只需要使用 Samba 公共檔和 Samba 用戶端二進位檔案就可以了。 為了方便起見,這些檔可為兩個 RPM 檔:samba-client-3.0.31-0.i386.rpm 和 samba-common-3.0.31-0.i386.rpm。 使用 rpm --install 命令安裝 RPM 檔,請看下麵的示例:rpm --install samba-common-3.0.31-0.i386.rpm。 (請注意,您需要先安裝 –common RPM 檔。 )

安裝了 Samba 用戶端二進位檔案後,您必須修改預設 Samba 配置,以確保 Winbind 使用 Active Directory 適當處理身份驗證。 所有 Samba 配置資訊(包括用戶端和伺服器)都可以在 smb.conf 文字檔中找到,該檔在預設情況下位於 /etc/samba 目錄中。 Smb.conf 可能包含大量配置選項,本文只會對其內容進行簡要介紹。 samba.org 網站和 Linux 主頁簡要討論了 smb.conf。

第一步是將 Winbind 配置為使用 Active Directory 進行身份驗證。 您必須將 smb.conf 中的安全模式設置為“ads”。 system-config-authentication 實用工具應該已經幫您設置好了,但檢查一下總是比較保險。 編輯 smb.conf 檔,並搜索標有“域成員選項”的部分。 找出以“security”開頭的那一行,並確定它的內容是“security = ads”。 下一個配置步驟是確定 Winbind 如何將 Windows 安全主體(如使用者和組)映射到 Linux 識別字,這需要進行進一步的說明。

ID 映射問題

通過 Active Directory 對 Linux 使用者進行身份驗證時有個大問題我還沒有提到,那就是使用者和組的 UID 問題。 Linux 和 Windows 在內部都不是根據使用者名來引用使用者的,而是使用唯一的內部識別字。 Windows 使用安全性識別碼(即 SID),它能夠唯一標識 Windows 域中的每個使用者,其結構長度可以變化。 SID 也包含唯一域識別字,以便 Windows 區別不同域中的使用者。

Linux 的方案則簡單得多,Linux 電腦上的每個使用者都有一個 UID,而此 UID 只是一個 32 位的整數。 但是 UID 的範圍受限於電腦本身。 在某台 Linux 電腦上具有 UID 436 的使用者,不一定與另一台 Linux 電腦上具有 UID 436 的使用者相同。 因此,使用者必須登錄他需要訪問的每台電腦,這顯然不是理想的情況。

Linux 網路系統管理員解決此問題的常用方法是,使用 Network Information System (NIS) 或共用 LDAP 目錄來提供網路身份驗證。 網路身份驗證系統提供使用者的 UID,而使用該身份驗證系統的所有 Linux 電腦都將共用相同的使用者和組識別字。 在這種情況下,我將使用 Active Directory 來提供唯一的使用者和組識別字。

要解決此問題,我可以採用兩種策略。 第一個(也是最明顯的)策略是,為每個使用者和組創建 UID,並將該識別字與各自的物件一起存儲到 Active Directory 中。 這樣一來,當 Winbind 對使用者進行身份驗證時,它就可以查詢該使用者的 UID,然後將它提供給 Linux 作為該使用者的內部識別字。 Winbind 將此方案稱為 Active Directory ID 映射,或 idmap_ad。 圖 17 介紹了 Active Directory ID 映射的過程。

fig17.gif

圖 17 Active Directory ID 映射(按一下圖像可查看大圖)

Active Directory ID 映射的唯一缺點是,我們必須提供一種機制來確保每個使用者和組都擁有識別字,而且這些識別字在林中都是唯一的。 有關詳細資訊,請參閱“針對 Active Directory ID 映射配置 Active Directory”邊欄。

幸好,還有另外一種 ID 映射策略,這種策略的管理負荷要少得多。 回想一下,我們在前面曾提到過 Windows SID 可以唯一標識域中的使用者和域本身。 SID 中能唯一標識域中使用者的部分稱為相對識別字(或 RID),而且這部分事實上是一個 32 位的整數。 因此,Winbind 可在使用者登錄時直接從 SID 中提取 RID,然後將該 RID 用作唯一的內部 UID。 Winbind 將此策略稱為 RID 映射,或 idmap_rid。 圖 18 描述了 RID 映射的實際工作方式。

fig18.gif

圖 18 RID 映射(按一下圖像可查看大圖)

RID 映射具有零管理負荷的優點,但是您不能將它用在多域的環境中,因為不同域中的使用者可能擁有相同的 RID 值。 但是,如果您擁有單個 Active Directory 域,則可以使用 RID 映射。

要配置 Winbind ID 映射策略,請再次編輯 /etc/samba/smb.conf 檔,並且添加“idmap backend = ad”行來使用 Active Directory 映射策略;如果您要使用 RID 映射策略,請添加“idmap backend = rid”行。 確保該檔中不存在任何其他指定映射策略的行。

對於 Winbind,我們還需要在 smb.conf 檔中添加其他配置選項。 雖然我們已將 PAM 設置為在每個使用者登錄時為其創建主目錄,但是還需要告訴 Winbind 主目錄的名稱是什麼。 我們可以通過將“template homedir = /home/%U”行添加到 smb.conf 來執行此操作(請參見圖 19)。 <用户名>這會告訴 Winbind,使用 Active Directory 進行身份驗證的每個使用者的主目錄都將是 /home/<使用者名>。 但務必要先創建好 /home 目錄。

fig19.gif

圖 19 指定主目錄的名稱(按一下圖像可查看大圖)

加入域並登錄

既然網路、PAM、NSS 和 Samba Winbind 都已配置成功,現在應該將 Linux 電腦加入到域中。 可使用 Samba NET 命令來執行此操作。 <管理员名称>在外殼程式提示符下,運行“net ads join –U <管理員名稱>”。 <管理员名称>使用具有足夠許可權來將電腦加入到域的帳戶名稱替換 <管理員名稱>。

net 命令會提示您輸入使用者的密碼。 如果一切運行正常,net 命令會將您的電腦加入到域中。 您可以使用 Active Directory 使用者和電腦來查找剛剛創建的電腦帳戶。

您可以使用稱為 wbinfo 的 Winbind 測試工具來測試加入的狀態。 運行 wbinfo –t 將測試電腦與域之間的信任關係。 運行 wbinfo –u 將列出域中的所有使用者,而運行 wbinfo –g 將列出域中的所有組。

如果您成功將 Linux 電腦加入到域中,則下一步是嘗試使用 Active Directory 使用者帳戶和密碼登錄。 登出 Linux 電腦,然後使用 Active Directory 使用者名登錄。 如果一切運行正常,您應該能夠登錄。

針對 Active Directory ID 映射配置 Active Directory

此資訊僅在您使用 Active Directoryy ID 映射時才適用。 如果您決定使用 RID 映射,可隨時跳過此邊欄。

您必須先對 Active Directory 本身進行一些更改,然後才能使用 Active Directory 帳戶登錄到您的 Red Hat 伺服器。 首先,Active Directory 架構必須適合 Winbind 用來存儲使用者資訊的屬性。 如果您運行的是 Windows Server 2003 R2,則表示此架構已經準備就緒。 如果您擁有 Active Directory 架構的早期版本,則必須使用 Microsoft Services for UNIX (SFU) 套裝程式對其進行擴展。

您可以在 Technet 上的 Services for UNIX上找到更多資訊。 SFU 還包含另一個針對 Active Directory 使用者和電腦 Microsoft 管理主控台 (MMC) 管理單元的屬性頁,用於管理 Linux 所需的使用者 ID 和組 ID 資訊。

適當設置架構後,您必須為所有可能登錄您的 Linux 電腦的使用者(和他們所屬的組)提供 Linux 識別字。 這表示您必須為可能登錄您的 Linux 電腦的使用者和組定義 uidNumber 和 gidNumber 屬性的值。 但是您應該注意這些屬性的一些要求:

  1. Linux 要求要進行身份驗證的每個使用者都必須有 UID。 由於您要管理 Active Directory 中的使用者資訊,所以要登錄 Linux 電腦的每個使用者帳戶都必須具有唯一的 uidNumber 屬性。 您用於 uidNumber 的特定值並不重要,但它在所有可能登錄 Linux 電腦的使用者中必須是唯一的。
  2. 每個 Linux 使用者也必須具有預設組識別字,因此,要登錄 Linux 電腦的每個 Active Directory 使用者也需要 gidNumber 屬性值。 此值在使用者中不必是唯一的,但它必須唯一地標識組。
  3. Active Directory 中的每個組對於它的 gidNumber 屬性來說都應該具有唯一值。 嚴格來講,組可以沒有 gidNumber 屬性值,但 Winbind 在對使用者進行身份驗證時,會希望使用者所屬的每個組都具有唯一的 gidNumber 值。 最簡單的方法可能是確保每個組都具有唯一的 gidNumber 值。
  4. Winbind 希望它在 Active Directory 中查詢的每個使用者都是 Domain Users 組的成員,因此它也希望 Domain Users 組具有 gidNumber 屬性值。

要是行不通怎麼辦?

使用 Winbind 設置 Linux 電腦以便使用 Active Directory 進行身份驗證並非易事。 要配置的東西有很多,而且很多地方都可能會出錯,而 Linux 的每個版本和 Samba 的每個版本之間又都存在一些細微差別,這更是雪上加霜。 但是您可以查找幾個地方,以説明確定怎樣操作。

首先是 Linux 系統日誌檔,它保存在 /var/log/messages 中。 Samba 將重大事件的消息(例如,丟失檔或配置失敗)存儲在這個檔中。 除了系統日誌檔外,還有 Samba 和 Winbind 的日誌檔。 您可以在 /var/log/samba 中找到這些檔,而且它們還會為您提供一些其他資訊。

您可以通過修改 Winbind 的啟動腳本來設置調試級別,來提高 Winbind 發出的日誌消息的詳細程度(和數量)。 編輯 /etc/init.d/winbind 外殼腳本,然後在 windbindd 命令中添加“-d 5”。 這可將調試級別增加到 5(允許的值範圍為 1 至 10),使 Winbind 生成更詳細的錯誤消息。

如果 Winbind 最後可與 DC 通信,您可以運行網路資料包捕獲實用工具,如 Netmon 3.1。 這使您可以精確分析 Winbind 要進行的操作。 而且,您還可以檢查 DC 上的 Windows 安全性記錄檔,此日誌會顯示身份驗證嘗試。

如果行得通,您又應該做些什麼呢?

如果一切都能順利進行,現在您就可以使用在 Active Directory 中保存的憑據登錄 Linux 系統中了。 與在 Linux 電腦上本地管理標識,或與使用諸如 NIS 之類的不安全系統相比,這是一項重大改進。 它使您可以將您的使用者管理任務集中到一個標識存儲上:Active Directory。

但是,要讓這套解決方案真正具備實際用途,還缺幾樣東西。 首先,無法保證能獲得技術支援,有點像撞大運。 大多數 Linux 組織對於 Active Directory 都不是很瞭解,而且您可以從 Linux 社區獲得的支援完全取決於誰剛好讀到您的帖子以及他們當天的心情。

Samba 也沒有遷移或部署工具。 如果您具有現有的 Linux 帳戶及其相關的使用者 ID 和許可權,則您在將它們遷移至 Active Directory 時,必須手動確保它們維護其 UID。

最後,Samba 仍然無法使用最重要的 Active Directory 應用程式之一,即群組原則,儘管已經實施了此策略。 雖然您可以使用 Samba 將 Linux 系統加入到 Active Directory 中,但無法使用群組原則來管理它。

協力廠商解決方案

使用 Active Directory 對 Linux 電腦進行身份驗證顯然是件好事,但使用 Samba Winbind 推出您自己的解決方案,即使不把您累死,也會讓您感到枯燥無味。 您可能會想,一些創新的軟體供應商可能會提出易於使用的解決方案,您猜得沒錯。

對於我在本文中演示的版本,有四家商用軟體供應商已經開發了易於安裝和使用的相應版本。 它們幾乎為每個受歡迎的 Linux、UNIX 和 Apple Macintoshes 版本都提供了代碼和遷移工具,另外也支援使用群組原則管理 Linux 電腦。

這四家公司分別為 CentrifyLikewise SoftwareQuest SoftwareSymark。 這四家供應商都提供了相似的功能,其中包括跨越各個 Linux 發佈版本的群組原則管理。 Likewise Software 最近還公開了它實現的開放原始程式碼,稱為 Likewise Open,但它的群組原則元件仍舊是商用產品。 Likewise Open 將可用於多個主要的 Linux 發佈版本。 (注:撰寫本文時,本人就職的公司 NetPro 已由 Quest Software 收購。 )

有了可用的商用產品後,還有必要使用 Samba 和 Winbind 來構建自己的身份驗證系統嗎?如果花錢購買整合式軟體不在預算之內,則可以利用免費的 Samba 開放原始程式碼路由。 您還可以獲得所有的原始程式碼,這樣的好處真是令人難以抗拒。 但是,遷移現有的 Linux 電腦及其現有的 UID 是非常棘手的問題。

另一方面,假如您想要省下安裝和實現的時間、需要遷移現有的 Linux 電腦,或是希望有人對您的問題提供權威性的解答,那麼尋求其中的一種商用解決方案比較划算。 另外,如果您需要使用群組原則管理功能,那麼商用產品是您唯一的選擇。

但是,無論您採取哪種方式,將 Linux 身份驗證與 Active Directory 集成都可以減少您為管理多使用者帳戶投入的精力、增強系統安全性,並為您提供單一的標識存儲來進行管理和審核,而這些全都是相當吸引人的理由,值得試一試。

Gil Kirkpatrick 在他 30 年的職業生涯中設計或開發了十多種成功的商用軟體產品,而且他還是 Directory 專家會議(現在改名為專家會議)的創辦人。 Gil 是《Active Directory Programming》的作者,並且經常為《Windows IT Pro》和《TechNet 雜誌》撰寫文章。 Gil 目前在 NetPro(現在是 Quest Software 的一部分)擔任常駐專家一職,他是各種安全性、標識和市場行銷專案的顧問,並且經常在全球各地的技術講座和會議中發表演說。