歡迎您光臨本站 註冊首頁

救助關於LDAP系統認證中分組的設定(已解決 尋求加精)

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

救助關於LDAP系統認證中分組的設定(已解決 尋求加精)

資料庫類似如下
ou=system
\ - ou=groups,ou=system
      \ - cn=group 1,ou=groups,ou=system
        - cn=group 2,ou=groups,ou=system
       \dc=example.com
         | - cn=user 1,dc=exapmle.com
         | - cn=user 2,dc=exapmle.com
         \ - cn=admin 1,dc=exapmle.com

我們把用戶添加到多台的伺服器上需要不同伺服器上group 1 和group 2 區別驗證。就是說有些伺服器中只有group1能登錄有些伺服器group2 才能登錄
但是目前使用authconfig 時候不知道如何區分LDAP中組。
請教應該如何分組驗證
下面的都是精華哦。包含用戶從LDAP登錄創建用戶主目錄 回復是IBM 的使用LDAP驗證用戶登錄詳細說明。如果不明白可以仔細查看
解決辦法如下:
修改/etc/ldap.conf添加:
pam_filter gidNumber=XXX
如果你想添加多個組插入如下代碼:
pam_filte |(gidNumber=XXX)(gidNumber=XXX)
最後使用LDAP登錄時由於不存在用戶主目錄會提示錯誤並且切換到根目錄解決辦法如下
修改/etc/pam.d/system-auth 插入如下代碼
session     required      /lib/security/$ISA/pam_mkhomedir.so skel=/etc/skel umask=0077

[ 本帖最後由 真少少 於 2007-7-16 13:08 編輯 ]
《解決方案》

你改 /etc/ldap.conf 中的 group 的過濾器,不同的伺服器選不同的分支

實際上,我一直想測試,是不是這個過濾器可以設多組,就是你可以多選,幫幫忙,有空試試
《解決方案》

使用 OpenLDAP 集中管理用戶帳號
Red Hat 上的 OpenLDAP 提供了安全、可靠的帳號管理
2007 年 7 月 13 日
使 用輕量級目錄訪問協議(LDAP)構建集中的身份驗證系統可以減少管理成本,增強安全性,避免數據複製的問題,並提高數據的一致性。隨著 Linux® 的不斷成熟,已經出現了很多工具用來簡化用戶帳號信息到 LDAP 目錄的遷移。還開發了一些工具用來在客戶機和目錄伺服器之間啟用加密通信配置,並通過複製提供容錯性。本文將向您展示如何配置伺服器和客戶機在 Red Hat Linux 上使用 OpenLDAP。
簡介
Linux 發行版中提供的 OpenLDAP 軟體按照一個客戶機/伺服器模型實現了輕量級目錄訪問協議(LDAP)。LDAP 的設計目的是提供一種有效的方法來查找和管理信息。OpenLDAP 軟體和包提供了創建目錄信息樹(一個主要進行讀操作的資料庫)的工具。本文向您展示如何存儲用戶的帳號信息,並修改身份驗證服務來使用 LDAP 獲取所需要的信息。內部細節並不重要,因為這些工具可以將資料庫的內容以文本格式(LDAP 數據交換格式,LDIF)呈現在您的面前。
LDAP 信息被組織成屬性和值的組合,稱為 條目(entry)。條目可能會具有必須的屬性或可選屬性。一個條目的屬性必須要遵循 /etc/openldap/schema/ 模式文件中定義的規則。規則包含在條目的 objectclass 屬性中。看一下下面的關係,我們可以看出 posixAccount objectclass 中包含了密碼文件條目的信息(posixAccount userPassword 是文件條目的 base64 編碼)。
圖 1. LDAP 目錄條目和 Linux 密碼文件之間的關係
文件 /etc/openldap/schema/nis.schema 為 posixAccount 對象類中的條目定義了所有的屬性和 objectclass。例如,下面是對 uidNumber 屬性的描述:
attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
   DESC 'An integer uniquely identifying a user in an administrative domain'
   EQUALITY integerMatch
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
所有的屬性類型都已經定義了,它們被收集到 posixAccount objectclass 中。例如:
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY
   DESC 'Abstraction of an account with POSIX attributes'
   MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
   MAY ( userPassword $ loginShell $ gecos $ description ) )
