Gecodeerde wachtwoorden gebruiken in Bash-scripts

Een Linux-laptop in Ubuntu-stijl.
fatmawati achmad zaenuri/Shutterstock.com

Als je gedwongen bent om een ​​Linux-script te gebruiken om verbinding te maken met een met een wachtwoord beveiligde bron, voel je je waarschijnlijk ongemakkelijk om dat wachtwoord in het script te zetten. OpenSSL lost dat probleem voor u op.

Wachtwoorden en scripts

Het is geen goed idee om wachtwoorden in shellscripts te plaatsen. Eigenlijk is het een heel slecht idee. Als het script in verkeerde handen valt, kan iedereen die het leest zien wat het wachtwoord is. Maar als u gedwongen wordt een script te gebruiken, wat kunt u dan nog meer doen?

U kunt het wachtwoord handmatig invoeren wanneer het proces dat punt bereikt, maar als het script zonder toezicht wordt uitgevoerd, werkt dat niet. Gelukkig is er een alternatief voor het hard coderen van de wachtwoorden in het script. Contra-intuïtief gebruikt het een ander wachtwoord om dit te bereiken, samen met een sterke codering.

In ons voorbeeldscenario moeten we een externe verbinding maken met een Fedora Linux-computer vanaf onze Ubuntu-computer. We zullen een Bash-shellscript gebruiken om een ​​SSH-verbinding met de Fedora-computer te maken. Het script moet zonder toezicht worden uitgevoerd en we willen het wachtwoord voor het externe account niet in het script plaatsen. We kunnen in dit geval geen SSH-sleutels gebruiken, omdat we doen alsof we geen controle of beheerdersrechten hebben over de Fedora-computer.

We gaan gebruik maken van de bekende OpenSSL-toolkit om de codering af te handelen en een hulpprogramma genaamd sshpass om het wachtwoord in de SSH-opdracht in te voeren.

VERWANT: SSH-sleutels maken en installeren vanuit de Linux-shell

OpenSSL en sshpass installeren

Omdat veel andere coderings- en beveiligingstools OpenSSL gebruiken, is het mogelijk al op uw computer geïnstalleerd. Als dit echter niet het geval is, duurt het maar even om te installeren.

Typ op Ubuntu deze opdracht:

sudo apt get openssl

Installeren sshpass, gebruik dit commando:

sudo apt install sshpass

Op Fedora moet je typen:

sudo dnf install openssl

De opdracht om te installeren sshpass is:

sudo dnf install sshpass

Op Manjaro Linux kunnen we OpenSSL installeren met:

sudo pacman -Sy openssl

Eindelijk, om te installeren sshpass, gebruik dit commando:

sudo pacman -Sy sshpass

Coderen op de opdrachtregel

Voordat we beginnen met het gebruik van de openssl commando met scripts, laten we er vertrouwd mee raken door het op de opdrachtregel te gebruiken. Laten we zeggen dat het wachtwoord voor het account op de externe computer is: rusty!herring.pitshaft. We gaan dat wachtwoord versleutelen met openssl.

We moeten een coderingswachtwoord opgeven wanneer we dat doen. Het coderingswachtwoord wordt gebruikt in de coderings- en decoderingsprocessen. Er zijn veel parameters en opties in de openssl opdracht. We zullen ze allemaal zo bekijken.

echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'

We gebruiken echo om het wachtwoord van de externe account door een pijp te sturen en naar de openssl opdracht.

De openssl parameters zijn:

  • enc -aes-256-cbc: Het coderingstype. We gebruiken de Advanced Encryption Standard 256-bit key cipher met cipher-block chaining.
  • -md sha512: Het type berichtsamenvatting (hash). We gebruiken het SHA512 cryptografische algoritme.
  • -een: Dit vertelt openssl om base-64-codering toe te passen na de coderingsfase en vóór de decoderingsfase.
  • -pbkdf2: Het gebruik van op wachtwoord gebaseerde sleutelafleidingsfunctie 2 (PBKDF2) maakt het veel moeilijker voor een brute force-aanval om uw wachtwoord te raden. PBKDF2 vereist veel berekeningen om de codering uit te voeren. Een aanvaller zou al die berekeningen moeten repliceren.
  • -iter 100000: Stelt het aantal berekeningen in dat PBKDF2 zal gebruiken.
  • -zout: Door een willekeurig toegepaste salt-waarde te gebruiken, wordt de versleutelde uitvoer elke keer anders, zelfs als de platte tekst hetzelfde is.
  • -pas pas:’kies.uw.wachtwoord’: Het wachtwoord dat we moeten gebruiken om het versleutelde externe wachtwoord te ontsleutelen. Plaatsvervanger pick.your.password met een robuust wachtwoord naar keuze.

De versleutelde versie van onze rusty!herring.pitshaft wachtwoord wordt naar het terminalvenster geschreven.

Versleuteld wachtwoord geschreven naar het terminalvenster

Om dit te ontsleutelen, moeten we die versleutelde string doorgeven aan: openssl met dezelfde parameters die we gebruikten om te coderen, maar met toevoeging van de -d (decoderen) optie.

echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'

Advertentie

