上一篇文章我們介紹了LDAP的部署以及管理維護,那麼如何接入LDAP實現賬號統一認證呢?這篇文章將帶你完成svn的接入驗證
subversion整合OpenLDAP認證
- 系統環境:debian8.4
- svn部署環境:apache2.4 + Subversion
- apache開啟LDAP相關模組
# a2enmod ldap
Enabling module ldap.
To activate the new configuration, you need to run:
service apache2 restart
# a2enmod authnz_ldap
Considering dependency ldap for authnz_ldap:
Module ldap already enabled
Enabling module authnz_ldap.
To activate the new configuration, you need to run:
service apache2 restart
複製程式碼
- 修改vhost配置檔案,新增對ldap的支援
<Virtualhost *:8088>
DocumentRoot /home/svn/repos/
ServerName svn.blz.netease.com
<Location /ne/>
DAV svn
SVNListParentPath on
SVNParentPath "/home/svn/repos"
AuthType Basic
AuthName "Netease&Blizzard Subversion Repository"
#AuthUserFile "/etc/subversion/dav_svn.passwd"
AuthzSVNAccessFile "/etc/subversion/dav_svn.authz"
# use LDAP auth
AuthBasicProvider ldap
AuthLDAPBindAuthoritative on
AuthLDAPURL "ldap://ldap.blz.netease.com/dc=blz,dc=internal?uid?sub?(objectclass=*)"
AuthLDAPBindDN "uid=authz,ou=Public,dc=blz,dc=internal"
AuthLDAPBindPassword "ImNVZODT884"
Require ldap-user
</Location>
</Virtualhost>
複製程式碼
主要LDAP配置檔案詳解:
- AuthType:驗證型別,Basic使用賬號密碼驗證
- AuthName:提示字串
- AuthBasicProvider:使用ldap驗證
- AuthLDAPBindAuthoritative:on表示只要求驗證ldap使用者,別的不認,off則可以使用svn的賬號和ldap混合賬號登入
- apache2.2中配置是
AuthzLDAPAuthoritative
,到2.4中改為了AuthLDAPBindAuthoritative
- 但在實際應用中發現並麼有什麼用,設定為off後ldap認證失敗也不會去找AuthzSVNAccessFile,或許是我姿勢不對,有知道原因的煩請告知
- apache2.2中配置是
- Require:ldap-user或valid-user
- AuthLDAPURL | AuthLDAPBindDN | AuthLDAPBindPassword: 用於查詢使用者的賬號密碼,一般設定個只讀賬號即可
- AuthLDAPURL:[協議名稱]://[ip地址或者域名]:[埠號]/[baseDN]?[attr]?[scope]?[filter]
- baseDN:指定開始搜尋的節點的名稱
- attr:就是使用者輸入的屬性鍵,預設是“uid”
- scope: one,sub,base,預設是sub
- filter:過濾器,預設是objectclass=*
- AuthLDAPURL:[協議名稱]://[ip地址或者域名]:[埠號]/[baseDN]?[attr]?[scope]?[filter]
LDAP伺服器認證過程
可能只看配置檔案不能瞭解LDAP認證的原理,接下來我們詳細討論下LDAP是如何認證的
客戶端(httpd)使用提供的URL(AuthLDAPURL)進行驗證的時候,並不是直接驗證輸入的賬號密碼,因為LDAP伺服器在驗證的時候要使用DN(每個節點使用者的唯一標識)和密碼來進行登陸驗證的,但是DN一般來說比較長,諸如:“cn=xxx,ou=xxx,ou=xxx,dc=xxx,dc=xxx”,這種光輸入的時候就煩氣了,所以要想使用簡短的使用者名稱來登陸的時候,一般的做法是在某個節點使用者上新增一個屬性,比如mobile(手機號),Email(郵箱),user name或者uid(使用者名稱),然後使用這個屬性的值來登陸(大部分情況下都用uid,我們也是這麼使用的)。
當使用者輸入這個屬性值(一般uid)和密碼的時候,客戶端(httpd伺服器)先使用AuthLDAPBindDN和AuthLDAPBindPassword作為使用者名稱和密碼登陸,根據AuthLDAPURL指定的查詢規則來查詢使用者輸入的屬性的值有沒有,如果查詢的條數為0或者大於1,則返回錯誤,如果查詢的條數等於1,則使用查詢到的這個條目的DN和使用者輸入的密碼進行登陸驗證,成功則成功,失敗則失敗。
總結一下LDAP的認證過程分為兩部:
- 搜尋使用者是否存在LDAP伺服器中:配置檔案中配置的AuthLDAPBindDN和AuthLDAPBindPassword兩個屬性主要目的就是為了登陸LDAP伺服器搜尋屬性(uid)是否只有一條,如果伺服器允許匿名訪問則這兩個配置可以不需要,但一般為了安全性都會關閉LDAP的匿名訪問,新建一個只讀許可權的賬號配置到這裡即可
- 使用使用者輸入的屬性值(uid)和密碼進行登陸驗證