使用ldap3 python进行Active Directory身份验证,如何避免明文密码

时间:2017-04-14 07:18:54

标签: python active-directory flask-restful ldap3

我知道以下问题已被多次询问并且我能找到的答案是获得SSL证书。

但如何在没有SSL的情况下绕过它?

问题在于:

我一直在实施基于Rest的API,它使用Active Directory对用户进行身份验证。

我们的安全团队担心将纯文本密码从UI传递到API存在安全风险。

但是我们这样做是因为Active Directory需要纯文本密码。 它只是在POST请求中采用JSON格式:

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

这是我在python ldap3模块中使用的AD身份验证代码。

    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是否支持此连接的此类机制。

任何线索都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

LDAP(或python ldap3包)支持各种身份验证(绑定)方案。一些用户的密码或多或少地以明文形式传递给服务器,而其他人(例如NTLM)使用密码术(以证明客户端代表用户,而不将密码传输到服务器,例如仅传输哈希密码与服务器发给客户端的唯一质询卷积在一起。

问题是ldap3试图实现自己的质询 - 响应计算。 (这需要密码可用于python,并且不安全且不方便。)相反,它应该利用SSP接口,即将服务器的挑战传递给客户端的操作系统并让操作系统进行计算发送到服务器的响应。操作系统将使用用户登录时的凭据,并且不会将密码公开给python。

类似地,服务器应用程序不应该尝试验证响应本身,而是推迟到服务器的操作系统,该操作系统将质询/响应转发给域控制器并返回它们是否签出。

有些编码是必要的,但是here是python ntlm sspi的一个例子(应用于http而不是ldap),并且pywin32事实上的标准库中也有一些demos。 / p>

然而,在Windows域上执行restful应用程序的正确方法可能是忘记ldap。而是尝试在您的网络服务器上启用集成Windows身份验证,或尝试使用flask-Kerberos或PyAuthenNTLM2之类的东西。