Vermeiden von Klartextkennwörtern in http_proxy

7

Ich stehe hinter einer Unternehmensfirewall, die im Bereich der Proxys viele Probleme mit sich bringt. Es gibt zwei Hauptansätze, die ich gefunden habe, um zu funktionieren:

  1. Verwenden Sie Cntlm auf Kosten der Tatsache, dass keine Verbindung (über die Befehlszeile) zu HTTPS und externen SSH-Standorten hergestellt werden kann. (Mit Cntlm können Sie Ihren Benutzernamen und Ihr Kennwort mit PassNTLMv2 hashen (wodurch Klartext vermieden wird) und http://localhost:3128/als Proxy festlegen, der dann zu Ihrem "echten" Proxy umleitet. Wie bereits erwähnt, kann ich mit dieser Methode keine Verbindung zu HTTPS und externem SSH herstellen.)
  2. Geben Sie meinen Benutzernamen und mein Passwort im Klartext in die http_proxyVariable ein, auf Kosten meines Benutzernamens und Passworts im Klartext.

Wenn Sicherheit kein Problem wäre, würde ich natürlich nur Option 2 verwenden.

Ich fand eine Lösung, indem ich dies in meinem .babrunrc(ich benutze Babun, es ist im Grunde Cygwin mit einem kleinen Extra, das gleiche könnte in einem .bashrcoder .zshrcobwohl sein).

export http_proxy="http://`echo "Y21hbjpwYXNzd29yZA==" | base64 -d`@20.20.20.20:20/"

Auf diese Weise wird mein Passwort zumindest verschlüsselt. Wenn jemand an meinen Computer kam und tippte echo $http_proxy, sah er mein Passwort, aber ich glaube, daran führt kein Weg vorbei.

Gibt es dafür alternative Ansätze? Oder vielleicht eine Möglichkeit, die Zeichenfolge zu verschlüsseln, anstatt sie zu verschlüsseln? Es würde mir nichts ausmachen, ein Passwort einzugeben, wenn ich eine Eingabeaufforderung öffne, wenn es keinen Weg daran vorbei gibt.

Captain Man
quelle
Warum Sie nicht verwenden PASSLM, PASSNT, PASSNTLMv2von in /etc/cntlm.confund hören zu 3128 - Port? und exportieren http_proxy/https_proxynachlocalhost:3128
Thushi
@Thushi das habe ich mit Cntlm gemeint. Das Problem ist, dass ich bei Verwendung von Cntlm keine Verbindung zu HTTPS oder externem SSH herstellen kann. Wenn Maven beispielsweise versucht, etwas aus einem HTTPS-Repository abzurufen, schlägt dies fehl. Ich habe mir das angeschaut und bin mir nicht sicher, ob es sich um einen Proxy handelt oder einfach außerhalb des Geltungsbereichs von Cntlm. Es gibt eine Portumleitung (Tunneling?), Von der ich glaube, dass sie für HTTPS funktioniert, aber ich möchte nicht für jeden einzelnen HTTPS-Link, den ich treffen muss, einen Eintrag vornehmen müssen. Ich hätte lieber einen Ansatz, der keine zusätzlichen Eingaben erfordert. Ich werde es ändern, um klar zu machen, dass ich versucht habe, Ihren Vorschlag zu machen.
Captain Man

Antworten:

7

Die Verwendung von base64 ist nutzlos, es ist nur eine einfache Transformation. Die Verwendung der Verschlüsselung mit einem Schlüssel, der neben den verschlüsselten Daten gespeichert ist, ist ebenfalls nutzlos, da es sich nur um eine einfache Umwandlung handelt. Wenn Sie befürchten, dass jemand Zugriff auf Ihre Konfigurationsdateien erhält, müssen Sie mit einem Schlüssel verschlüsseln, der nicht in Ihren Konfigurationsdateien enthalten ist. Dies bedeutet, dass Sie beim Anmelden ein Kennwort¹ eingeben müssen.

Verwenden Sie einen vorhandenen Verschlüsselungsmechanismus, anstatt Ihren eigenen zu erstellen.

Wenn Sie unter Linux mit Dateiverschlüsselung arbeiten, verschlüsseln Sie Ihr Home-Verzeichnis mit eCryptfs oder verschlüsseln Sie die gesamte Festplatte mit der Linux-Festplattenverschlüsselungsschicht (dm-crypt, cryptsetupBefehl) oder erstellen Sie ein kleines, pro Datei verschlüsseltes Dateisystem mit encfs . Im letzteren Fall sollten Sie ein Skript haben, das das encfs-Dateisystem bereitstellt und dann ein dort gespeichertes Skript ausführt.

Legen Sie die Datei unter Windows auf einem TrueCrypt / VeraCrypt ab .

Alternativ können Sie einen Passwort-Manager verwenden (natürlich ein Master-Passwort festlegen). Der Gnome-Passwort-Manager (Gnome-Schlüsselring) kann mit dem secret-toolDienstprogramm über die Befehlszeile abgefragt werden . Seahorse bietet eine praktische Benutzeroberfläche zum Erkunden und Ändern des Schlüsselbunds und zum Festlegen eines Hauptkennworts.

secret-tool store --label='Corporate web proxy password' purpose http_proxy location work.example.com

export http_proxy="http://cman:$(secret-tool lookup purpose http_proxy location work.example.com)@192.0.2.3/"

Dies erforderte D-Bus, der normalerweise standardmäßig unter Linux verfügbar ist (die meisten modernen Desktop-Umgebungen erfordern dies), aber unter Cygwin manuell gestartet werden muss (ich weiß nicht genau, wie).

¹ oder anderweitig geheimes Material liefern, z. B. auf einer Smartcard gespeichert.

Gilles 'SO - hör auf böse zu sein'
quelle
Hat openssl enc -aes-128-cbc -aspeichern den Schlüssel neben den verschlüsselten Daten wie Sie gesagt haben ?
Captain Man
@CaptainMan Nein, aber der Schlüssel wird auf eine Weise aus dem Passwort abgeleitet, die zu einfach zu erzwingen ist. Wie beim Passwort-Hashing sollte die passwortbasierte Schlüsselableitung gesalzen und langsam sein, ist aber openssl encnicht langsam. Im Allgemeinen opensslist das schrecklich und Sie sollten es nicht verwenden, es sei denn, Sie wissen genau, was Sie tun (und oft auch dann nicht): Es gibt Ihnen keinen Hinweis darauf, ob das, was Sie tun, sicher ist oder nicht.
Gilles 'SO - hör auf böse zu sein'
@Giles Wenn ich starte, erhalte ich folgende secret-tool store --label='EIS domain password' domain EIS value passwordFehlermeldung: Gibt es (secret-tool:43544): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed <newline> secret-tool: Failed to execute child process "dbus-launch" (No such file or directory)eine Idee, wo das Problem liegen könnte? Ich benutze Cygwin.
Captain Man
@CaptainMan Oh, sorry, ich hatte völlig übersehen, dass Sie Cygwin verwenden. Ich denke, Sie können Gnome-Schlüsselbund unter Cygwin verwenden. Sie müssen D-Bus manuell starten ( dbus-launchmöglicherweise die DBUS_SESSION_BUS_ADDRESSUmgebungsvariablen festlegen ), aber ich habe es nie getan, sodass es einige Schwierigkeiten geben kann, die mir nicht bewusst sind. Encfs und Ecryptfs sind überhaupt keine Option, aber Sie können einen Truecrypt / Veracrypt-Container verwenden.
Gilles 'SO - hör auf böse zu sein'
8

Ich habe eine Lösung gefunden: Hinzufügen openssl enc -aes-128-cbc -a -dzu der Mischung. Wie in der akzeptierten Antwort erwähnt , ist diese Option jedoch wahrscheinlich nicht sehr sicher.

Geben Sie hier zunächst die Kennwortkombination für den Benutzernamen (oder das Base64-codierte Äquivalent) ein.

echo "<put it here>" | openssl enc -aes-128-cbc -a

Es wird zweimal nach einem Passwort gefragt. Dieses Passwort ist das Passwort, das Sie bei jeder http_proxyEinstellung eingeben müssen .

Dann, in .babunrc(oder wo immer Sie es setzen),

export http_proxy="http://`echo "<output from above command>" | openssl enc -aes-128-cbc -a -d`@20.20.20.20:20/"

Wenn die Eingabe base64-codiert war, benötigen Sie stattdessen Folgendes:

export http_proxy="http://`echo "<output from above command>" | openssl enc -aes-128-cbc -a -d | base64 -d`@20.20.20.20:20/"

Wenn das <output from above command>eine neue Leitung hatte, \nwird es funktionieren.

Captain Man
quelle
Gibt es eine Möglichkeit, es dem Schlüsselbund hinzuzufügen?
Mashimom
@Mashimom Ja, Gilles 'Antwort legt diesen Ansatz nahe.
Captain Man