ldapuser 條目具有一個識別名屬性 dn,它用作用戶名,並與 userPassword 一起用來在 LDAP 目錄中記錄信息,或與 LDAP 目錄綁定在一起使用。
LDAP 為作為容器使用的特殊條目提供了將這些條目組織成樹結構的功能。在這個例子中,我們將使用一個容器 OxObjects 保存用戶帳號信息,使用另外一個容器 Groups 保存組帳號信息。所生成的目錄信息樹如圖 2 所示。
圖 2. 用戶帳號信息使用的目錄信息樹
讓我們來看一下如何配置 OpenLDAP 伺服器,如何將信息從系統文件遷移到 LDAP 目錄中,如何配置 OpenLDAP 客戶機通過 LDAP 對用戶進行身份驗證。在使用一個集中的身份驗證資料庫時,應該通過使用複製技術採用第二個 LDAP 伺服器提供高可用性,這樣在主伺服器出現問題時,就可以使用第二個 LDAP 伺服器響應客戶機的請求。由於諸如密碼之類的身份驗證數據會通過網路進行傳輸,因此希望使用 TSL 協議建立加密通信連接。
我們的 OpenLDAP 伺服器和客戶機都是虛擬機,上面運行的是 Red Hat Enterprise Linux AS release 4(Nahant Update 1)。在我們的例子中使用了 表 1 所列出的系統。如果想模仿這些例子,請使用適合您自己的設置。

表 1. 系統網路信息
角色
主機名
IP 地址
OpenLDAP 主伺服器

10.11.21.25
OpenLDAP 從伺服器

10.11.21.24
OpenLDAP 客戶機
配置 LDAP 伺服器
我們使用 Red Hat Enterprise Linux release 4 Update 1 上的包來構建伺服器:
openldap-2.2.13-2:包含 OpenLDAP 配置文件、庫和文檔
openldap-servers-2.2.13-2:包含 slapd 和 slurpd 伺服器、遷移腳本和相關文件
openldap-clients-2.2.13-2:包含客戶機程序,用來訪問和修改 OpenLDAP 目錄
OpenLDAP 包在伺服器上安裝了很多程序:
守護進程:
slapd:主 LDAP 伺服器
slurpd:負責與複製 LDAP 伺服器保持同步的伺服器
對網路上的目錄進行操作的客戶機程序。下面這兩個程序是一對兒:
ldapadd:打開一個到 LDAP 伺服器的連接,綁定、修改或增加條目
ldapsearch:打開一個到 LDAP 伺服器的連接,綁定並使用指定的參數進行搜索
對本地系統上的資料庫進行操作的幾個程序:
slapadd:將以 LDAP 目錄交換格式(LDIF)指定的條目添加到 LDAP 資料庫中
slapcat:打開 LDAP 資料庫,並將對應的條目輸出為 LDIF 格式
OpenLDAP 的主要伺服器配置文件是 /etc/openldap/slapd.conf。本例所使用的完整 slapd.conf 文件如 清單 18 所示。slapd.conf 文件中包括一系列全局配置選項,它們作為一個整體應用到 slapd 上面,後面是包含資料庫特有信息的資料庫後端定義。如果一行內容是以空格開始的,就認為它是上一行的延續。空行和以 「#」 字元開頭的註釋行都會被忽略。
如果您正把本文當作練習來做,那就可以按照下面指定的方式進行修改,從而啟動 LDAP 伺服器。一旦確認伺服器正常工作之後,就可以添加複製功能,然後再添加安全性支持。首先是全局配置信息段的設置。其中每個選項的值都是我們想要的。
正如上面介紹的一樣,信息被組織成屬性和值的組合,稱為條目。條目屬性必須遵循的規則是使用 objectclass 專用屬性進行組織的,這可以在 /etc/openldap/schema/ 模式文件中找到。對於身份驗證來說,需要使用在 nis.schema 中定義的 posixAccount 和 shadowAccount objectclasses:
include /etc/openldap/schema/nis.schema
loglevel 行設置的是日誌選項。可以將其設置為這樣的級別:調試語句和操作統計信息都會被記錄到 /var/log/slapd.log 中。日誌級別是累加的:296 = 256 日誌連接/操作/結果 + 32 搜索過濾器處理 + 8 連接管理:
loglevel 296
日誌信息會被記錄到 syslogd LOG_LOCAL4 機制中。還需要將下面的內容添加到 /etc/syslog.conf 中,並讓 syslogd 重新讀取自己的配置文件:
local4.debug /var/log/slapd.log
access 行定義了誰可以訪問目錄中的內容。我們希望用戶可以修改自己的密碼,並更新自己的 shadow 信息來反映密碼的變化。希望身份驗證程序能夠檢索用戶的密碼。還希望用戶能夠讀取所有其他條目。注意密碼條目是不可讀的,shadow 屬性的惟一用處就是管理密碼的過期問題。
access to attrs=shadowLastChange,userPassword
      by self write
      by * auth
access to *
      by * read
