LDAP落地實戰(二):SVN整合OpenLDAP認證

運維咖啡吧發表於2019-03-04

上一篇文章我們介紹了LDAP的部署以及管理維護,那麼如何接入LDAP實現賬號統一認證呢?這篇文章將帶你完成svn的接入驗證

subversion整合OpenLDAP認證

  • 系統環境:debian8.4
  • svn部署環境:apache2.4 + Subversion
  1. 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
複製程式碼
  1. 修改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,或許是我姿勢不對,有知道原因的煩請告知
  • Require:ldap-user或valid-user
  • AuthLDAPURL | AuthLDAPBindDN | AuthLDAPBindPassword: 用於查詢使用者的賬號密碼,一般設定個只讀賬號即可
    • AuthLDAPURL:[協議名稱]://[ip地址或者域名]:[埠號]/[baseDN]?[attr]?[scope]?[filter]
      • baseDN:指定開始搜尋的節點的名稱
      • attr:就是使用者輸入的屬性鍵,預設是“uid”
      • scope: one,sub,base,預設是sub
      • filter:過濾器,預設是objectclass=*

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的認證過程分為兩部:

  1. 搜尋使用者是否存在LDAP伺服器中:配置檔案中配置的AuthLDAPBindDN和AuthLDAPBindPassword兩個屬性主要目的就是為了登陸LDAP伺服器搜尋屬性(uid)是否只有一條,如果伺服器允許匿名訪問則這兩個配置可以不需要,但一般為了安全性都會關閉LDAP的匿名訪問,新建一個只讀許可權的賬號配置到這裡即可
  2. 使用使用者輸入的屬性值(uid)和密碼進行登陸驗證

參考文件

掃碼關注公眾號檢視更多原創文章

相關文章