Passwörter aus Variable an Befehl übergeben

Alles rund um sicherheitsrelevante Fragen und Probleme.
Antworten
katze123
Beiträge: 88
Registriert: 10.06.2016 20:05:47

Passwörter aus Variable an Befehl übergeben

Beitrag von katze123 » 01.06.2017 22:14:38

Ich habe ein Shellscript, das 8 Passwörter abfragt, allerdings ist es immer dasselbe. Deshalb würde ich gerne das Passwort am Anfang des Skriptes mittels read abfragen, in einer Variablen speichern und dann an alle 8 Befehle übergeben. Es geht hierbei um die Befehle ssh, sshfs und encfs. Ist das möglich, und wenn ja, wie geh ich dabei vor?

(Falls jemand nun einen Kommentar schreiben möchte, nur um zu sagen, wie unsicher mein Vorgehen doch ist: Es handelt sich hierbei um einen Server, der lediglich über das lokale Netzwerk erreichbar ist. Die Daten des Servers sind identisch mit den Daten des Clients, somit würde ein Aussphähen des Passworts auf dem Client dem Angreifer keinen Mehrwert bieten.)

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Passwörter aus Variable an Befehl übergeben

Beitrag von breakthewall » 01.06.2017 23:02:52

Es ist durchaus sehr ratsam das so abzuändern, anstatt dasselbe wieder und wieder einzutippen.

Ein Beispiel könnte sein:

Code: Alles auswählen

read -e -r -p "Bitte geben Sie ihr Passwort ein: " INPUT
Somit wäre das Passwort jeweils in $INPUT und könnte entsprechend weiterverarbeitet werden.

Allerdings ist das nur eine primitive Abfrage, und sollte für mehr Robustheit erweitert werden.

Das könnte folgendermaßen aussehen:

Code: Alles auswählen