接下來,在 database 部分,要定義下面的內容。
使用新的 bdb 後端資料庫:
database bdb
指定後端資料庫需要響應的查詢的 DN 前綴。為了確保惟一性,根前綴應該從自己的網路域名構建出來。在本例的情況中,它是 .dc=svc,dc=beaverton,dc=ABC,dc=cn.,但是在下面的例子中我們對其進行了簡化:
suffix "dc=ABC,dc=cn"
指定管理 DN,它不用於訪問控制或限制資料庫的操作。也不需要在目錄中為這個 DN 指定一個條目。為具有 rootpw 密碼的管理員使用 DN 可以跳過 ACL 規則中的所有訪問控制:
rootdn "cn=Manager,dc=ABC,dc=cn"
rootpw {MD5}ijFYNcSNctBYg
這就是我們現在想要設置的選項。稍後將返回 slapd.conf 文件來配置複製,然後在配置安全性。
現在,我們希望將數據添加到目錄中,並確認可以訪問這些信息。要實現這種功能,需要配置伺服器來使用 ldap 客戶機工具,例如 ldapadd 和 ldapsearch。ldap 客戶機工具的配置文件是 /etc/openldap/ldap.conf。我們使用的這個文件的完整列表如本文末尾的 清單 19 所示。要在 ldap 伺服器上運行這些工具,只需要將該行修改成下面的內容:
BASE dc=ABC,dc=cn
設置啟動腳本在級別 2、3 和 5 時啟動 LDAP:

清單 1. 設置啟動運行級別
# chkconfig --levels 235 ldap on

從命令行中啟動服務:

清單 2. 啟動服務
# service ldap start
Starting slapd:                               [  OK  ]
OpenLDAP 守護進程 slapd 應該已經運行了:
清單 3. 檢查服務正在運行
# ps -ef | grep slap
ldap   13521  1  0 Oct24 ?     00:00:00 /usr/sbin/slapd -u ldap -h ldap:/// ldaps:///
ldapsearch -x 命令應該可以成功完成,但不會返回任何數據。
遷移密碼和 shadow 信息
Red Hat 所提供的 openldap-servers 包包含 PADL Software Pty Ltd. 公司的 MigrationTools 工具。我們將使用這些工具將數據從 Linux 系統文件(例如 /etc/group 和 /etc/password)轉換成 LDAP LDIF 格式,這是資料庫信息的一種文本格式的表示。這種格式是行界定、冒號分隔的屬性-值對。
有一組 Perl 腳本被安裝到 /usr/share/openldap/migration/ 中執行遷移。這些 Perl 腳本的配置信息包含在 migrate_common.ph 文件的開頭。對於我們的目的來說,只需要修改命名前綴的變數來使用條目的識別名就足夠了,如下所示:
$DEFAULT_BASE = "dc=ABC,dc=cn"
在進行這些修改之後,請運行腳本 migrate_base.pl,它會創建根項,並為 Hosts、Networks、Group 和 OxObjects 等創建低一級的組織單元:
清單 4. 運行 migrate_base.pl
# migrate_base.pl > base.ldif
編輯 base.ldif,刪除除下面之外的所有條目:
清單 5. base.ldif 條目
# cat base.ldif
dn: dc=ABC,dc=cn
dc: ABC
objectClass: top
objectClass: domain
dn: ou=OxObjects,dc=ABC,dc=cn
ou: OxObjects
objectClass: top
objectClass: organizationalUnit
dn: ou=Group,dc=ABC,dc=cn
ou: Group
objectClass: top
objectClass: organizationalUnit
在 LDAP 伺服器上,使用 OpenLDAP 客戶機工具 ldapadd 將以下條目插入到資料庫中。簡單身份驗證必須要使用 -x 選項指定。在 slapd.conf 中定義的 rootdn 身份驗證識別名是 「cn=Manager,dc=ABC,dc=cn」。對於簡單身份驗證來說,必須使用密碼。選項 -W 強制提示輸入密碼。這個密碼就是在 slapd.conf 文件中指定的 rootpw 參數的值。包含這些條目的 LDIF 文件是使用 -f 選項指定的:
清單 6. 使用 ldapadd 插入條目
# ldapadd -x -D "cn=Manager,dc=ABC,dc=cn" -W -f base.ldif
接下來,從 /etc/group 中遷移 ldapuser 組:
清單 7. 遷移 ldapuser 組
# grep ldapuser /etc/group > group.in
# ./migrate_group.pl group.in > group.ldif
#  cat group.ldif
dn: cn=ldapuser,ou=Group,dc=ABC,dc=cn
objectClass: posixGroup
objectClass: top
cn: ldapuser
userPassword: {crypt}x
gidNumber: 500
# ldapadd -x -D "cn=Manager,dc=ABC,dc=cn" -W -f group.ldif
最後,從 /etc/passwd 和 /etc/shadow 中遷移 ldapuser 的信息:
清單 8. 遷移 ldapuser 信息
# grep ldapuser /etc/passwd > passwd.in
# ./migrate_passwd.pl passwd.in > passwd.ldif
# cat passwd.ldif
dn: uid=ldapuser,ou=OxObjects,dc=ABC,dc=cn
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt$1$TeOlOcMc$cpQaa0WpLSFRC1HIHW5bt1
shadowLastChange: 13048
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: ldapuser
# ldapadd -x -D "cn=Manager,dc=ABC,dc=cn" -W -f passwd.ldif
現在檢查已經添加到資料庫中的信息。清單 9 給出了全部輸出結果:
清單 9. 以 LDIF 格式填充的 OpenLDAP 資料庫
# ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#
# ABC.com
dn: dc=ABC,dc=cn
dc: ABC
objectClass: top
objectClass: domain
# OxObjects, ABC.com
dn: ou=OxObjects,dc=ABC,dc=cn
ou: OxObjects
objectClass: top
objectClass: organizationalUnit
# Group, ABC.com
dn: ou=Group,dc=ABC,dc=cn
ou: Group
objectClass: top
objectClass: organizationalUnit

