我担心在我的 Django 应用程序中使用 LDAP 登录不安全。在尝试了几种方法之后,我能够使用ldap3获得一个有效的自定义后端。我的组织中的其他程序员(不幸的是非 Django 程序员)建议我使用 TLS,但是当我与 ldap3 建立连接时,它看起来好像没有使用 TLS。我是 LDAP 和安全性方面的新手,但我尝试尽可能多地阅读,所以希望我不会遗漏一些明显的东西。
根据 ldap3 文档和反复试验,似乎必须先绑定连接(conn.bind()
),然后才能启动 TLS(conn.start_tls()
)。这是真的?如果连接在没有 TLS 的情况下绑定,这是否暴露了漏洞?如果是这样,连接后启动 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 应用程序中以这种方式登录是否安全?