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アプリでこの方法でログインするのは安全ですか?