# ldapuser, Group, ABC.com
dn: cn=ldapuser,ou=Group,dc=ABC,dc=cn
objectClass: posixGroup
objectClass: top
cn: ldapuser
gidNumber: 500
# ldapuser, OxObjects, ABC.com
dn: uid=ldapuser,ou=OxObjects,dc=ABC,dc=cn
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: test2
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5
配置 LDAP 客戶機
用來設置客戶機的 Red Hat Enterprise Linux release 4 Update 1 包包括:
nss_ldap-226-6:包括兩個 LDAP 訪問客戶機:nss_ldap 和 pam_ldap
nss_ldap 是一組 C 庫擴展,它允許 LDAP 目錄伺服器用作一個用戶和組信息的主源
pam_ldap 是一個 Linux-PAM 模塊,它支持身份驗證功能
LDAP 身份驗證要想正確地工作,需要配置兩個服務:系統命名服務和身份驗證服務。
系統命名服務(NSS)需要配置為使用 LDAP 來解析諸如用戶和組帳號之類的資源。例如,在運行命令 ls -l 時,如果某個文件 inode 給出文件的所有者是 「user 501」,那麼命名服務就需要將 「uid 501」 解析成用戶名,並在 ls 命令輸出結果中輸出。通常來說,這是通過查找 /etc/passwd 文件中的所有用戶帳號實現的。由於用戶現在都存儲在 LDAP 目錄中,因此系統需要配置成同時對 passwd 文件和 LDAP 目錄中的帳號進行解析。這種功能是通過 /usr/lib/libnss_ldap.so 庫提供的。
身份驗證服務是實際向 LDAP 驗證用戶身份的服務。可插入身份驗證模塊(PAM)提供了本地 Linux 身份驗證服務。下面我們將配置 PAM 先對本地的 /etc/passwd 文件檢查用戶帳號,然後再對 LDAP 伺服器進行檢查。PAM LDAP 模塊可以用來將身份驗證重定向到 LDAP 目錄上。/lib/security/pam_ldap.so PAM 模塊提供了 LDAP 身份驗證功能。
身份驗證本身是由 PAM 程序執行的,它從身份驗證候選機制中獲取用戶名,將其綁定到 OpenLDAP 伺服器上,檢索與這個 uid 條目(用戶名條目)相關的 DN;從身份驗證候選機制中獲取密碼,然後使用這個 DN 和密碼試圖將其綁定到 OpenLDAP 伺服器上。如果綁定成功,PAM 會報告說這個用戶已經成功通過了 pam_ldap.so 提供的身份驗證測試。根據 PAM 的配置不同,在用戶看到命令行提示符之前可能會執行其他測試。
我們可以採用兩種方法來配置 LDAP 客戶機。一種快速而簡單的方法是運行 /usr/sbin/authconfig,並在兩個屏幕中輸入信息。另外一種方法是通過編輯客戶機 LDAP 配置文件 /etc/ldap.conf,然後修改 /etc/nsswitch.conf、/etc/sysconfig/authconfig 和 /etc/pam.d/system-auth。首先讓我們來看一下如何運行 authconfig。
如圖 3 所示進行選擇,然後點擊 Next。
圖 3. 執行 authconfig 命令的第一個頁面
在如圖 4 所示的第二個屏幕中輸入對應的信息,然後點擊 OK。
圖 4. 執行 authconfig 命令的第二個頁面
要手工配置 OpenLDAP 客戶機,請遵循下面的步驟。
用來跟蹤特定身份驗證機制是否已經啟用的文件是 /etc/sysconfig/。我們可以希望以下條目的值都是 「yes」:
USELDAP=yes
USELDAPAUTH=yes
USEMD5=yes
USESHADOW=yes
USELOCAUTHORIZE=yes
PAM 和 NSS 模塊使用的基本配置文件是 /etc/ldap.conf。host 選項指定 LDAP 伺服器,base 選項指定這個目錄使用的 DN,最初我們希望關閉加密功能:
host 25.ABC.com
base dc=ABC,dc=cn
ssl off
要讓 NSS 服務使用 OpenLDAP 伺服器,需要將 「ldap」 添加到 /etc/nsswitch.conf 文件的 passwd、shadow 和 group 行中,如下所示:
passwd: files ldap
shadow: files ldap
group: files ldap
要讓 PAM 身份驗證服務使用 OpenLDAP 伺服器,請將 pam_ldap 行加入到 /etc/pam.d/system-auth 中,位置在對應的標準 pam_unix.so 條目之後。儘管其他設置也可以實現相同的結果,但是我使用下面的文件設置:
auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth sufficient /lib/security/$ISA/pam_ldap.so use_first_pass
auth required /lib/security/$ISA/pam_deny.so