while true
        do
        # Übergibt die Eingabe an die Variable INPUT, und missbilligt durch die Shell interpretierte Zeichen
        read -e -r -p "Bitte geben Sie ihr Passwort ein: " INPUT
        # Erwartet mindestens eine Eingabe, die nicht leer sein darf
        [[ -z "$INPUT ]] || { echo "Leere Eingabe"; continue; }
        # Erwartet ein exakt 10 stelliges Passwort, welches aus Zahlen, Groß -und Kleinbuchstaben bestehen muss
        [[ "$INPUT" =~ ^[[:alnum:]]{10}$ ]] || { echo "Falsches Passwortformat"; continue; }
        # Bei Erfolg wird die Schleife verlassen und der Rest des Shellscriptes wird abgearbeitet
        break
done
Hier mit Test-Bedingungen zu arbeiten hat den Vorteil, dass man den jeweiligen Programmen nicht irgendetwas via Variable übergibt, was so ggf. nicht erwartet wird und zu Fehlern führen würde.

katze123
Beiträge: 88
Registriert: 10.06.2016 20:05:47

Re: Passwörter aus Variable an Befehl übergeben

Beitrag von katze123 » 01.06.2017 23:27:59

Wie der read-Befehl funktioniert, weiß ich selbst. Ich weiß nur nicht, wie ich die $INPUT-Variable dann an ssh, sshfs oder encfs weitergebe.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Passwörter aus Variable an Befehl übergeben

Beitrag von Meillo » 01.06.2017 23:33:39

katze123 hat geschrieben:Ich weiß nur nicht, wie ich die $INPUT-Variable dann an ssh, sshfs oder encfs weitergebe.
Du solltest es jedenfalls nicht als Kommandozeilenparameter oder Environmentvariable tun, weil man das bequem per ps(1) angucken kann.
Use ed once in a while!

katze123
Beiträge: 88
Registriert: 10.06.2016 20:05:47

Re: Passwörter aus Variable an Befehl übergeben

Beitrag von katze123 » 01.06.2017 23:43:42

Meillo hat geschrieben:
katze123 hat geschrieben:Ich weiß nur nicht, wie ich die $INPUT-Variable dann an ssh, sshfs oder encfs weitergebe.
Du solltest es jedenfalls nicht als Kommandozeilenparameter oder Environmentvariable tun, weil man das bequem per ps(1) angucken kann.
Ich bin der einzige User auf dem Client, sodass es niemand außer mir angucken kann. Ich bitte um konstruktive Antworten, weitere Sicherheitstipps werden von mir dickköpfig ignoriert. :wink:

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Passwörter aus Variable an Befehl übergeben

Beitrag von Meillo » 01.06.2017 23:47:11

katze123 hat geschrieben:
Meillo hat geschrieben:
katze123 hat geschrieben:Ich weiß nur nicht, wie ich die $INPUT-Variable dann an ssh, sshfs oder encfs weitergebe.
Du solltest es jedenfalls nicht als Kommandozeilenparameter oder Environmentvariable tun, weil man das bequem per ps(1) angucken kann.
Ich bin der einzige User auf dem Client, sodass es niemand außer mir angucken kann. Ich bitte um konstruktive Antworten, weitere Sicherheitstipps werden von mir dickköpfig ignoriert. :wink:
Damit bin ich raus ... ;-)
Use ed once in a while!

DeletedUserReAsG

Re: Passwörter aus Variable an Befehl übergeben

Beitrag von DeletedUserReAsG » 02.06.2017 05:57:58

Für den Job bietet sich Debianexpect an.

OT: jammere halt nicht rum, wenn du auf einmal nicht mehr der einzige User auf dem System bist, weil relevante PW ausgeleitet wurden.

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Passwörter aus Variable an Befehl übergeben

Beitrag von uname » 02.06.2017 07:49:46

Anstatt eines Passwortes würde ich einen SSH-Key verwenden. Ist sicherer und du spartst dir die unnötige Passworteingabe.

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Passwörter aus Variable an Befehl übergeben

Beitrag von breakthewall » 02.06.2017 17:12:50

katze123 hat geschrieben:Wie der read-Befehl funktioniert, weiß ich selbst. Ich weiß nur nicht, wie ich die $INPUT-Variable dann an ssh, sshfs oder encfs weitergebe.
Ich sehe das Problem. Hatte vergessen dass das via ssh nicht mehr so einfach ist, und selbst nutze Ich ohnehin nur noch Public-Keys. Die wirklich einfachste Option wäre dann wohl sshpass, was noch herunterladen müsstest.

Und dann könnte das so aussehen:

Code: Alles auswählen

sshpass -f <(echo "$INPUT") ssh user@host
Und so wie die anderen schon richtig erläutert haben, würde normalerweise das Passwort via ps, top oder /proc/PID/cmdline zu sehen sein. Doch mit einem Trick via Anonymous Pipe (hier als <(echo "$INPUT") dargestellt), ist genau das nicht mehr der Fall. Denn einmal wird sshpass durch den Parameter -f angewiesen, dass Passwort von einer Datei zu beziehen. Und der Output innerhalb der Anonymous Pipe, wird in einen File Descriptor umgewandelt (meistens /dev/fd/63), was wiederum ein RAM basierender und temporärer Speicherort ist, der genau jenen Inhalt also das Passwort enthält. Nur sshpass kann von diesem File Descriptor lesen, und dieser existiert nur so lange wie sshpass existiert.

Auf der Kommandozeile wird also immer nur das zu sehen sein:

Code: Alles auswählen

sshpass -f /dev/fd/63 ssh user@host
Mit sshfs habe Ich bislang noch nicht gearbeitet, aber wenn eine entsprechende Kommandozeile hast, lässt sich auch dafür eine Lösung finden. Vom Einsatz von encfs ist abzuraten aufgrund von Unsicherheiten, wo Ich deutlich zu eCryptfs oder dm-crypt/LUKS raten würde.

Antworten