Question Transférer l'authentification NTLM au proxy d'entreprise à partir du serveur proxy local


J'ai un script Python qui est censé accéder à diverses API Web de notre serveur à Internet. Le problème est que la prise en charge de Python par rapport à ce que j'ai vu est assez faible en ce qui concerne la prise en charge de l'authentification NTLM. Cela oblige notre serveur proxy d'entreprise à toujours renvoyer le code HTTP 407. Mon idée initiale était de configurer un serveur proxy local à l'aide d'IIS et du module de routage des demandes d'application, qui transmettraient toutes les demandes à notre proxy d'entreprise tout en gérant l'authentification NTLM. Le problème avec cette approche est qu'il ne semble pas transférer mes informations d'identification NTLM, à partir desquelles l'utilisateur actuel exécute le script Python.

Cette approche fonctionnera-t-elle? Si oui, comment puis-je le mettre en œuvre?


5
2017-09-24 12:57


origine




Réponses:


Avez-vous jeté un coup d'oeil à ceux-ci?

Serveur proxy d'autorisation NTLM

Python NTLM


2
2017-09-24 13:43





Peut-être un peu tard, mais je voulais quand même le mentionner. Nul doute que la prise en charge de NTLM dans votre script serait formidable, mais cela ne ferait qu'ajouter à la complexité sans générer de gros retours. Peut-être serait-il préférable d'utiliser NTLMAps, Cntlm ou Px.

NTLMAps et Cntlm sont des proxies qui font l’autorisation NTLM en tant que proxy intermédiaire. Cependant, ils nécessitent tous les deux le nom d'utilisateur / passe car ils sont principalement destinés aux utilisateurs de Linux. Historiquement, j'utilisais ces outils sous Windows, mais j'étais obligé de leur fournir les informations d'identification et de le mettre à jour chaque fois que mon mot de passe était modifié.

En conséquence, j'ai écrit Px pour Windows qui est un proxy HTTP comme les deux précédents, mais utilise SSPI pour gérer l’authentification requise avec le proxy d’entreprise. Tout ce que vous devez configurer est le serveur proxy et le port.

Pour le développement de vos propres applications, le code devrait également aider à comprendre comment le faire dans Python et peut-être dans d'autres langages ayant accès à SSPI. Mais vous préférez isoler le désordre de NTLM et ne pas vous en mêler.


5
2017-09-09 19:00



poste sous-apprécié. - Ramazan Polat


Je sais que la question est très ancienne, mais toutes les réponses que j'ai vues exigent que vous saisissiez vos informations d'identification NTLM dans une sorte de code de traitement de proxy NTLM python. Ces mandataires sont également susceptibles d'être buggy, selon mon expérience. J'ai créé une solution pour Windows, qui détecte automatiquement les configurations de système proxy d'entreprise et effectue automatiquement l'authentification NTLM avec les informations d'identification de l'utilisateur actuel. Cette solution utilise les appels pywin32 et COM. Ce n'est pas joli, mais ça marche bien, alors je voulais le transmettre au cas où cela aiderait quelqu'un d'autre.

Dans l'exemple, je montre comment faire un post, mais d'autres types de requêtes devraient être faciles à comprendre à partir de ce code:

import win32com.client

try:
    import _winreg as winreg
except:
    import winreg

class HTTP:
    proxy = ""
    isProxy = False

    def __init__(self):
        self.get_proxy()

    def get_proxy(self):
        oReg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
        oKey = winreg.OpenKey(oReg, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
        dwValue = winreg.QueryValueEx(oKey, 'ProxyEnable')

        if dwValue[0] == 1:
            oKey = winreg.OpenKey(oReg, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
            dwValue = winreg.QueryValueEx(oKey, 'ProxyServer')[0]
            self.isProxy = True
            self.proxy = dwValue

    def url_post(self, url, formData):
        httpCOM = win32com.client.Dispatch('Msxml2.ServerXMLHTTP.6.0')

        if self.isProxy:
            httpCOM.setProxy(2, self.proxy, '<local>')

        httpCOM.setOption(2, 13056)
        httpCOM.Open('POST', url, False)
        httpCOM.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
        httpCOM.setRequestHeader('User-Agent', 'whatever you want')

        httpCOM.send(formData)

        return httpCOM.responseText

http = HTTP()

print(http.url_post('http://ipecho.net/', 'test=1'))

2
2018-02-13 00:59



En aucune façon! C'est génial. Vous avez raison de dire que la plupart des procurations sont buggées. Nous utilisons actuellement Ctnlm, qui fonctionne assez bien dans l’ensemble. Le seul problème que nous voyons est que le service Windows Cntlm s'arrête de manière aléatoire lorsqu'il est martelé à partir de demandes. - self.