2017-04-14 75 views
0

我知道下面的問題已被多次詢問並回答我可以找到的是獲得SSL證書。使用ldap3 python的活動目錄認證,如何避免明文密碼

但是如何避免使用SSL?

這裏的問題是:

我一直在實施基於REST的API,其驗證與Active Directory用戶。

我們的安全團隊擔心從UI傳遞純文本密碼到API是安全風險。

但是我們這樣做是因爲Active Directory需要純文本密碼。 它只是JSON格式中的POST請求:

{"user":"uname","password":"password"} 

這裏是我從蟒LDAP3模塊使用AD AUTH碼。

s = Server(AD_SERVER, port=AD_PORT, use_ssl=True, get_info=ALL) 
    c = Connection(s, user=userName, password=password, authentication=NTLM) 
    c.bind() 

所以在上面有一種方法可以用任何散列或任何加密格式發送密碼。 我不確定Active Directory或ldap3是否支持此連接的機制。

任何線索將不勝感激。

+0

你的代碼片段陳述'use_ssl = true',那麼問題是什麼?如果你想確保連接確實是加密的,那麼啓用一些調試跟蹤標誌並尋找SSL/TLS nego chatter。或強制端口686(LDAPS)上的AD連接​​ - 端口389使用帶有可選TLS的LDAP –

回答

0

LDAP(或python ldap3包)支持各種身份驗證(綁定)方案。有些人以明文方式將用戶密碼或多或少地傳送到服務器,而其他人(例如NTLM)則使用密碼方式(證明客戶端代表用戶,而不將密碼傳送到服務器,例如像傳送密碼散列一樣由服務器發佈給客戶端的獨特挑戰)。

問題是,ldap3試圖執行自己的挑戰 - 響應計算。 (這要求密碼可用於python,並且不安全,不方便)。相反,它應該使用SSP接口,即將服務器的挑戰傳遞給客戶端的操作系統,並讓操作系統計算髮送到服務器的響應。操作系統將使用用戶登錄時的憑據,並且不會將密碼暴露給python。

同樣,服務器應用程序不應該嘗試驗證響應本身,而是應該服從將服務器的操作系統轉發給域控制器並返回是否檢出。

一些編碼是必要的,但here是python ntlm sspi(應用於http而不是ldap)的示例,並且在pywin32事實標準庫中也有一些demos

然而,在Windows域上執行安靜應用程序的正確方法可能是忘記ldap。請嘗試在Web服務器上啓用集成Windows身份驗證,或嘗試諸如flask-Kerberos或PyAuthenNTLM2之類的東西。