Wenn Sie gezwungen sind, ein Linux-Skript zu verwenden, um eine Verbindung zu einer passwortgeschützten Ressource herzustellen, fühlen Sie sich wahrscheinlich unwohl, dieses Passwort in das Skript einzugeben. OpenSSL löst dieses Problem für Sie.
Passwörter und Skripte
Es ist keine gute Idee, Passwörter in Shell-Skripte zu schreiben. Tatsächlich ist es eine wirklich schlechte Idee. Wenn das Skript in die falschen Hände gerät, kann jeder, der es liest, das Passwort sehen. Aber was können Sie sonst noch tun, wenn Sie gezwungen sind, ein Skript zu verwenden?
Sie können das Kennwort manuell eingeben, wenn der Prozess diesen Punkt erreicht, aber wenn das Skript unbeaufsichtigt ausgeführt wird, funktioniert das nicht. Zum Glück gibt es eine Alternative zum Hartcodieren der Passwörter in das Skript. Kontraintuitiv verwendet es ein anderes Passwort, um dies zusammen mit einer starken Verschlüsselung zu erreichen.
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 nicht das Kennwort für das Remote-Konto in das Skript einfügen. Wir können in diesem Fall keine SSH-Schlüssel verwenden, da wir so tun, als hätten wir keine Kontrolle oder keine Administratorrechte über den Fedora-Computer.
Wir nutzen das bekannte OpenSSL-Toolkit um die Verschlüsselung zu handhaben und ein Dienstprogramm namens sshpass
um das Passwort in den SSH-Befehl einzugeben.
VERBUNDEN: So erstellen und installieren Sie SSH-Schlüssel aus der Linux-Shell
OpenSSL und sshpass installieren
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 get openssl
Installieren sshpass
, verwenden Sie diesen Befehl:
sudo apt install sshpass
Auf Fedora müssen Sie Folgendes eingeben:
sudo dnf install openssl
Der Befehl zum Installieren sshpass
ist:
sudo dnf install sshpass
Unter Manjaro Linux können wir OpenSSL installieren mit:
sudo pacman -Sy openssl
Endlich installieren sshpass
, verwenden Sie diesen Befehl:
sudo pacman -Sy sshpass
Verschlüsselung auf der Kommandozeile
Bevor wir mit der Verwendung beginnen openssl
Befehl mit Skripten, machen wir uns damit vertraut, indem wir ihn in der Befehlszeile verwenden. Nehmen wir an, das Passwort für das Konto auf dem Remote-Computer lautet rusty!herring.pitshaft
. Wir werden dieses Passwort verschlüsseln mit openssl
.
Wir müssen ein Verschlüsselungspasswort angeben, wenn wir dies tun. Das Verschlüsselungskennwort wird in den Verschlüsselungs- und Entschlüsselungsprozessen verwendet. Es gibt viele Parameter und Optionen in der openssl
Befehl. Wir werden uns jeden von ihnen gleich ansehen.
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'
Wir verwenden echo
um das Kennwort des Remote-Kontos über eine Pipe und in die openssl
Befehl.
Das openssl
Parameter sind:
- enc -aes-256-cbc: Der Codierungstyp. Wir verwenden die Advanced Encryption Standard 256-Bit-Schlüsselchiffre mit Cipher-Block-Chaining.
- -md sha512: Der Nachrichten-Digest (Hash)-Typ. Wir verwenden den kryptografischen Algorithmus SHA512.
- -ein: Das sagt
openssl
um eine 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 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 verwendet.
- -Salz: Die Verwendung eines zufällig angewendeten Salt-Werts macht die verschlüsselte Ausgabe jedes Mal anders, selbst wenn der Klartext gleich ist.
- -pass pass:’wähle.dein.passwort‘: Das Passwort, das wir verwenden müssen, um das verschlüsselte Remote-Passwort zu entschlüsseln. Ersatz
pick.your.password
mit einem robusten Passwort Ihrer Wahl.
Die verschlüsselte Version unseres rusty!herring.pitshaft
Passwort wird in das Terminalfenster geschrieben.
Um dies zu entschlüsseln, müssen wir diese verschlüsselte Zeichenfolge an pass übergeben openssl
mit den gleichen Parametern, die wir zum Verschlüsseln verwendet haben, aber das Hinzufügen von -d
(entschlüsseln) Option.
echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'
Die Zeichenfolge wird entschlüsselt und unser Originaltext – das Passwort für das Remote-Benutzerkonto – wird in das Terminalfenster geschrieben.
Das beweist, dass wir unser Passwort für das Remote-Benutzerkonto sicher verschlüsseln können. Wir können es auch entschlüsseln, wenn wir es benötigen, indem wir das Passwort verwenden, das wir in der Verschlüsselungsphase bereitgestellt haben.
Aber verbessert das tatsächlich unsere Situation? Wenn wir das Verschlüsselungskennwort zum Entschlüsseln des Remote-Kontokennworts benötigen, muss das Entschlüsselungskennwort dann doch im Skript enthalten sein? Nun ja, das tut es. Das verschlüsselte Kennwort für das Remote-Benutzerkonto wird jedoch in einer anderen, versteckten Datei gespeichert. Die Berechtigungen für die Datei verhindern, dass jemand außer Ihnen – und natürlich der 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 etwas Robusteres geändert.
echo 'rusty!herring.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 verwenden cat
nicht hier echo
.
cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password'
Das Kennwort wurde erfolgreich aus den Daten in der Datei entschlüsselt. Wir werden verwenden chmod
um die Berechtigungen für diese Datei zu ändern, damit 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 als den Dateibesitzer. Wir können jetzt mit dem Schreiben unseres Drehbuchs fortfahren.
VERBUNDEN: So verwenden Sie den chmod-Befehl unter Linux
Verwenden von OpenSSL in einem Skript
Unser Skript ist ziemlich einfach:
#!/bin/bash # name of the remote account REMOTE_USER=geek # password for the remote account REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password') # remote computer REMOTE_LINUX=fedora-34.local # connect to the remote computer and put a timestamp in a file called script.log 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
zu „Geek“. - Wir setzen dann eine Variable namens
REMOTE_PASSWD
auf den Wert des entschlüsselten Passworts, das aus der Datei „.secret_vault.txt“ gezogen wurde, mit dem gleichen Befehl wie vorhin. - Der Standort des entfernten Computers wird in einer Variablen namens . gespeichert
REMOTE_LINUX
.
Mit diesen Informationen können wir die ssh
Befehl, um eine Verbindung zum Remote-Computer herzustellen.
- Das
sshpass
Befehl ist der erste Befehl in der Verbindungszeile. Wir verwenden es mit dem-p
(Passwort)-Option. Damit können wir das Passwort angeben, das an die to gesendet werden sollssh
Befehl. - Wir benutzen das
-T
(Pseudo-Terminal-Zuweisung deaktivieren) Option mitssh
weil uns auf dem Remote-Computer kein Pseudo-TTY zugewiesen werden muss.
Wir verwenden eine kurze hier 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 handelt es sich um eine einzelne Zeile Bash-Skript.
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 Remote-Kontokennwort widerspiegeln.
Benutzen chmod
um das Skript ausführbar zu machen.
chmod +x go-remote.sh
Es bleibt nur das Ausprobieren. 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. Wenn wir jedoch 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üsselungspasswort ist, im Skript kann niemand sonst auf Ihre Datei „.secret_vault.txt“ zugreifen, um sie zu entschlüsseln und das Passwort des Remote-Kontos abzurufen.