So verwenden Sie verschlüsselte Passwörter in Bash-Skripten

Veröffentlicht: 2022-01-29
Ein Linux-Laptop im Ubuntu-Stil.
fatmawati achmad zaenuri/Shutterstock.com

Wenn Sie gezwungen sind, ein Linux-Skript zu verwenden, um eine Verbindung zu einer passwortgeschützten Ressource herzustellen, fühlen Sie sich wahrscheinlich unwohl, wenn Sie dieses Passwort in das Skript einfügen. OpenSSL löst dieses Problem für Sie.

Passwörter und Skripte

Es ist keine gute Idee, Passwörter in Shell-Skripten einzufügen. Tatsächlich ist es eine wirklich schlechte Idee. Wenn das Skript in die falschen Hände gerät, kann jeder, der es liest, sehen, wie das Passwort lautet. Aber wenn Sie gezwungen sind, ein Skript zu verwenden, was können Sie dann noch tun?

Sie können das Passwort manuell eingeben, wenn der Prozess diesen Punkt erreicht, aber wenn das Skript unbeaufsichtigt ausgeführt wird, funktioniert das nicht. Glücklicherweise gibt es eine Alternative zum Festcodieren der Passwörter in das Skript. Um dies zu erreichen, wird entgegen der Intuition ein anderes Passwort verwendet, zusammen mit einer starken Verschlüsselung.

In unserem Beispielszenario müssen wir von unserem Ubuntu-Computer aus eine Remote-Verbindung zu einem Fedora-Linux-Computer herstellen. Wir verwenden ein Bash-Shell-Skript, um eine SSH-Verbindung zum Fedora-Computer herzustellen. Das Skript muss unbeaufsichtigt ausgeführt werden, und wir möchten das Kennwort für das Remote-Konto nicht in das Skript einfügen. Wir können in diesem Fall keine SSH-Schlüssel verwenden, weil wir vorgeben, dass wir keine Kontrolle oder Administratorrechte über den Fedora-Computer haben.

Wir werden das bekannte OpenSSL-Toolkit verwenden, um die Verschlüsselung zu handhaben, und ein Dienstprogramm namens sshpass , um das Passwort in den SSH-Befehl einzugeben.

VERWANDT: So erstellen und installieren Sie SSH-Schlüssel aus der Linux-Shell

Installation von OpenSSL und sshpass

Da viele andere Verschlüsselungs- und Sicherheitstools OpenSSL verwenden, ist es möglicherweise bereits auf Ihrem Computer installiert. Ist dies jedoch nicht der Fall, dauert die Installation nur einen Moment.

Geben Sie unter Ubuntu diesen Befehl ein:

 sudo apt erhält openssl 

Um sshpass zu installieren, verwenden Sie diesen Befehl:

 sudo apt installiert sshpass 

Auf Fedora müssen Sie Folgendes eingeben:

 sudo dnf install openssl 

Der Befehl zum Installieren von sshpass lautet:

 sudo dnf installiert sshpass 

Unter Manjaro Linux können wir OpenSSL installieren mit:

 sudo pacman -Sy openssl 

Um schließlich sshpass zu installieren, verwenden Sie diesen Befehl:

 sudo pacman -Sy sshpass 

Verschlüsseln auf der Kommandozeile

Bevor wir uns mit der Verwendung des openssl -Befehls mit Skripten befassen, machen wir uns mit ihm vertraut, indem wir ihn auf der Befehlszeile verwenden. Nehmen wir an, das Passwort für das Konto auf dem Remote-Computer lautet rusty!herring.pitshaft . Wir werden dieses Passwort mit openssl verschlüsseln.

Dabei müssen wir ein Verschlüsselungspasswort angeben. Das Verschlüsselungspasswort wird in den Verschlüsselungs- und Entschlüsselungsprozessen verwendet. Der Befehl openssl viele Parameter und Optionen. Wir werden uns jeden von ihnen gleich ansehen.

 echo 'rusty!hering.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password' 

