日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux用户带密码迁移 LDAP

發布時間:2024/4/17 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux用户带密码迁移 LDAP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.360doc.com/content/13/0221/09/11635640_266880763.shtml

http://bbs.chinaunix.net/thread-1915727-1-1.html
http://blog.csdn.net/frylion/article/details/8538571

因為要將各系統的用戶目錄統一到LDAP服務器上,正在做linux用戶向LDAP的遷移,用戶信息導出都沒問題,但是用戶的密碼導出的是加密后的密文,有沒有辦法將linux的明文直接導入LDAP服務器呢?

問題的源頭:

linux中導出的用戶ldif文件中userpassword是密碼密文,導入LDAP服務器的也因此是密文。但是LDAP用戶從linux登錄的時候,linux服務器傳遞給LDAP用以驗證的是用戶ID和密碼明文,而ldap端存儲的是密文,將密碼密文與傳送過來的密碼明文比較,當然不一致,也因此無法登錄。


再補充一下,上文說的密碼明文指的是 密碼原字符串,密文指的是經過加密處理的字符串。

我覺得歷史上肯定有人遇到過這個應用場景吧,遇到遷移的事項,要把用戶帶密碼遷移出來。這個問題也許也有其他解決方法,有人有什么想法么?

?

測試用例:
(1)創建linux上用戶user1,密碼111111
(2)用migrate_passwd.pl 工具得到user1的ldif文件
(3)在Tivoli Directory Server(IBM的LDAP服務器)里import ldif(設置TDS對所存儲的密碼不再次加密,即直接存儲ldif文件里userpassord的字符串(經過linux加密處理的user1的密碼))
(4)配置linux使用LDAP用戶登錄
(5)user1在linux端登錄失敗
(6)從TDS導出ldif文件,確認userpassword不是111111,而是加密后的字符串(見第三條括號內內容)
(7)手動在TDS端修改user1的userpassword值為111111,經導出ldif文件確認TDS存儲的密碼原文是111111
(8)user1從linux端可以用111111成功登錄
(9)user1在linux端通過passwd命令修改密碼為222222,logout,再login,無法成功登錄

補充實驗:
(1)直接在TDS端創建新用戶user2 ,userpassword屬性直接輸入密碼值,比如222222。linux端用該用戶登錄,可以成功登錄

(2)在linux端,用passwd user2修改密碼為333333,logout后,user2無法使用密碼333333成功登錄;從TDS端查看,發現TDS存儲的是經linux對333333加密處理后的字符串

經過這些實驗做出一樓的判斷

LDAP存儲密碼是支持加密的,而且可以選擇各種加密算法;但這是是對從ldif導出的userpassword值在存儲到LDAP前進行再一次加密,和linux端就沒有關系了。我采用明文存儲密碼只是測試時方便查看LDAP里存儲的userpassword值到底是什么。

存儲系統帳戶初始結構的,這個也沒有問題

問題是,從linux導出用戶的ldif文件,如
dn: uid=user2,ou=GCL,ou=CSDL,o=XXX,c=cn
loginShell: /bin/bash
memberUid: 901
gidNumber: 801
objectclass: posixGroup
objectclass: top
objectclass: posixAccount
objectclass: shadowAccount
uid: user2
uidNumber: 901
cn: user2
description: One user of system
homeDirectory: /home/user2
userpassword: xxxxxxxxxxx
ownerpropagate: TRUE
entryowner: access-id:UID=user2,OU=GCL,OU=CSDL,O=XXX,C=CN

userpassword這里記錄的是用戶的密碼密文。如果用戶的password原文是111111,這里顯示的可能就是ABCDE,而存在LDAP里的就是ABCDE(或者被LDAP再加密一道如EDCBA)。這樣當user2作為LDAP用戶在linux端登錄時,linux會將111111傳遞給LDAP,而LDAP會拿111111與ABCDE進行匹配,匹配不一致,就通過不了驗證。

