0

我知道以下问题已被多次询问,我能找到的答案是获得 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 是否支持这种连接机制。

任何线索将不胜感激。

4

1 回答 1

2

LDAP(或 python ldap3 包)支持多种身份验证(绑定)方案。有些人或多或少地以明文将用户的密码传输到服务器,而其他人(例如 NTLM)使用密码学(证明客户端代表用户,而不将密码传输到服务器,例如仅传输密码的哈希值)服务器向客户端发出的唯一质询)。

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

同样,服务器应用程序不应尝试验证响应本身,而应遵循服务器的操作系统,它将质询/响应转发给域控制器并返回它们是否签出。

一些编码将是必要的,但这里有一个 python ntlm sspi 的示例(适用于 http 而不是 ldap),并且在 pywin32 事实标准库中也有一些演示。

然而,在 Windows 域上做一个安静的应用程序的正确方法可能是忘记 ldap。而是尝试在您的网络服务器上启用集成 Windows 身份验证,或者尝试类似 flask-Kerberos 或 PyAuthenNTLM2。

于 2017-04-15T14:12:55.917 回答