Ich schreibe ein bash
Skript und muss den Benutzer nach seinem Passwort fragen und es an weitergeben openssl
. Während openssl
ich das Passwort selbst lesen kann, benötige ich für zwei Programmläufe und möchte den Benutzer nicht zweimal fragen. Hier ist das Skript:
cp file{,.old}
read -sp 'Enter password. ' PASS; echo
export PASS
# decode | edit | encode
openssl enc -d -aes-256-cbc -k "$PASS" -in file.old | \
sed ... | openssl enc -e -aes-256-cbc -k "$PASS" -out file
unset PASS
Dies ist nicht sicher, da das Kennwort in der Befehlszeile leicht verfügbar ist. jemand kann es ps
zum Beispiel lesen .
openssl
lesen kann ein Passwort aus einer Umgebungsvariablen, so dass ich ersetzen kann -k "$PASS"
mit -pass env:PASS
, aber es ist noch nicht sicher; Die Umgebungsvariablen jedes Prozesses können frei gelesen werden ( ps
können es wieder tun).
Wie kann ich das Kennwort sicher an die beiden openssl
Instanzen übergeben?
bash
command-line
password
openssl
Chris Down
quelle
quelle
ps
Liest die Umgebung eines Prozesses aus/proc/<pid>/environ
, diese Datei verfügt jedoch über0600
Berechtigungen, sodass nur Root und der Benutzer, der den Prozess ausführt, die Umgebung des Prozesses lesen können. Ich würde sagen, das ist ziemlich sicher.Antworten:
Übergeben Sie das Kennwort in einem von der Eingabe getrennten Dateideskriptor (zweimal, einmal zur Verschlüsselung und einmal zur Entschlüsselung). Nicht
PASS
in die Umwelt exportieren .Wenn Ihr System nicht über Folgendes verfügt
/dev/fd
, können Sie mit dem-pass
Argument angebenopenssl
, dass die Passphrase aus einem geöffneten Dateideskriptor gelesen werden soll.quelle
bash
Version mit auchenv:PASS
sicher.printf '%s\n' "$PASS"
ist nicht sicher. Jemand kannps
zum Beispiel die Kommandozeile lesen .env:PASS
ist nicht sicher, da das Kennwort in der Umgebung desopenssl
Prozesses angezeigt würde (es würde nicht in der Umgebung desbash
Prozesses angezeigt, aber das ist nicht genug). Verwendenprintf
ist sicher, weil es eine eingebaute Bash ist.echo $PASS | openssl ...
. Es würde nicht in der ps-Liste erscheinen. Der einzige Ort, den Sie passieren können, ist der Bash-Prozess-Speicher. Ich glaube ?echo
wäre aus dem gleichen Grundprintf
sicher, ist sicher (undprintf
wäre nicht sicher in einer Shell, in der es nicht eingebaut ist). Der Grund, den ich benutzeprintf
und nicht,echo
ist, dassecho
Backslashes (abhängig von den Bash-Optionen) beschädigt werden können.Bei der Verwendung von Bash kann auf die Verwendung verzichtet werden,
printf '%s\n' "$PASS"
indem den Dateideskriptoren mithilfe des integriertenexec
Befehls Bash ein sogenannter Here-String zugeordnet wird .Weitere Informationen finden Sie unter: Sicherheit von Shell-Skriptkennwörtern für Befehlszeilenparameter .
quelle
Entschuldigung, meine vorherige Antwort stammte von openssl man, nicht von openssl enc docs.
Diese Lösung ist keine Pipeline, aber ich glaube, diese Lösung verhindert, dass das Passwort für ps sichtbar wird.
Bei Verwendung eines Here-Dokuments sieht nur openssl den Text des Passworts.
Solange Sie sicher sind, dass Sie die Zwischendatei entfernen, bleibt keine Spur zurück. Vielleicht kann jemand helfen, dies in einer Pipeline zu tun und die Zwischendatei zu beseitigen?
quelle
enc
Befehl keinen-kn
Schalter hat, zumindest in den aktuellen Versionen-pass
), aber nicht sehr informativ. (Die Gegenstimme ist nicht meine.)