上一篇文章我們介紹了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)和密碼進行登陸驗證
參考文檔
- http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
- https://www.cnblogs.com/livepencil/archive/2010/06/15/1758706.html
相關文章推薦閱讀: