Tips en Trucs 2015

Bash Password Manager

Wachtwoordbeheerders kennen we allemaal. Je gebruikt één wachtwoord om toegang te krijgen tot al uw gebruikte wachtwoorden. Deze manier van werken is ingeburgerd in de grafische gebruikersomgevingen, browsers maar hoe gebruik je versleutelde wachtwoorden in een bash script.

Het root wachtwoord als hoofdwachtwoord

Veel van mijn scripts gebruiken opdrachten die root rechten nodig hebben. Dus lijkt het me logisch dat ik het root wachtwoord ga gebruiken als sleutel voor het encrypteren van de andere wachtwoorden. Daarenboven verander ik regelmatig het root wachtwoord van mijn systeem.

Met het volgende script kan je het root wachtwoord ingeven en controleren of het geldig is:

read -p "Wachtwoord: " -s Wachtwoord
echo
beheerder=`echo $Wachtwoord | su - -c 'echo $USER'`
if [ "$beheerder" != 'root' ] ; then 
  echo "Script onderbroken wegens foutief wachtwoord."
  exit
fi

Met het zo verkregen root wachtwoord kan je root opdrachten uitvoeren. Een voorbeeld:

dany@linux-u6r3:~> echo $Wachtwoord | su - -c 'echo -e "\nOpdracht uitgevoerd als gebruiker $USER"'
Wachtwoord:
Opdracht uitgevoerd als gebruiker root

Een wachtwoord versleutelen

Om een wachtwoord in een script te gebruiken, gaan we het met het root wachtwoord versleutelen. Daarvoor gebruiken we het op elk linux systeem aanwezige openssl pakket. Om het wachtwoord voor openssl toegankelijk te maken, exporteren we het wachtwoord met de opdracht:

export Wachtwoord

En maken we een versleuteld wachtwoord aan met de opdracht:

dany@linux-u6r3:~> echo 'TestHetWachtwoord' | openssl enc -base64 -e -aes-256-cbc -nosalt -pass env:Wachtwoord
TRwAclBiS3lJQPXrgyNiwV9EoX7guoQYtOte3Mpqo5w=

Het hier gebruikte wachtwoord (TestHetWachtwoord) wordt zo versleuteld tot de tekenreeks TRwAclBiS3lJQPXrgyNiwV9EoX7guoQYtOte3Mpqo5w=. Deze tekenreeks kunnen we nu in een script opnemen en het onversleutelde wachtwoord terug afleiden met het geëxporteerde wachtwoord.

FTPWachtwoord=$(echo "TRwAclBiS3lJQPXrgyNiwV9EoX7guoQYtOte3Mpqo5w=" | openssl enc -base64 -d -aes-256-cbc -nosalt -pass env:Wachtwoord)

Het ontsleutelde wachtwoord kan je gebruiken in verschillende opdrachten, zoals het maken van een backup van een website:

wget --output-file=/tmp/rsync.log --no-host-directories --cut-dirs=1 --directory-prefix=/home/dany/Documents/Homepage/test/ --mirror ftp://domein.be:$FTPWachtwoord@ftp.domein.be/test/gegevens/

Het script

Het volgende minimale script kan dienst doen als kader voor uw eigen projecten:

#!/bin/bash
read -p "Root Wachtwoord: " -s Wachtwoord
beheerder=`echo $Wachtwoord | su - -c 'echo $USER'`
if [ "$beheerder" != 'root' ] ; then
  echo "Script onderbroken wegens foutief root wachtwoord.";
  exit;
fi

export Wachtwoord
FTPWachtwoord=$(echo "TRwAclBiS3lJQPXrgyNiwV9EoX7guoQYtOte3Mpqo5w=" | openssl enc -base64 -d -aes-256-cbc -nosalt -pass env:Wachtwoord)

echo -e "\n$FTPWachtwoord"

De werking van dit script bij het ingeven van een foutief root wachtwoord en correct root wachtwoord zie je op onderstaande afbeelding.

Bash Password Manager

Veiligheid

Het gebruik van wachtwoorden en dergelijke meer heeft als veiligheidrisico steeds dat deze op de één of andere manier steeds achterhaald kunnen worden. Dit script is echter een hele verbetering. De wachtwoorden worden niet leesbaar in het script opgeslagen. Het wachtwoord om de versleutelde wachtwoorden te ontcijferen worden enkel via het toetsenbord ingegeven. Ze zijn dus niet via de geschiedenis van bash in het bestand ~/.bash_history te achterhalen. Uiteindelijk wordt het ontcijferde wachtwoord, evenals het hoofdwachtwoord in een variabele in het geheugen opgeslagen. Met andere woorden via het uitlezen van het computergeheugen kunnen de wachtwoorden achterhaald worden.