2017-04-14 21 views
0

私は以下の質問が複数回尋ねられていることを知っています。ldap3 pythonを使用したActive Directory認証、クリアテキストのパスワードを避ける方法

しかし、SSLなしでそれを回避する方法はありますか?ここで

は問題です:

私は、Active Directoryでユーザーを認証休息ベースのAPIを実装してきました。

私たちのセキュリティチームは、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がこの接続にこのようなメカニズムをサポートしているかどうかはわかりません。

いずれのリードも認められます。

+0

あなたのコードスニペットには 'use_ssl = true'と記載されていますので、何が問題なのですか?接続が実際に暗号化されていることを確認するには、デバッグトレースフラグを有効にして、SSL/TLSのチャットを探します。または、ポート686(LDAPS)でAD接続を強制します。ポート389ではLDAPをオプションのTLSとともに使用します –

答えて

0

LDAP(またはpython ldap3パッケージ)は、さまざまな認証(バインド)スキームをサポートしています。一部のユーザーは、サーバーにユーザーのパスワードを多かれ少なかれ平文で転送しますが、他のユーザー(NTLMなど)は暗号を使用します(サーバーにパスワードを送信せずに、クライアントがユーザーを表すことを証明するため)サーバーによってクライアントに発行されたユニークなチャレンジが付いています)。

問題は、ldap3がチャレンジ応答の独自の計算を実装しようとしていることです。 (これには、パスワードがPythonで利用可能でなければならず、安全ではなく不便です。)代わりにSSPインターフェイスを利用する必要があります。つまり、サーバーのチャレンジをクライアントのオペレーティングシステムに渡し、OSにサーバーへの送信応答を計算させます。 OSは、ユーザーがログオンしたときの資格情報を使用し、パスワードをPythonに公開しません。

同様に、サーバーアプリケーションはレスポンス自体の検証を試みるべきではなく、チャレンジ/レスポンスをドメインコントローラに転送するサーバーのOSを延期し、チェックアウトするかどうかを返します。

コーディングが必要ですが、hereはpython ntlm sspi(ldapの代わりにhttpに適用されます)の例で、pywin32デファクトスタンダードライブラリにはdemosもあります。

おそらく、Windowsドメインで安らかなアプリケーションを実行する正しい方法は、LDAPについて忘れることです。その代わりに、Webサーバー上でWindows統合認証を有効にするか、flask-KerberosやPyAuthenNTLM2のようなものを試してみてください。

関連する問題