account required /lib/security/$ISA/pam_unix.so broken_shadow
account sufficient /lib/security/$ISA/pam_localuser.so
account sufficient /lib/security/$ISA/pam_succeed_if.so uid %lt; 100 quiet
account /lib/security/$ISA/pam_ldap.so
account required /lib/security/$ISA/pam_permit.so

password requisite /lib/security/$ISA/pam_cracklib.so retry=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password sufficient /lib/security/$ISA/pam_ldap.so use_authtok
password required /lib/security/$ISA/pam_deny.so

session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
session optional /lib/security/$ISA/pam_ldap.so
現在,用戶帳號信息可以從客戶機系統中刪除並從 LDAP 目錄中進行獲取了。當用戶試圖登錄客戶機系統時,PAM 身份驗證服務就會從用戶那裡獲取用戶名,在我們的例子中是 ldapuser。PAM 會從 LDAP 伺服器中檢索識別名(DN)條目 .dn: uid=ldapuser, ou=OxObjects, dc=ABC, dc=cn.。PAM 然後會從用戶那裡獲取密碼。然後 PAM 試圖使用這個 DN 和密碼與 LDAP 伺服器進行綁定。DN 和密碼都以正文文本的格式發送給 LDAP 伺服器。在對密碼進行散列操作之後,如果伺服器可以讓用戶登錄,就會向 PAM 報告說已經成功進行了綁定。成功綁定可以完全滿足 PAM 對 pam_ldap 模塊彙報成功的標準,如果所有其他 PAM 標準都已經滿足了,那麼就允許用戶登錄到系統中。
當 LDAP 伺服器對身份驗證進行處理時,需要解決另外兩個問題才能滿足提供可靠安全的身份驗證的目標。現在,任何客戶機系統不能成功地與 LDAP 伺服器進行通信都會阻止用戶登錄客戶機系統。在下一節中我們將看到如何消除這種單點故障,這將顯示客戶機如何從備份伺服器上訪問 LDAP 目錄。由於用戶密碼是在網路上以正文文本格式傳輸的,因此這並不能滿足安全身份驗證的需求。配置 TLS 安全性 將解決這個問題。
配置複製
為了防止出現客戶機由於 LDAP 伺服器的問題而不能登錄的情況,我們需要採用複製技術來實現可靠性目標。複製是通過 OpenLDAP 複製進程 slurpd 提供的,它會周期性地喚醒,並檢查主伺服器上的日誌文件,從而確定是否有任何更新。這些更新然後會傳播到從伺服器上。讀請求可以由任何一個伺服器進行解 析,而更新請求則只能由主伺服器進行解析。客戶機需要負責在推薦地址上重試更新操作。
要配置複製,需要停止 OpenLDAP 伺服器的 slapd 守護進程:
清單 10. 停止服務
# service ldap stop
將以下內容添加到伺服器的 /etc/openldap/slapd.conf 文件中,從而啟用對新從伺服器的複製。replogfile 行的內容指定類 LDIF 變化應該寫入的文件。replica 原語定義了變化應該傳播到的主機:
#Replicas of this database
replogfile /var/lib/ldap/replog
replica host=24.ABC.com:389
        binddn="cn=Manager,dc=ABC,dc=cn"
        credentials=secret
        bindmethod=simple