如果只是遷移用戶而不在乎其原始密碼,或創建新用戶就完全沒有現在遇到的問題。

從您給的這兩個提示來看,我前文對問題的描述可能不夠清楚。現在的問題是,我要遷移用戶的原有密碼

?

?

===============

http://www.ibm.com/developerworks/cn/linux/l-openldap/#ibm-pcon

使用 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 integerMatchSYNTAX 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 AUXILIARYDESC 'Abstraction of an account with POSIX attributes'MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )MAY ( userPassword $ loginShell $ gecos $ description ) )

ldapuser 條目具有一個識別名屬性 dn,它用作用戶名,并與 userPassword 一起用來在 LDAP 目錄中記錄信息,或與 LDAP 目錄綁定在一起使用。

LDAP 為作為容器使用的特殊條目提供了將這些條目組織成樹結構的功能。在這個例子中,我們將使用一個容器 People 保存用戶帳號信息,使用另外一個容器 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 主服務器dhcp64-233.ibm.com9.47.64.233
OpenLDAP 從服務器dhcp64-253.ibm.com9.47.64.253
OpenLDAP 客戶機dhcp64-251.ibm.com9.47.64.251


配置 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,userPasswordby self writeby * authaccess to *by * read

接下來,在 database 部分,要定義下面的內容。

使用新的 bdb 后端數據庫:

database bdb

指定后端數據庫需要響應的查詢的 DN 前綴。為了確保惟一性,根前綴應該從自己的網絡域名構建出來。在本例的情況中,它是 .dc=svc,dc=beaverton,dc=ibm,dc=com.,但是在下面的例子中我們對其進行了簡化:

suffix "dc=ibm,dc=com"

指定管理 DN,它不用于訪問控制或限制數據庫的操作。也不需要在目錄中為這個 DN 指定一個條目。為具有 rootpw 密碼的管理員使用 DN 可以跳過 ACL 規則中的所有訪問控制:

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

這就是我們現在想要設置的選項。稍后將返回 slapd.conf 文件來配置復制,然后在配置安全性。

現在,我們希望將數據添加到目錄中,并確認可以訪問這些信息。要實現這種功能,需要配置服務器來使用 ldap 客戶機工具,例如 ldapadd 和 ldapsearch。ldap 客戶機工具的配置文件是 /etc/openldap/ldap.conf。我們使用的這個文件的完整列表如本文末尾的 清單 19 所示。要在 ldap 服務器上運行這些工具,只需要將該行修改成下面的內容:

BASE dc=ibm,dc=com

設置啟動腳本在級別 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=ibm,dc=com"

在進行這些修改之后,請運行腳本 migrate_base.pl,它會創建根項,并為 Hosts、Networks、Group 和 People 等創建低一級的組織單元:


清單 4. 運行 migrate_base.pl

# migrate_base.pl > base.ldif

編輯 base.ldif,刪除除下面之外的所有條目:


清單 5. base.ldif 條目

# cat base.ldif dn: dc=ibm,dc=com dc: ibm objectClass: top objectClass: domaindn: ou=People,dc=ibm,dc=com ou: People objectClass: top objectClass: organizationalUnitdn: ou=Group,dc=ibm,dc=com ou: Group objectClass: top objectClass: organizationalUnit

在 LDAP 服務器上,使用 OpenLDAP 客戶機工具 ldapadd 將以下條目插入到數據庫中。簡單身份驗證必須要使用 -x 選項指定。在 slapd.conf 中定義的 rootdn 身份驗證識別名是 “cn=Manager,dc=ibm,dc=com”。對于簡單身份驗證來說,必須使用密碼。選項 -W 強制提示輸入密碼。這個密碼就是在 slapd.conf 文件中指定的 rootpw 參數的值。包含這些條目的 LDIF 文件是使用 -f 選項指定的:


清單 6. 使用 ldapadd 插入條目

# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -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=ibm,dc=com objectClass: posixGroup objectClass: top cn: ldapuser userPassword: {crypt}x gidNumber: 500# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -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=People,dc=ibm,dc=com 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=ibm,dc=com" -W -f passwd.ldif

