歡迎您光臨本站 註冊首頁

[原]創建基於ldap的apache目錄驗證

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

[原]創建基於ldap的apache目錄驗證

創建基於ldap的apache目錄驗證

軟體:openldap
     ldapclient/server
     apache:添加mod_authz_ldap支持

1:設置ldap和創建ldap資料庫
apache的authz_ldap module通過匹配在ldap server中的attributetype:usePassword來驗證密碼,所以在ldap存儲設計中一定要使用這個attribute。而這個attribute是openldap所預先定義好的,它屬於inetOrgPerson這樣一個objectclass,我們設計的數據的objectClass就應該是inetOrgPerson或者它的一個子類。
這裡有必要講一下ldap中的objectClass和attributetype。在我看來,objectClass就相當於普通資料庫中的一個table,attributetype就是table中的一個coloum。與資料庫中的table,coloum不同的是,ldap中的objectClass呈現一種類似與面向對象編程中的繼承關係,比如 organization->dcObject->top。top就是頂層objectClass,而 dcObject,organization都是「繼承」它而來。我們需要使用inetOrgPerson中的userPassword,因此可以直接用這個objectClass,也可以定義一個通過繼承它而來的objectClass。objectClass可以定義must和may兩種attributetype,意思是必須和不是必須的attributetype,在inetOrgPerson中sn和cn是必須的(我不知道這兩個具體代表什麼意思),但我們並不需要它,因此我懷疑應該有其他不通過繼承inetOrgPerson來使用userPassword的方法,如果哪位高手明白的話,請不吝賜教。

好,說了一堆,現在正式來創建ldap數據項。

attributetype (1.1.2.2.2.2
         NAME 'userName'
         DESC 'Employee User Name'
         EQUALITY caseIgnoreMatch
         SUBSTR caseIgnoreSubstringsMatch
         SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )

objectclass (1.1.2.2.1
        NAME 'Employee'
        SUP inetOrgPerson
        STRUCTURAL
        MUST ( userName )
    )

在這裡我創建了一個叫rdpsUser的objectClass,SUP inetOrgPerson表示它是繼承inetOrgPerson而來,並且有一個必須的userName。這個userName使用來存儲網頁驗證時輸入的用戶名的,當然我們也可是使用inetOrgPerson已有的如sn來存儲,而且那樣的話都沒有必要建立一個新的objectClass,但在這裡為了演示如何定義schema,並為了資料庫的易讀性,還是創建一個新的。

把它另存為/.../openldap/schema/what_ever_you_call_it.schema,然後在slapd.conf里將它include進去。重啟ldap以驗證schema的正確性。

現在來創建ldap的存儲結構,相當於創建資料庫的table
創建ldap init文件initial_create.ldif
dn: dc=dps,c=us
objectClass: organization
objectClass: dcObject
objectClass: top
o: dps-us
dc: dps

dn: o=dps-us,dc=dps,c=us
objectClass: organization
objectClass: dcObject
o: dps-us
dc: dps

dn: ou=employees,o=dps,dc=dps,c=us
objectClass: organizationalUnit
ou: employees

這裡假設了slapd.conf里設置是這樣的
suffix      "dc=dps,c=us"
rootdn      "cn=Manager,dc=dps,c=us"
rootpw            secret
註:這段使用來設置ldap伺服器的root許可權,不知道是否一定需要把ldap init文件的root dn設置為和suffix一樣,呼喚明白人

關閉ldap
/etc/init.d/ldap stop
將資料庫定義導入ldap
slapadd -v -l initial_create.ldif
/etc/init.d/ldap start
註:我通過yum install安裝的ldap,第一次導入這些的時候出現了數據文件的owner不是ldap用戶的錯誤信息,使用chown改成ldap即可

導入數據:
創建內容為如下的data.ldif
dn: userName=fduan,ou=employees,o=dps,dc=dps,c=us
objectClass: top
objectClass: inetOrgPerson
objectClass: rdpsEmployee
userPassword: {crypt}$1$d5TsJc7e$1qEaguOMwU9.89opV3BH1.
userName: fduan
sn: fduan
cn: fduan

ldapadd -x -D 'cn=Manager,dc=dps,c=us' -w secret -f data.ldif

註:userPassword可以使用明文和加密方式存儲,可以使用slappasswd來生成加密的欄位,crypt是linux /etc/shadow的加密方式,所以可以使用ldap來存儲伺服器用戶的密碼
slappasswd -h{MD5} -s secret
{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==


2:為http服務目錄添加使用ldap驗證的功能
需要為apache安裝mod_authz_ldap,還有一個mod_auth_ldap的模塊,別搞混了.
假設需要添加驗證的目錄是/var/www/elog/
首先打開目錄.htaccess的override功能
<Directory "/var/www/elog">
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>

在/var/www/elog裡面創建.htaccess,添加如下內容

AuthzLDAPMethod ldap
AuthName AuthzLDAP
AuthType Basic

AuthzLDAPServer "serverName"

AuthzLDAPUserBase ou=employees,o=dps-us,dc=dps,c=us
#這是存數據的DN
AuthzLDAPUserKey userName
#這是用來驗證的attributetype,所以說不一定要用userName
AuthzLDAPLogLevel info
Order deny,allow
Deny from all
require valid-user
satisfy any


這樣應該通過ldap來做網頁的驗證了。

另:打開ldap的log
openldap的log默認是不打開的,要打開在/etc/syslog.conf或rsyslog.conf裡面加入
local4.*   -/var/log/ldap/ldap.log


[ 本帖最後由 redicaps 於 2009-2-5 14:08 編輯 ]

[火星人 ] [原]創建基於ldap的apache目錄驗證已經有423次圍觀

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