Wir verwenden echo , um das Passwort des entfernten Kontos durch eine Pipe und in den Befehl openssl zu senden.

Die openssl Parameter sind:

  • enc -aes-256-cbc : Der Codierungstyp. Wir verwenden die Advanced Encryption Standard 256-Bit-Schlüsselverschlüsselung mit Cipher-Block-Chaining.
  • -md sha512 : Der Message Digest (Hash)-Typ. Wir verwenden den Verschlüsselungsalgorithmus SHA512.
  • -a : Dies weist openssl an, die Base-64-Codierung nach der Verschlüsselungsphase und vor der Entschlüsselungsphase anzuwenden.
  • -pbkdf2 : Die Verwendung von Password-Based Key Derivation Function 2 (PBKDF2) macht es für einen Brute-Force-Angriff viel schwieriger, Ihr Passwort erfolgreich zu erraten. PBKDF2 erfordert viele Berechnungen, um die Verschlüsselung durchzuführen. Ein Angreifer müsste all diese Berechnungen replizieren.
  • -iter 100000 : Legt die Anzahl der Berechnungen fest, die PBKDF2 verwenden wird.
  • -salt : Die Verwendung eines zufällig angewendeten Salt-Werts macht die verschlüsselte Ausgabe jedes Mal anders, selbst wenn der Klartext derselbe ist.
  • -pass pass:'pick.your.password' : Das Passwort, das wir verwenden müssen, um das verschlüsselte Remote-Passwort zu entschlüsseln. Ersetzen pick.your.password durch ein robustes Passwort Ihrer Wahl.

Die verschlüsselte Version unseres rusty!herring.pitshaft Passworts wird in das Terminalfenster geschrieben.

Verschlüsseltes Passwort, das in das Terminalfenster geschrieben wird

Um dies zu entschlüsseln, müssen wir diese verschlüsselte Zeichenfolge mit denselben Parametern, die wir zum Verschlüsseln verwendet haben, an openssl übergeben, aber die Option -d (decrypt) hinzufügen.

 echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password' 

Anzeige

Der String wird entschlüsselt und unser Originaltext – das Passwort für das entfernte Benutzerkonto – wird in das Terminalfenster geschrieben.

Entschlüsseltes Passwort in das Terminalfenster geschrieben

Das beweist, dass wir unser Remote-Benutzerkonto-Passwort sicher verschlüsseln können. Wir können es auch entschlüsseln, wenn wir es brauchen, indem wir das Passwort verwenden, das wir in der Verschlüsselungsphase angegeben haben.

Aber verbessert das tatsächlich unsere Situation? Wenn wir das Verschlüsselungskennwort benötigen, um das Kennwort des Remote-Kontos zu entschlüsseln, muss das Entschlüsselungskennwort sicherlich im Skript enthalten sein? Nun ja, das tut es. Das verschlüsselte Kennwort des Remote-Benutzerkontos wird jedoch in einer anderen, versteckten Datei gespeichert. Die Berechtigungen für die Datei verhindern, dass jemand außer Ihnen – und natürlich dem Root-Benutzer des Systems – darauf zugreifen kann.

Um die Ausgabe des Verschlüsselungsbefehls an eine Datei zu senden, können wir die Umleitung verwenden. Die Datei heißt „.secret_vault.txt“. Wir haben das Verschlüsselungskennwort in ein robusteres geändert.

 echo 'rusty!hering.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt 

Es passiert nichts Sichtbares, aber das Passwort wird verschlüsselt und an die Datei „.secret_vault.txt“ gesendet.

Wir können testen, ob es funktioniert hat, indem wir das Passwort in der versteckten Datei entschlüsseln. Beachten Sie, dass wir hier cat verwenden, nicht echo .

 cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' 

Anzeige

Das Passwort wurde erfolgreich aus den Daten in der Datei entschlüsselt. Wir werden chmod verwenden, um die Berechtigungen für diese Datei zu ändern, sodass niemand sonst darauf zugreifen kann.

 chmod 600 .secret_vault.txt
 ls -l .secret_vault.txt 