在運行從 OpenLDAP 伺服器的系統上,請遵循 配置 LDAP 伺服器 一節給出的步驟。然後通過將信息導出到一個 ldif 文件中並將其添加到從伺服器資料庫上,從而將資料庫從主伺服器拷貝到複製伺服器上。
在主伺服器上:
清單 11. 將數據導出到 LDIF 文件中
# ldapsearch -x > database.ldif
在複製伺服器上:
清單 12. 將數據添加到從伺服器資料庫中
# ldapadd -x -D "cn=Manager,dc=ABC,dc=cn" -W -f database.ldif
將以下內容添加到複製伺服器的 /etc/openldap/slapd.conf 文件中。updatedn 指定了在更新從目錄時主 slurpd 守護進程使用的 DN。updateref 指定的是主目錄伺服器。當一個 LDAP 客戶機請求從伺服器進行更新時,從伺服器就將客戶機重定向到這個主伺服器上。
updatedn "cn=Manager,dc=ABC,dc=cn"
updateref ldap://25.ABC.com:389/
啟動複製 OpenLDAP 伺服器,當它運行之後,再啟動主 OpenLDAP 伺服器。在主伺服器上,slapd 和 slurpd 都會啟動。
現在,可以讓 OpenLDAP 客戶機除了主伺服器之外還可以使用複製伺服器,這可以通過運行 authconfig 並將複製主機名添加到第二個屏幕中的 Server 行中實現,也可以通過在 /etc/ldap.conf 中修改 host 實現:
host 24.ABC.com 25.ABC.com
為了確認複製可以正常工作,需要研究一下在更新 gecos 屬性時到底發生了什麼。複製日誌使用了與 LDIF 類似的格式。在讀取 replogfile 之後,slurpd 會將這個條目拷貝到自己的重做日誌中。實際的變化都以 LDIF 格式保存在主 LDAP 伺服器上 /var/lib/ldap/replica/ 中的 slurpd.replog 文件中。
使用文件 user_mod 中的變化,客戶機程序 ldapmodify 應用這些變化:

清單 13. 應用 user_mod 的變化
# cat user_mod
dn: uid=ldapuser,ou=OxObjects,dc=ABC,dc=cn
changetype: modify
replace: gecos
gecos: test2
# tail -f /var/lib/ldap/replog &
# ldapmodify -x -r -f /home/ldapuser/user_mod -D'cn=Manager,dc=ABC,dc=cn' -W
Enter LDAP Password:
modifying entry "uid=ldapuser,ou=OxObjects,dc=ABC,dc=cn"
replica: 24.ABC.com:389
time: 1130111686
dn: uid=ldapuser,ou=OxObjects,dc=ABC,dc=cn
changetype: modify
replace: gecos
gecos: test2
-
replace: entryCSN
entryCSN: 20051023235446Z#000001#00#000000
-
replace: modifiersName
modifiersName: cn=Manager,dc=ABC,dc=cn
-
replace: modifyTimestamp
modifyTimestamp: 20051023235446Z
-

真少少 發表於 2007-07-16 12:31:07

配置 TLS 安全性
LDAP 是以明文的格式通過網路來發送所有信息的,包括密碼。我們將採用 TLS 所提供的加密機制(SSL 的後繼者)來解決這個問題。在傳輸層,數據使用 TLS 協議進行加密和封裝,然後通過網路進行傳輸。用來配置加密的工具都是由 OpenSSL 包提供的。
雖然加密是一個複雜的主題,但是要使用 OpenSSL 包,我們依然需要簡要介紹一下 TLS 是如何工作的。數據塊使用一個對稱密鑰演算法進行加密,它使用一個密鑰來實現對數據的加密和解密。我們還有一個問題:如何防止出現以正文文本格式將密鑰從 LDAP 伺服器發送到 LDAP 客戶機上的情況。我們使用公鑰演算法來解決這個問題,其中客戶機可以使用一個自由獲取的公鑰對自己的密鑰進行加密,而只有伺服器才可以對這個密鑰進行解密。
公鑰是作為證書的一部分來創建和分發的,其中包含了一些支持信息,例如 ID、過期日期、提供這個證書的 LDAP 伺服器的完整域名(FQDN)。在 LDAP 客戶機使用證書進行加密之前,它會驗證自己正在與之進行交談的伺服器擁有這個證書,這是通過加密一個挑戰並驗證伺服器可以對其進行解密實現的。
要驗證發行這個證書的伺服器是一個已經批准過的 LDAP 伺服器,客戶機被配置為只接受本地證書機構(CA)所簽署的證書。它使用 CA 所生成的證書中的公鑰,這個公鑰保存到客戶機中以驗證這個 LDAP 所產生的證書是有效的。
在這個例子中,我們將自己的 LDAP 伺服器設置為證書機構,並創建一個自簽署的證書供 LDAP 客戶機和伺服器在加密信息中使用。
用來構建 TLS 伺服器的 Red Hat Enterprise Linux release 4 Update 1 包是:
openssl-0.9.7a-43.1:包括一個證書管理工具和提供各種加密演算法和協議的共享庫
要構建證書機構的工作環境並生成自己的自簽署證書,需要運行 /usr/share/ssl/misc/CA shell 腳本,這是一個對 openssl 命令的封裝程序。私密性增強郵件(PEM)是一種用來對數據進行加密和編碼的格式:

清單 14. 運行 CA shell 腳本
# cd /usr/share/ssl/misc
# ./CA -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
.........++++++
......++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated into
your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) :US
State or Province Name (full name) :Oregon
Locality Name (eg, city) :Beaverton
Organization Name (eg, company) :ABC
Organizational Unit Name (eg, section) []:its
Common Name (eg, your name or your server's hostname) []:25.ABC.com
Email Address []:[email protected]

接下來,要生成由證書機構進行簽署的伺服器證書。其餘的步驟只會對主 LDAP 伺服器執行一次,此時指定的是 CN=25.ABC.com;然後對從伺服器執行一次,此時指定的是 CN=24.ABC.com。還要使用 nodes 選項,這樣就不用在每次啟動 OpenLDAP 伺服器守護進程 slapd 時都需要輸入密碼了。簽署后的公鑰被嵌入到證書請求 slapd-req.pem 中,與之匹配的私鑰嵌入在 slapd-key.pem 中:

清單 15. 生成伺服器證書
# openssl req -new -nodes -subj
   '/CN=25.ABC.com/O=ABC/C=US/ST=Oregon/L=Beaverton'
   -keyout slapd-key.pem -out slapd-req.pem -days 365
Generating a 1024 bit RSA private key
...............++++++
.....................................++++++
writing new private key to 'slapd-key.pem'
-----

使用在第一個步驟中創建的 CA 證書對這個證書進行簽署:

清單 16. 對證書進行簽署
# openssl ca -out slapd-cert.pem -infiles slapd-req.pem
Using configuration from /usr/share/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Oct 25 02:50:05 2005 GMT
            Not After : Oct 25 02:50:05 2006 GMT
        Subject:
            countryName               = US
            stateOrProvinceName       = Oregon
            organizationName          = ABC
            commonName                = 25.ABC.com
        X509v3 extensions:
            X509v3 Basic Constraints:
            CA:FALSE
            Netscape Comment:
            OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
            11:A2:FB:59:42:A4:B3:26:73:1D:6D:F5:4D:2F:80:F0:FA:10:38:F5
            X509v3 Authority Key Identifier:
            keyid:F7:6A:25:F5:76:BE:20:E7:8D:0F:51:EF:D8:86:7B:AF:2C:74:2F:80
            DirName:/C=US/ST=Oregon/L=Beaverton/O=ABC/OU=its/CN=25.ABC.com
/[email protected]
            serial:00

Certificate is to be certified until Oct 25 02:50:05 2006 GMT (365 days)
Sign the certificate? :y

1 out of 1 certificate requests certified, commit? y
Write out database with 1 new entries
Data Base Updated

下一個步驟將所有需要的證書拷貝到 slapd 可以找到的地方。另外,還要對每個文件強制採用正確的許可權:

清單 17. 拷貝證書並強制設置許可權
# cp -p slapd-key.pem /etc/openldap/slapdkey.pem
# cp -p slapd-cert.pem /etc/openldap/slapdcert.pem
# chown ldap:ldap /etc/openldap/slapdcert.pem
# chmod 644 /etc/openldap/slapdcert.pem
# chown ldap:ldap /etc/openldap/slapdkey.pem
# chmod 400 /etc/openldap/slapdkey.pem

# mkdir /etc/openldap/cacerts/
# cp /usr/share/ssl/misc/demoCA/cacert.pem /etc/openldap/cacerts/cacert.pem
# chown ldap:ldap /etc/openldap/cacerts cacert.pem
# chmod 644 /etc/openldap/cacerts cacert.pem

在 OpenLDAP 伺服器上,將以下內容添加到 /etc/openldap/slapd.conf 文件的 global 段下面。TLSCertificateFile 和 TLSCertificateKeyFile 指定了證書文件和私鑰文件的路徑。TLSCipherSuite 指定了一個 OpenSSL 密碼的列表,slapd 在與 TLS 協商建立連接時可以從中按照降序順序依次選擇。HIGH 的意思是 「所有密鑰的長度都大於 128 位」;MEDIUM 表示 「所有密鑰的長度都等於 128 位」;+SSLv2 表示 「不管密鑰強度如何,所有密碼都是以 SSL 協議版本 2 的形式指定的」。
TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/slapdkey.pem
將以下內容添加到 LDAP 伺服器的第二個配置文件 /etc/openldap/ldap.conf 中:
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow
為了允許從 OpenLDAP 客戶機上使用安全連接,需要將以下內容添加到 /etc/openldap/ldap.conf 文件中:
ssl start_tls
tls_checkpeer yes
tls_cacertfile /etc/openldap/cacerts/cacert.pem




結束語
按照本文給出的提示,我們現在已經使用輕量級目錄訪問協議(LDAP)構建了一個集中的身份驗證系統。我們最初是通過配置 LDAP 伺服器來響應對 「dc=ABC,dc=cn」 的基本請求開始入手的。我們使用了一組 Perl 腳本來將用戶帳號信息遷移到 LDAP 目錄中。我們對 Linux 用戶帳號服務、PAM 和 NSS 服務進行了修改,從而可以從 LDAP 伺服器中檢索用戶信息。還設置了一個 LDAP 伺服器副本作為備用伺服器來響應客戶機的請求。然後,使用 TLS 協議在 LDAP 客戶機和伺服器之間對通信進行安全加密。恭喜!
為了參考方便,下面給出了本文中使用的配置文件的完整清單。

清單 18. 本文例子中使用的伺服器 /etc/openldap/slapd.conf 文件
#
# See slapd.conf (5) for details on configuration options.
#
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema

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

# The next three lines allow use of TLS for encrypting connections.
TLSCipherSuite  HIGH:MEDIUM:+SSLv2
TLSCACertificateFile    /etc/openldap/cacerts/cacert.pem
TLSCertificateFile      /etc/openldap/slapdcert.pem
TLSCertificateKeyFile   /etc/openldap/slapdkey.pem

# access control policy:
# Restrict password access to change by owner and authentication.
# Allow read access by everyone to all other attributes.

access to attrs=shadowLastChange,userPassword
   by self write
   by * auth

access to *
   by * read

#######################################################################
# database definition
#######################################################################

database        bdb
suffix          "dc=ABC,dc=cn"

rootdn          "cn=Manager,dc=ABC,dc=cn"
rootpw          {MD5}ijFYNcSNctBYg

directory       /var/lib/ldap

# Indices to maintain for this database
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

#Replicas of this database
replica host=24.ABC.com:389
        binddn="cn=Manager,dc=ABC,dc=cn"
        credentials=secret
        bindmethod=simple
replogfile /var/lib/ldap/replog


清單 19. 本文例子中使用的伺服器 /etc/openldap/ldap.conf 文件
#
# LDAP Defaults
#

# See ldap.conf(5) for details

HOST 127.0.0.1
BASE dc=ABC,dc=cn

TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow


清單 20. 本文例子中使用的客戶機 /etc/ldap.conf 文件
a
# @(#)$Id: ldap.conf,v 1.34 2004/09/16 23:32:02 lukeh Exp $
#
# This is the configuration file for the LDAP nameservice
# switch library and the LDAP PAM module.
#
# PADL Software
# http://www.padl.com
#

# Your LDAP server.
# Multiple hosts may be specified, each separated by a
# space.

host 25.ABC.com 25.ABC.com

# The distinguished name of the search base.

base dc=ABC,dc=cn

# OpenLDAP SSL mechanism, start_tls mechanism uses the normal LDAP port 389
ssl start_tls

#Require and verify server certificate
tls_checkpeer yes

# CA certificates for server certificate verification
tls_cacertfile /etc/openldap/cacerts/cacert.pem

pam_password md5
《解決方案》

回復 #2 alvis 的帖子

我也最開始也是想從組中尋求解決辦法但是因為組用戶存儲在memberUid中而PAM識別的卻是Uid所以最終也沒有成功.寫了一個shell腳本根本不執行。最後只能從LDAP  filter 找到解決辦法。這個問題我查閱了很多英文資料。但是只有2-3篇涉及到這方面。估計外國人中也沒有多少人認真的做出來。後面PAM添加主目錄的是我同事的提醒。查閱了redhat的資料得來的!

[ 本帖最後由 真少少 於 2007-7-16 13:11 編輯 ]
《解決方案》

回復 #5 真少少 的帖子

說實話,沒太明白你的貼,我說的過濾器不是 pam_filter 而是
170 nss_base_passwd         ou=users,ou=system?one
171 nss_base_shadow         ou=users,ou=system?one
172 nss_base_group          ou=groups,ou=system?one

還有,你轉貼的 pam ldap 設置我以前也看過,不過,裡面有一點有軟傷,它的 pam lib 用得都是絕對路徑,這在 x86_64 系統上,會造成問題,還是用相對路徑好些

而且説到 authconfig,你大可不用 authconfig 來給系統添加 pam_ldap 支持,authconfig 在我看來只不過是 linuxconf 計劃的遺老遺少,這好像有點越扯越遠

不過,不管怎麽說,條條大路通羅馬,自己解決自己的問題,就是王道
《解決方案》

經測試,可以在 ldap.conf 放多個 nss_base_*
《解決方案》

頂一下吧,研究這個的,實在是太少太少了

[火星人 ] 救助關於LDAP系統認證中分組的設定(已解決 尋求加精)已經有658次圍觀

http://coctec.com/docs/service/show-post-24745.html