it-swarm.com.de

Wie funktioniert die Maven 3 Passwortverschlüsselung?

Ich versuche, die [Kennwortverschlüsselungsfunktion von Maven 3 zu verstehen. Ich habe festgestellt, dass diese Funktion schlecht dokumentiert und verwirrend ist. Beispielsweise widersprechen sich die Feature-Dokumentation und ein Blog-Beitrag des Autors des Features in mehreren Punkten.

Diese Frage ist umfassender als Wie funktioniert maven --encrypt-master-password? und wird von Maven encrypt-master-password nicht behandelt.

Insbesondere versuche ich, die folgenden Fragen zu beantworten, die nicht in der Dokumentation enthalten sind. Ich habe die Informationen, die ich bisher sammeln konnte, unter jede Frage in Kursivschrift gesetzt.

  1. Bietet das verschlüsselte Hauptkennwort Sicherheit, indem es einfach in settings-security.xml in einem Ordner vorhanden ist, auf den nur ein Benutzer zugreifen kann (~/.m2)? Wenn ja, warum sollte man sich die Mühe machen, ein 'Hauptkennwort' zu verschlüsseln (warum nicht einfach einen zufälligen Wert verwenden)? Ist das 'Master-Passwort' nicht wirklich nur eine Entropieeingabe für die kryptografische Funktion? Das Nennen eines Kennworts ist verwirrend. Ich habe erwartet, dass Maven mich zur Eingabe dieses Kennworts auffordert, bevor verschlüsselte Serverkennwörter entschlüsselt werden. Dies war jedoch nicht der Fall.

Ich verstehe, dass dies nur Sicherheit bietet, indem es in einer durch ein Betriebssystem geschützten Datei vorhanden ist. Ich glaube, Maven ermöglicht es Ihnen, ein Master-Passwort zu verschlüsseln, sodass Sie es erneut generieren können, wenn Sie die settings-security.xml-Datei verlieren. Ist dies richtig?

  1. Verwenden das Master-Passwort und das Server-Passwort denselben Verschlüsselungsprozess/dieselbe Verschlüsselung? Die Serverkennwörter basieren auf dem Master-Kennwort, daher muss der Algorithmus einen gewissen Unterschied aufweisen. Wo befindet sich der Quellcode dafür?

Marcelo Morales 'Antwort auf Wie funktioniert maven --encrypt-master-password Links zum Plexus-Cihper-Projekt auf GitHub . Es ist nicht klar, ob das nur die Chiffre ist, oder das eigentliche Maven-Plugin, das die Passwort-Funktionalität bietet.

  1. Ich habe festgestellt, dass dasselbe Master- oder Server-Passwort, das mehrfach verschlüsselt wurde, unterschiedliche Hashes ergibt. Laut Marcelo Morales 'Antwort auf Wie funktioniert maven --encrypt-master-password? ist dies darauf zurückzuführen, dass dem Kennwort vor' ein JVM-konfigurationsspezifisches (normalerweise SHA1PRNG) 64-Bit-Zufalls-Salt 'hinzugefügt wurde verschlüsseln. Maven entschlüsselt gespeicherte Passwörter, wenn sie zur Kompilierungszeit verwendet werden. Bedeutet das nicht, dass die Salze irgendwo gelagert werden müssen?

Ich habe keine Ahnung.

  1. Ich habe auch beobachtet, dass ein reguläres Passwort, das mit einem verschlüsselten Master-Passwort verschlüsselt wurde, weiterhin funktioniert, wenn das Master-Passwort erneut verschlüsselt und in der settings-security.xml -Datei gespeichert wird, obwohl der verschlüsselte Master-Passwort-Chiffretext jetzt anders ist . Kann mir jemand erklären, wie das geht?

Ich habe keine Ahnung. Mir kommt es so vor, als würde Maven irgendwo etwas faul machen oder Klartext speichern.

  1. Nach meinem Verständnis können die verschlüsselten Passwörter nur mit <server />-Tags in der settings.xml-Datei verwendet werden. Ist das wahr? Wo können in settings.xml definierte Server verwendet werden?

Nach meinem Verständnis können <server /> -Definitionen in <repositories /> und <distributionManagement /> verwendet werden, nicht jedoch in <scm />. Kann dies jemand überprüfen?

  1. Für solch ein kritisches Merkmal (Build-System-Sicherheit) scheint es mir viel Verwirrung und schlechte Dokumentation zu geben. Kann jemand darauf hinweisen, wie die Dokumentation auf der Maven 3-Website funktioniert? Gibt es irgendwo einen Wiki-Link, über den ich versuchen kann, die Dokumentation zu verbessern?

Ich habe keine Ahnung

Tut mir leid für die Textwand und vielen Dank für alle Antworten.

19
aaronsnoswell

Meine Antwort basiert darauf, den Quellcode von Maven zu lesen und ein wenig zu recherchieren.

  1. Bietet das verschlüsselte Hauptkennwort Sicherheit, indem es einfach in settings-security.xml in einem Ordner vorhanden ist, auf den nur ein Benutzer zugreifen kann (~/.m2)? Wenn ja, warum sollten Sie sich mit dem Verschlüsseln eines 'Master-Passworts' beschäftigen (warum verwenden Sie nicht einfach einen Zufallswert)? Ist das "Master-Passwort" nicht wirklich nur eine Entropieeingabe für die kryptographische Funktion? Ein Passwort anzurufen, ist verwirrend - ich habe erwartet, dass Maven mich vor dem Entschlüsseln verschlüsselter Serverpasswörter zur Eingabe dieses Passworts auffordert, dies jedoch nicht tat.

Das Master-Passwort ist eine Eingabe in die Verschlüsselungsfunktion zum Verschlüsseln/Entschlüsseln der Server-Passwörter. Wenn jemand über Ihre individuellen verschlüsselten Serverkennwörter verfügt, kann er diese nur dann entschlüsseln, wenn er über Ihr Hauptkennwort verfügt. Dies bedeutet, dass Sie Ihre Maven Settings.xml-Datei frei für andere Benutzer freigeben können, ohne dass diese Ihre Server-Passwörter entschlüsseln können. Aus diesem Grund wird das Master-Passwort in einer separaten Datei gespeichert. 

Diese Begründung wird in Verschlüsselungshandbuch etwas erklärt.

  1. Verwenden das Master-Passwort und die Server-Passwörter den gleichen Verschlüsselungsprozess/die gleiche Verschlüsselung? Die Server-Passwörter basieren auf dem Master-Passwort, daher muss sich der Algorithmus unterscheiden. Wo befindet sich der Quellcode dafür?

Soweit ich das beurteilen kann, wird das Master-Passwort mit derselben Verschlüsselung wie die Server-Passwörter verschlüsselt. Beim Entschlüsseln der Server-Passwörter ist das Master-Passwort (verschlüsseltes Formular) eine Eingabe. Beim Entschlüsseln des Master-Passworts wird als zusätzliche Eingabe der Zauberstring "" settings.security "" verwendet.

Sie können den Quellcode PBECipher und MavenCli.Java sehen.

  1. Ich habe beobachtet, dass dasselbe Master-Passwort oder Server-Passwort, das mehrfach verschlüsselt wurde, unterschiedliche Hashes ergibt. Laut Marcelo Morales 'Antwort auf Wie funktioniert maven --encrypt-master-password ? Liegt dies daran, dass dem Passwort vor' ein JVM-konfigurationsspezifisches (normalerweise SHA1PRNG) 64-Bit-Zufalls-Salt 'hinzugefügt wird verschlüsseln. Maven entschlüsselt gespeicherte Kennwörter, wenn sie zur Kompilierzeit verwendet werden. Bedeutet das nicht, dass die Salze irgendwo gelagert werden müssen?

Ein herkömmlicher Ansatz für den Umgang mit Salzen besteht darin, dass das zufällige Salz zusammen mit dem verschlüsselten Text gespeichert wird. Siehe den Wikipedia-Artikel .

Basierend auf dem oben verlinkten Quellcode scheint der Salt als die ersten 8 Bytes der entschlüsselten Base64-Bytes direkt vor dem verschlüsselten Passwort gespeichert zu sein.

  1. Ich habe auch beobachtet, dass ein normales, mit einem verschlüsselten Hauptkennwort verschlüsseltes Kennwort weiterhin funktioniert, wenn das Hauptkennwort erneut verschlüsselt und in der settings-security.xml-Datei gespeichert wird, obwohl der verschlüsselte Hauptkennwort-Geheimtext jetzt anders ist . Kann jemand erklären, wie das funktioniert?

Dies liegt daran, dass die Form entschlüsselt des Hauptkennworts verwendet wird, nicht der verschlüsselte "Chiffretext". Die Neuverschlüsselung hat also keine Auswirkungen auf die Verschlüsselung/Entschlüsselung des Serverpassworts.

Ich kenne die Antwort auf Ihre letzten zwei (5 und 6) Fragen nicht.

10
GreenGiant

Ich muss das für Bnd (Tools) wissen, damit ich etwas tiefer gehende Analyse teilen kann.

Die "verschlüsselten" Kennwörter haben folgende Syntax:

output    ::= '{' base64(packet) '}'
packet    ::= salt[8] padlen[1] encrypted[?] padding[padlen]
salt      ::= <random>
padlen    ::= <length of padding >
padding   ::= <random to make packet length a multiple of 16>

Die verwendete Verschlüsselung lautet AES/CBC/PKCS5Padding. Der geheime Schlüssel und Initialisierungsvektor wird wie folgt berechnet:

sha = sha256( X + salt[8] )
key = sha[0..16]
iv  = sha[16..32]

Für das Master-Passwort ist X "security.settings". Da dies eine bekannte Konstante ist, wird das Hauptkennwort nicht verschlüsselt, sondern nur verdeckt. Bei den Server-Passwörtern ist X das entschlüsselte Hauptpasswort. 

Warum das resultierende Paket aufgefüllt wird, scheint eine Verschwendung von Bytes zu sein, da das Paketformat das Trippen trivial macht und sie niemals Teil der Verschlüsselung/Entschlüsselung sind. Sie fügen der base64-Zeichenfolge nur einige zufällige Zeichen hinzu.

Die einzige Möglichkeit, dies zu erreichen, ist die Verwendung der Umsiedlungsfunktion. Wenn Sie beispielsweise die Einstellungen-security.xml auf einem privaten Mount auf dem Build-Server bereitstellen. Sie können dann die settings.xml-Datei in öffentlichen Repos freigeben. Dies ist jedoch auch eine saubere Lösung, da Sie für alle Benutzer und CI-Build-Server denselben Mountpunkt bereitstellen müssen.

Beachten Sie, dass jedes Plug-In alle Ihre Server-Passwörter dekodieren kann. Verwenden Sie daher niemals echte Passwörter für die Server. Nexus kann Proxy-Passwörter erstellen.

2
Peter Kriens

Hier ist ein Beispielcode, der zeigt, wie das Maven Master-Passwort entschlüsselt wird 

~/.m2/security-settings.xml 

und auch die Server-Passwörter aus 

~/.m2/settings.xml

Quelle von MavenPasswordDecryptor.Java

import org.sonatype.plexus.components.cipher.DefaultPlexusCipher;

public class MavenPasswordDecryptor {
    public static void main(String[] args) throws Exception {

        if (args.length < 1 || args.length > 2 ) {
            System.out.println("Usage: Java -jar maven-password-decryptor.jar <encrypted-password>");
            System.out.println("Usage: Java -jar maven-password-decryptor.jar <encrypted-password> <master-password>");
            return;
        }

        DefaultPlexusCipher cipher = new DefaultPlexusCipher();

        String encryptedPassword = args[0];
        String passPhrase = (args.length == 2 && args[1] != null && !args[1].isEmpty()) ? args[1] : "settings.security";

        String result = cipher.decryptDecorated(encryptedPassword, passPhrase);

        System.out.println(result);
    }
}

Es gibt auch ein Beispielprojekt auf GitHub:

https://github.com/uweguenther/maven-password-decryptor

1
Uwe Günther