08.052013

openssl: Passwörter als Parameter vermeiden

Passwörter als Kommandozeilenparameter sind immer ein potentielles Sicherheitsleck, da sie in der Ausgabe von ps, top, htop, etc. für alle Nutzer eines Systems zu sehen sind.

openssl erlaubt die Angabe eines Dateideskriptors als Passwortquelle, in Kombination mit einem FIFO und bash-I/O-Umleitung können wir programmatisch das Erscheinen des Passwortes in den Systeminformationen vermeiden.

  • Einen FIFO erzeugen
    mkfifo fifoname
  • Den Dateideskriptor 9 auf den FIFO umleiten
    exec 9<>fifoname
  • Das Passwort in den FIFO schreiben
    echo $pass >&9
  • openssl aus dem Dateideskriptor 9 das Passwort lesen lassen mit dem Parameter
    -pass "fd:9"
  • Aufräumen, d.h. den Dateideskriptor 9 wieder freigeben, den FIFO entfernen
    exec 9&-
    rm $PWD/fifoname
         

Zusammenfassen können wir das in zwei Funktionen zum Ver- und Entschlüsseln von übergebenen Daten:

openssl_encrypt() {
    localpass="$1"localtext="$2"localfifo="$(rand_str 10 true)"
    /usr/bin/mkfifo $PWD/$fifoexec 9<>$PWD/$fifoecho $pass >&9
    echo"$text" | openssl bf -e -a -salt -pass "fd:9"status=$?exec 9<&-
    exec 9>&-
    rm $PWD/$fiforeturn $status
}
openssl_decrypt() {
    localpass="$1"localtext="$2"localfifo="$(rand_str 10 true)"
    /usr/bin/mkfifo $PWD/$fifoexec 9<>"$PWD/$fifo"echo $pass >&9
    echo"$text" | openssl bf -d -a -salt -pass "fd:9"status=$?exec 9<&-
    exec 9>&-
    rm $PWD/$fiforeturn $status
}

Die rand_str Funktion stammt aus der Shell-Bibliothek von Chris F.A. Johnson:

rand_str() {
    locallength=$1localascii=$2localresult=""
    [ -z "$ascii" ] && ascii=true
    localrange=94
    localoffset=32
    if [ "$ascii" == "true" ]; thenrange=61
        offset=65
    fifor i in $(seq 1 1 $length); doresult+="$(printf "%03d" "$(dec2oct $(($RANDOM % $range + $offset)))")"doneecho -e "$result"
}

dec2oct() {
    localquotient=$1localremainder=
    localoctal=
    while [ $quotient -ne 0 ]
    doremainder=$(( $quotient % 8 ))
        octal="$remainder$octal"quotient=$(( $quotient / 8 ))
    doneecho $octal
}