現在檢查已經添加到數據庫中的信息。清單 9 給出了全部輸出結果:


清單 9. 以 LDIF 格式填充的 OpenLDAP 數據庫

# ldapsearch -x# extended LDIF # # LDAPv3 # base <> with scope sub # filter: (objectclass=*) # requesting: ALL ## ibm.com dn: dc=ibm,dc=com dc: ibm objectClass: top objectClass: domain# People, ibm.com dn: ou=People,dc=ibm,dc=com ou: People objectClass: top objectClass: organizationalUnit# Group, ibm.com dn: ou=Group,dc=ibm,dc=com ou: Group objectClass: top objectClass: organizationalUnit# ldapuser, Group, ibm.com dn: cn=ldapuser,ou=Group,dc=ibm,dc=com objectClass: posixGroup objectClass: top cn: ldapuser gidNumber: 500# ldapuser, People, ibm.com dn: uid=ldapuser,ou=People,dc=ibm,dc=com 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 dhcp64-233.ibm.com
base dc=ibm,dc=com
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 [default=bad success=ok user_unknown=ignore] /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=People, dc=ibm, dc=com.。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=dhcp64-253.ibm.com:389binddn="cn=Manager,dc=ibm,dc=com"credentials=secretbindmethod=simple

在運行從 OpenLDAP 服務器的系統上,請遵循 配置 LDAP 服務器 一節給出的步驟。然后通過將信息導出到一個 ldif 文件中并將其添加到從服務器數據庫上,從而將數據庫從主服務器拷貝到復制服務器上。

在主服務器上:


清單 11. 將數據導出到 LDIF 文件中

# ldapsearch -x > database.ldif

在復制服務器上:


清單 12. 將數據添加到從服務器數據庫中

# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f database.ldif

將以下內容添加到復制服務器的 /etc/openldap/slapd.conf 文件中。updatedn 指定了在更新從目錄時主 slurpd 守護進程使用的 DN。updateref 指定的是主目錄服務器。當一個 LDAP 客戶機請求從服務器進行更新時,從服務器就將客戶機重定向到這個主服務器上。

updatedn "cn=Manager,dc=ibm,dc=com"
updateref ldap://dhcp64-233.ibm.com:389/

啟動復制 OpenLDAP 服務器,當它運行之后,再啟動主 OpenLDAP 服務器。在主服務器上,slapd 和 slurpd 都會啟動。

現在,可以讓 OpenLDAP 客戶機除了主服務器之外還可以使用復制服務器,這可以通過運行 authconfig 并將復制主機名添加到第二個屏幕中的 Server 行中實現,也可以通過在 /etc/ldap.conf 中修改 host 實現:

host dhcp64-253.ibm.com dhcp64-233.ibm.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=People,dc=ibm,dc=com changetype: modify replace: gecos gecos: test2# tail -f /var/lib/ldap/replog &# ldapmodify -x -r -f /home/ldapuser/user_mod -D'cn=Manager,dc=ibm,dc=com' -W Enter LDAP Password: modifying entry "uid=ldapuser,ou=People,dc=ibm,dc=com"replica: dhcp64-253.ibm.com:389 time: 1130111686 dn: uid=ldapuser,ou=People,dc=ibm,dc=com changetype: modify replace: gecos gecos: test2 - replace: entryCSN entryCSN: 20051023235446Z#000001#00#000000 - replace: modifiersName modifiersName: cn=Manager,dc=ibm,dc=com - replace: modifyTimestamp modifyTimestamp: 20051023235446Z -


