针对 AD 的 Netbox 身份验证不起作用,但参数在命令行上有效

针对 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,绑定用户、密码和基本 DN 与为 netbox 配置的相同。我还尝试使用返回的用户 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 也没有进一步帮助我。我不知所措,它应该按照文档工作,一切看起来都正确。我在这里遗漏了什么?

答案1

如果其他人遇到这个问题,我会在这里发布我的解决方案。

根本原因是文档中这个含糊不清的说法:

当使用 Windows Server 2012 时,AUTH_LDAP_USER_DN_TEMPLATE 应设置为 None。

我们将其解释为将此变量的值设置为“None”,认为 Netbox/Django 需要它来跳过使用模板(我们不是 Python 程序员)。

由于 Django-auth-ldap 仅发出用户友好的 1 行警告并隐藏所有 LDAP 错误,我不得不求助于绑定到纯文本 LDAP 并使用 Wireshark 进行数据包嗅探,以发现 Django 实际上并未与配置的绑定 DN 绑定,而是尝试使用字符串“None”作为 DN 和用户密码进行直接绑定。显然失败了。

从 ldap_config.py 中删除 AUTH_LDAP_USER_DN_TEMPLATE 定义就解决了这个问题。

相关内容