De string wordt gedecodeerd en onze originele tekst – het wachtwoord voor het externe gebruikersaccount – wordt naar het terminalvenster geschreven.

Gedecodeerd wachtwoord geschreven naar het terminalvenster

Dat bewijst dat we het wachtwoord van ons externe gebruikersaccount veilig kunnen versleutelen. We kunnen het ook decoderen wanneer we het nodig hebben met behulp van het wachtwoord dat we in de coderingsfase hebben verstrekt.

Maar verbetert dit onze situatie eigenlijk? Als we het coderingswachtwoord nodig hebben om het externe accountwachtwoord te decoderen, moet het decoderingswachtwoord toch in het script staan? Nou ja, dat doet het wel. Maar het wachtwoord van het gecodeerde externe gebruikersaccount wordt opgeslagen in een ander, verborgen bestand. De machtigingen voor het bestand zullen voorkomen dat iedereen behalve u – en uiteraard de rootgebruiker van het systeem – er toegang toe heeft.

Om de uitvoer van het versleutelingscommando naar een bestand te sturen, kunnen we omleiding gebruiken. Het bestand heet “.secret_vault.txt.” We hebben het coderingswachtwoord gewijzigd in iets robuuster.

echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt

Er gebeurt niets zichtbaars, maar het wachtwoord wordt gecodeerd en verzonden naar het bestand “.secret_vault.txt”.

We kunnen testen of het werkte door het wachtwoord in het verborgen bestand te decoderen. Merk op dat we gebruiken cat hier niet echo.

cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password'

Advertentie

Het wachtwoord is met succes ontsleuteld uit de gegevens in het bestand. We gebruiken chmod om de machtigingen voor dit bestand te wijzigen, zodat niemand anders er toegang toe heeft.

chmod 600 .secret_vault.txt
ls -l .secret_vault.txt

Als u een machtigingenmasker van 600 gebruikt, wordt alle toegang voor iemand anders dan de bestandseigenaar verwijderd. We kunnen nu verder met het schrijven van ons script.

VERWANT: Hoe de chmod-opdracht op Linux te gebruiken

OpenSSL gebruiken in een script

Ons script is vrij eenvoudig:

#!/bin/bash

# name of the remote account
REMOTE_USER=geek

# password for the remote account
REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password')

# remote computer
REMOTE_LINUX=fedora-34.local

# connect to the remote computer and put a timestamp in a file called script.log
sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands
echo $USER "-" $(date) >> /home/$REMOTE_USER/script.log
_remote_commands
  • We stellen een variabele in met de naam REMOTE_USER naar “nerd”.
  • We stellen dan een variabele in met de naam REMOTE_PASSWD naar de waarde van het gedecodeerde wachtwoord dat uit het bestand “.secret_vault.txt” is gehaald, met dezelfde opdracht die we zojuist hebben gebruikt.
  • De locatie van de externe computer wordt opgeslagen in een variabele met de naam REMOTE_LINUX.

Met die informatie kunnen we de ssh opdracht om verbinding te maken met de externe computer.

  • De sshpass commando is het eerste commando op de verbindingslijn. We gebruiken het met de -p (wachtwoord) optie. Hiermee kunnen we het wachtwoord specificeren dat moet worden verzonden naar de ssh opdracht.
  • Wij gebruiken de -T (uitschakelen pseudo-terminaltoewijzing) optie met ssh omdat er geen pseudo-TTY aan ons is toegewezen op de externe computer.
Hoe "Here Documents" te gebruiken in Bash op Linux

VERWANTHoe “Here Documents” te gebruiken in Bash op Linux

We gebruiken een korte hier document om een ​​opdracht door te geven aan de externe computer. Alles tussen de twee _remote_commands strings wordt als instructies naar de gebruikerssessie op de externe computer verzonden – in dit geval is het een enkele regel Bash-script.

De opdracht die naar de externe computer wordt verzonden, registreert eenvoudig de naam van de gebruikersaccount en een tijdstempel in een bestand met de naam ‘script.log’.

Kopieer en plak het script in een editor en sla het op in een bestand met de naam “go-remote.sh”. Vergeet niet om de details te wijzigen om het adres van uw eigen externe computer, externe gebruikersaccount en externe accountwachtwoord weer te geven.

Gebruik chmod om het script uitvoerbaar te maken.

chmod +x go-remote.sh

Advertentie

Het enige dat overblijft is om het uit te proberen. Laten we ons script opstarten.

./go-remote.sh

Omdat ons script een minimalistische sjabloon is voor een onbeheerd script, is er geen uitvoer naar de terminal. Maar als we het bestand “script.log” op de Fedora-computer controleren, kunnen we zien dat externe verbindingen met succes zijn gemaakt en dat het bestand “script.log” is bijgewerkt met tijdstempels.

cat script.log

Uw wachtwoord is privé

Het wachtwoord van uw externe account is niet opgenomen in het script.

En hoewel het decoderingswachtwoord is, in het script heeft niemand anders toegang tot uw “.secret_vault.txt”-bestand om het te decoderen en het externe accountwachtwoord op te halen.

Nieuwste artikelen

Gerelateerde artikelen