Die Verwendung einer Berechtigungsmaske von 600 entfernt jeglichen Zugriff für andere Personen als den Eigentümer der Datei. Wir können jetzt mit dem Schreiben unseres Skripts fortfahren.

VERWANDT: So verwenden Sie den Befehl chmod unter Linux

Verwenden von OpenSSL in einem Skript

Unser Skript ist ziemlich einfach:

 #!/bin/bash

# Name des Remote-Kontos
REMOTE_USER=Geek

# Passwort für das Remote-Konto
REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password')

# entfernter Computer
REMOTE_LINUX=fedora-34.local

# Stellen Sie eine Verbindung zum Remote-Computer her und fügen Sie einen Zeitstempel in eine Datei namens script.log ein
sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands
echo $USER "-" $(date) >> /home/$REMOTE_USER/script.log
_remote_commands
  • Wir setzen eine Variable namens REMOTE_USER auf „Geek“.
  • Dann setzen wir eine Variable namens REMOTE_PASSWD auf den Wert des entschlüsselten Passworts, das aus der Datei „.secret_vault.txt“ gezogen wurde, und verwenden dabei denselben Befehl, den wir gerade verwendet haben.
  • Der Standort des entfernten Computers wird in einer Variablen namens REMOTE_LINUX gespeichert.

Mit diesen Informationen können wir den ssh -Befehl verwenden, um eine Verbindung zum Remote-Computer herzustellen.

  • Der Befehl sshpass ist der erste Befehl in der Verbindungszeile. Wir verwenden es mit der Option -p (Passwort). Damit können wir das Passwort angeben, das an den ssh Befehl gesendet werden soll.
  • Wir verwenden die Option -T (Pseudo-Terminal-Zuweisung deaktivieren) mit ssh , da uns auf dem Remote-Computer kein Pseudo-TTY zugewiesen werden muss.
So verwenden Sie „Hier-Dokumente“ in Bash unter Linux
RELATED How to Use „Here Documents“ in Bash on Linux

Wir verwenden ein kurzes Here-Dokument , um einen Befehl an den Remote-Computer zu übergeben. Alles zwischen den beiden _remote_commands Strings wird als Anweisungen an die Benutzersitzung auf dem Remote-Computer gesendet – in diesem Fall ist es eine einzelne Zeile eines Bash-Skripts.

Der an den Remote-Computer gesendete Befehl protokolliert einfach den Namen des Benutzerkontos und einen Zeitstempel in einer Datei namens „script.log“.

Kopieren Sie das Skript, fügen Sie es in einen Editor ein und speichern Sie es in einer Datei namens „go-remote.sh“. Denken Sie daran, die Details so zu ändern, dass sie die Adresse Ihres eigenen Remote-Computers, das Remote-Benutzerkonto und das Passwort des Remote-Kontos widerspiegeln.

Verwenden Sie chmod , um das Skript ausführbar zu machen.

 chmod +x go-remote.sh 

Anzeige

Es bleibt nur, es auszuprobieren. Starten wir unser Skript.

 ./go-remote.sh 

Da unser Skript eine minimalistische Vorlage für ein unbeaufsichtigtes Skript ist, erfolgt keine Ausgabe an das Terminal. Aber wenn wir die Datei „script.log“ auf dem Fedora-Computer überprüfen, können wir sehen, dass Remote-Verbindungen erfolgreich hergestellt wurden und dass die Datei „script.log“ mit Zeitstempeln aktualisiert wurde.

 cat script.log 

Ihr Passwort ist privat

Das Kennwort Ihres Remote-Kontos wird nicht im Skript aufgezeichnet.

Und obwohl das Entschlüsselungskennwort im Skript enthalten ist , kann niemand sonst auf Ihre Datei „.secret_vault.txt“ zugreifen, um sie zu entschlüsseln und das Kennwort für das Remote-Konto abzurufen.