python - 使用 TLS 的 Django LDAP3 安全性 : am I secure?

标签 python django security ldap ldap3

我担心 Django 应用程序中使用 LDAP 登录不安全。在尝试了几种方法之后,我能够使用 ldap3 获得一个工作的自定义后端。 。我的组织中的其他程序员(不幸的是非 Django 程序员)建议我使用 TLS,但是当我与 ldap3 建立连接时,它看起来好像没有使用 TLS。我是 LDAP 和安全性的新手,但我已经尝试尽可能多地阅读,所以希望我不会遗漏一些明显的东西。

根据 ldap3 文档和反复试验,似乎必须先绑定(bind)连接 (conn.bind()),然后才能启动 TLS (conn.bind())。 start_tls())。这是真的?如果连接未使用 TLS 进行绑定(bind),这是否会暴露漏洞?如果是这样,连接后启动 TLS 有何意义?

我是否正确使用 ldap3 和 TLS?这种登录方式是否不安全,会暴露密码?

#backends.py

import ldap3
import ssl

class LDAPBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None):
        server = ldap3.Server('ldap://<url>', use_ssl=True)
        conn = ldap3.Connection(server, user=request.POST.get('username'), password=request.POST.get('password'))

        try:
            conn.bind()
            conn.start_tls()
            search_filter = '(&(objectClass=user)(userPrincipalName='+request.POST.get('username')+'))'
            conn.search(search_base='<search terms>', search_filter=search_filter, search_scope='SUBTREE', attributes='*')
            attrs = conn.response[0]['attributes']
            username = attrs['userPrincipalName']

        except:
            return None

如果我切换 conn.bind()conn.start_tls() 顺序(因此 TLS 首先启动),登录将失败(表单显示“输入正确的用户名...”)。

在 Django 应用程序中以这种方式登录安全吗?

最佳答案

我们使用 LDAP 通过 TLS 证书对我们组织中的旗舰 Django 网站进行身份验证。目前尚不清楚您是否是这样,因为您的目标 URL 似乎是 ldap:// 而不是 ldaps://。通常,非安全 LDAP 在端口 389 上运行,而安全 LDAPS 在端口 636 上运行。

有了这个背景,我强烈建议使用 django-python3-ldap 包,我们已经使用它好几年了,LDAP 中有超过 200,000 个用户使用 objectClasses top 、帐户和 posixAccount。您可以在这里找到它:https://github.com/etianen/django-python3-ldap

LDAP 是一种复杂的协议(protocol),在编写后端时有很多地方可能会出错(相信我,我尝试了您要走的路径)。 django-python3-ldap 包经过了实际测试,可以避免这些陷阱。您的同事可能可以帮助您进行正确的设置以使其正常工作。祝你好运!

关于python - 使用 TLS 的 Django LDAP3 安全性 : am I secure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58941539/

相关文章:

php - 带有 SSL 证书的网站

sql-server - 文件流与本地保存在sql server中?

Python获取当前日历季度的第一天和最后一天

python - 如果符合特定条件,如何从文本文件中查找列中的值总和

javascript - React useState 钩子(Hook)没有持续更新

django - WSGIPassAuthorization On 不起作用

javascript - UnlockField 在 CakePHP 中不起作用

python - 如何从串行数据中减少 'readline()' 所花费的时间

python字符串解析不解析换行符

django - 在中间件而不是 View 中测试 is_authenticated()