Centos
針對 AD 的 Netbox 身份驗證不起作用,但參數在命令行上起作用
我已經在 CentOS 伺服器上設置了 netbox,並試圖讓它對我們的 AD 伺服器進行身份驗證。無論我嘗試什麼,伺服器都只記錄這一行:
my_user 的身份驗證失敗:LDAP 伺服器拒絕了使用者 DN/密碼。
沒有指示被拒絕的是綁定 DN 還是使用者 DN。
首先,我可以連接 netbox 超級使用者,瀏覽並輸入數據。所以安裝是正常的。我按照netbox 安裝文件第 5 章的文件來啟用 LDAP 身份驗證。這是我的(混淆)配置:
################################### ### LDAP server ################################### import ldap # Server URI - ldaps port is 696 AUTH_LDAP_SERVER_URI = "ldaps://ad-ldap.my.domain:696" AUTH_LDAP_CONNECTION_OPTIONS = { ldap.OPT_REFERRALS: 0 } AUTH_LDAP_BIND_DN = "CN=netbox,OU=Users,DC=My,DC=Domain" AUTH_LDAP_BIND_PASSWORD = "********" LDAP_IGNORE_CERT_ERRORS = True ################################### ### User Authentication ################################### from django_auth_ldap.config import LDAPSearch AUTH_LDAP_USER_SEARCH = LDAPSearch("OU=Users,DC=My,DC=Domain", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user))") AUTH_LDAP_USER_DN_TEMPLATE = "None" AUTH_LDAP_USER_ATTR_MAP = { "first_name": "givenName", "last_name": "sn", "email": "mail", "uid": "samaccountname" } ################################### ### User groups for permissions ################################### from django_auth_ldap.config import LDAPSearch, GroupOfNamesType AUTH_LDAP_GROUP_SEARCH = LDAPSearch("OU=Sec - Tree,OU=Groups,DC=My,DC=Domain", ldap.SCOPE_SUBTREE, "(objectClass=group)") AUTH_LDAP_GROUP_TYPE = GroupOfNamesType() AUTH_LDAP_REQUIRE_GROUP = "CN=G_Netbox_Users,OU=Sec - Tree,OU=Groups,DC=My,DC=Domain" AUTH_LDAP_USER_FLAGS_BY_GROUP = { "is_active": "CN=G_Netbox_RO,OU=Sec - Tree,OU=Groups,DC=My,DC=Domain", "is_staff": "CN=G_Netbox_RW,OU=Sec - Tree,OU=Groups,DC=My,DC=Domain", "is_superuser": "CN=G_Netbox_Admins,OU=Sec - Tree,OU=Groups,DC=My,DC=Domain" } AUTH_LDAP_FIND_GROUP_PERMS = True AUTH_LDAP_MIRROR_GROUPS = True AUTH_LDAP_CACHE_GROUPS = True AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600 # LDAP Logging import logging, logging.handlers logfile = "/var/log/netbox/django-ldap-debug.log" my_logger = logging.getLogger('django_auth_ldap') my_logger.setLevel(logging.DEBUG) handler = logging.handlers.RotatingFileHandler( logfile, maxBytes=1024 * 500, backupCount=5) my_logger.addHandler(handler)
我試過的:
- 將 uri 中的伺服器名稱更改為不存在的 fqdn,以證明它確實連接到 LDAP 伺服器 - 確實如此。
- 使用 ldap 而不是 ldaps - 沒有效果
- 嘗試使用 open-ldap 工具 ldapsearch 在命令行上使用與為 netbox 配置的相同的綁定使用者、密碼和基本 DN。我還嘗試與返回的使用者 DN 綁定 - 都成功了。
ldapsearch -H ldaps://ad-ldap.my.domain:696 -D "CN=netbox,OU=Users,DC=My,DC=Domain" -w '*******' -b "OU=Users,DC=My,DC=Domain" "(sAMAccountName=my_user)" dn ldapsearch -H ldaps://ad-ldap.my.domain:696 -D "CN=my user name,OU=Users,DC=My,DC=Domain" -w '*******' -b "OU=Users,DC=My,DC=Domain" "(sAMAccountName=my_user)" cn
- 將 netbox 使用者的(非常)強密碼更改為只有字母和數字的密碼 - 無效
- 在 AUTH_LDAP_USER_SEARCH 中使用更寬的基礎 DN,即刪除 OU(我的實際基礎有一個數字) - 沒有效果
Google也沒有進一步幫助我..我很茫然,它應該根據文件工作,一切看起來都正確。我在這裡想念什麼?
如果其他人遇到這個問題,我會在這裡發布我的解決方案。
根本原因是文件中的這種模棱兩可的陳述:
使用 Windows Server 2012 時,AUTH_LDAP_USER_DN_TEMPLATE 應設置為無。
我們將此解釋為將此變數的值設置為“無”,認為 Netbox/Django 需要使用模板跳過該值(我們不是 Python 程序員)。
由於 Django-auth-ldap 只發出使用者友好的 1 行警告並隱藏所有 LDAP 錯誤,我不得不求助於綁定到純文字 LDAP 並使用 Wireshark 進行數據包嗅探,以發現 Django 實際上沒有與配置的 Bind 綁定DN,而是嘗試使用字元串“None”作為 DN 和使用者密碼直接綁定。顯然那失敗了。
從 ldap_config.py 中刪除 AUTH_LDAP_USER_DN_TEMPLATE 定義完全解決了它。