配置 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) [GB]:US State or Province Name (full name) [Berkshire]:Oregon Locality Name (eg, city) [Newbury]:Beaverton Organization Name (eg, company) [My Company Ltd]:IBM Organizational Unit Name (eg, section) []:its Common Name (eg, your name or your server's hostname) []:dhcp64-233.ibm.com Email Address []:root@dhcp64-233.ibm.com

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


清單 15. 生成服務器證書

# openssl req -new -nodes -subj'/CN=dhcp64-233.ibm.com/O=IBM/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)ValidityNot Before: Oct 25 02:50:05 2005 GMTNot After : Oct 25 02:50:05 2006 GMTSubject:countryName = USstateOrProvinceName = OregonorganizationName = IBMcommonName = dhcp64-233.ibm.comX509v3 extensions:X509v3 Basic Constraints:CA:FALSENetscape Comment:OpenSSL Generated CertificateX509v3 Subject Key Identifier:11:A2:FB:59:42:A4:B3:26:73:1D:6D:F5:4D:2F:80:F0:FA:10:38:F5X509v3 Authority Key Identifier:keyid:F7:6A:25:F5:76:BE:20:E7:8D:0F:51:EF:D8:86:7B:AF:2C:74:2F:80DirName:/C=US/ST=Oregon/L=Beaverton/O=IBM/OU=its/CN=dhcp64-233.ibm.com /emailAddress=root@dhcp64-233.ibm.comserial:00Certificate is to be certified until Oct 25 02:50:05 2006 GMT (365 days) Sign the certificate? [y/n]:y1 out of 1 certificate requests certified, commit? [y/n]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=ibm,dc=com” 的基本請求開始入手的。我們使用了一組 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.schemaloglevel 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,userPasswordby self writeby * authaccess to *by * read####################################################################### # database definition #######################################################################database bdb suffix "dc=ibm,dc=com"rootdn "cn=Manager,dc=ibm,dc=com" rootpw {MD5}ijFYNcSNctBYgdirectory /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=dhcp64-253.ibm.com:389binddn="cn=Manager,dc=ibm,dc=com"credentials=secretbindmethod=simple replogfile /var/lib/ldap/replog


清單 19. 本文例子中使用的服務器 /etc/openldap/ldap.conf 文件
# # LDAP Defaults ## See ldap.conf(5) for detailsHOST 127.0.0.1 BASE dc=ibm,dc=comTLS_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 dhcp64-233.ibm.com dhcp64-233.ibm.com# The distinguished name of the search base.base dc=ibm,dc=com# 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.pempam_password md5


參考資料

學習

  • 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。

  • OpenLDAP 主頁 是 OpenLDAP 項目的主頁。其中包含了有關如何配置 OpenLDAP 的豐富信息,以及將來的路線圖和版本信息。請確保閱讀 OpenLDAP Software 2.3 Administrator's Guide。

  • 在 OpenSSL Project 中,可以找到有關 SSL 和 TLS 的信息。

  • 在 LDAP Linux HOWTO 中,我們可以找到有關在 Linux 機器上安裝、配置、運行和維護 LDAP(Lightweight Directory Access Protocol)服務器的詳細信息。請在 LDAP Implementation HOWTO 中閱讀使用 pam_ldap 和 nss_ldap 進行 LDAP 身份驗證的討論。

  • PADL 主頁 提供了 Perl 遷移腳本 nss_ldap 和 pam_ldap 以及很多其他有用的 LDAP 工具。

  • 在 developerWorks Linux 專區 中可以找到為 Linux 開發人員準備的更多資源。

  • 隨時關注 developerWorks 技術活動和網絡廣播。

獲得產品和技術

  • 在您的下一個開發項目中采用 IBM 試用版軟件,這可以從 developerWorks 上直接下載。

討論

  • OpenLDAP 郵件列表 是討論 OpenLDAP 的主要論壇。

  • 通過參與 developerWorks blogs 加入 developerWorks 社區。

關于作者

Mike O'Reilly 是 IBM Linux 和 VMware ESX 產品支持小組的一員,他為 Linux 產品提供支持已經有 5 年的時間了。另外,他支持 VMware 超過兩年的時間,支持 UNIX 超過 10 年的時間。

?

總結

以上是生活随笔為你收集整理的linux用户带密码迁移 LDAP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。