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.
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
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 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.
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.