[英]Django LDAP3 security with TLS: am I secure?
我擔心在我的 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 應用程序中以這種方式登錄是否安全?
我們使用 LDAP 與我們組織中的旗艦 Django 網站進行身份驗證,使用 TLS 證書。 目前尚不清楚您是否是,因為您的目的地 URL 似乎是ldap://
而不是ldaps://
。 通常,非安全 LDAP 在端口389
上運行,而安全 LDAPS 在端口636
上運行。
有了這個背景,我強烈建議使用django-python3-ldap
package,我們已經使用了幾年,在 LDAP 中有超過 200,000 名用戶使用 objectClasses top、account 和 posixAccount。 你可以在這里找到它: https://github.com/etianen/django-python3-ldap
LDAP 是一個復雜的協議,並且有很多地方可以 go 錯誤地編寫后端(相信我,我嘗試了你要走的路徑)。 django-python3-ldap
package 經過實戰考驗,將避免這些陷阱。 您的同事可能會幫助您進行適當的設置以使其正常工作。 祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.