Centos

針對 AD 的 Netbox 身份驗證不起作用,但參數在命令行上起作用

  • April 28, 2020

我已經在 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 定義完全解決了它。

引用自:https://serverfault.com/questions/1013696