Cum să utilizați parolele criptate în scripturile Bash

Publicat: 2022-01-29
Un laptop Linux în stil Ubuntu.
fatmawati achmad zaenuri/Shutterstock.com

Dacă sunteți forțat să utilizați un script Linux pentru a vă conecta la o resursă protejată prin parolă, probabil că vă simțiți neliniștit să introduceți acea parolă în script. OpenSSL rezolvă această problemă pentru tine.

Parole și Scripturi

Nu este o idee grozavă să puneți parole în scripturi shell. De fapt, este o idee foarte proastă. Dacă scriptul cade în mâini greșite, toți cei care îl citesc pot vedea care este parola. Dar dacă ești forțat să folosești un script, ce altceva poți face?

Puteți introduce parola manual când procesul ajunge la acel punct, dar dacă scriptul va rula nesupravegheat, nu va funcționa. Din fericire, există o alternativă la codificarea tare a parolelor în script. În mod contraintuitiv, folosește o parolă diferită pentru a realiza acest lucru, împreună cu o criptare puternică.

În scenariul nostru exemplu, trebuie să facem o conexiune de la distanță la un computer Fedora Linux de pe computerul nostru Ubuntu. Vom folosi un script shell Bash pentru a realiza o conexiune SSH la computerul Fedora. Scriptul trebuie să ruleze nesupravegheat și nu dorim să punem parola pentru contul de la distanță în script. Nu putem folosi cheile SSH în acest caz, deoarece ne prefacem că nu avem niciun control sau drepturi de administrare asupra computerului Fedora.

Vom folosi binecunoscutul set de instrumente OpenSSL pentru a gestiona criptarea și un utilitar numit sshpass pentru a introduce parola în comanda SSH.

LEGATE: Cum se creează și se instalează chei SSH din Shell Linux

Instalarea OpenSSL și sshpass

Deoarece multe alte instrumente de criptare și securitate folosesc OpenSSL, este posibil ca acesta să fie deja instalat pe computer. Cu toate acestea, dacă nu este, instalarea durează doar un moment.

Pe Ubuntu, tastați această comandă:

 sudo apt get openssl 

Pentru a instala sshpass , utilizați această comandă:

 sudo apt install sshpass 

Pe Fedora, trebuie să tastați:

 sudo dnf install openssl 

Comanda de instalare a sshpass este:

 sudo dnf install sshpass 

Pe Manjaro Linux, putem instala OpenSSL cu:

 sudo pacman -Sy openssl 

În cele din urmă, pentru a instala sshpass , utilizați această comandă:

 sudo pacman -Sy sshpass 

Criptare pe linia de comandă

Înainte de a începe să folosim comanda openssl cu scripturi, să ne familiarizăm cu ea utilizând-o pe linia de comandă. Să presupunem că parola pentru contul de pe computerul de la distanță este rusty!herring.pitshaft . Vom cripta acea parolă folosind openssl .

Trebuie să furnizăm o parolă de criptare atunci când o facem. Parola de criptare este utilizată în procesele de criptare și decriptare. Există o mulțime de parametri și opțiuni în comanda openssl . Vom arunca o privire la fiecare dintre ele într-un moment.

 ecou 'ruginit!hering.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass: "alege.parola ta" 

Folosim echo pentru a trimite parola contului de la distanță printr-o conductă și în comanda openssl .

Parametrii openssl sunt:

  • enc -aes-256-cbc : tipul de codificare. Folosim codul standard de criptare avansată pe 256 de biți cu înlănțuire a blocurilor de criptare.
  • -md sha512 : tipul de digest (hash) al mesajului. Folosim algoritmul criptografic SHA512.
  • -a : Aceasta îi spune openssl să aplice codarea de bază 64 după faza de criptare și înainte de faza de decriptare.
  • -pbkdf2 : Utilizarea funcției 2 de derivare a cheilor bazată pe parolă (PBKDF2) face mult mai dificil ca un atac cu forță brută să reușească să ghicească parola. PBKDF2 necesită multe calcule pentru a efectua criptarea. Un atacator ar trebui să reproducă toate aceste calcule.
  • -iter 100000 : Setează numărul de calcule pe care le va folosi PBKDF2.
  • -salt : Utilizarea unei valori de sare aplicată aleatoriu face ca rezultatul criptat să fie diferit de fiecare dată, chiar dacă textul simplu este același.
  • -pass pass:'pick.your.password' : parola pe care va trebui să o folosim pentru a decripta parola de la distanță criptată. Înlocuiți pick.your.password cu o parolă robustă, la alegerea dvs.

Versiunea criptată a parolei noastre rusty!herring.pitshaft este scrisă în fereastra terminalului.

Parola criptată scrisă în fereastra terminalului

Pentru a decripta acest lucru, trebuie să trecem acel șir criptat în openssl cu aceiași parametri pe care i-am folosit pentru a cripta, dar adăugând opțiunea -d (decriptare).

 echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:"alege.parola ta" 

Publicitate

Șirul este decriptat, iar textul nostru original - parola pentru contul de utilizator la distanță - este scris în fereastra terminalului.

Parola decriptată scrisă în fereastra terminalului

Asta dovedește că putem cripta în siguranță parola contului de utilizator de la distanță. De asemenea, îl putem decripta atunci când avem nevoie de el folosind parola pe care am furnizat-o în faza de criptare.

Dar ne îmbunătățește acest lucru situația? Dacă avem nevoie de parola de criptare pentru a decripta parola contului de la distanță, cu siguranță parola de decriptare va trebui să fie în script? Ei bine, da, da. Dar parola criptată a contului de utilizator de la distanță va fi stocată într-un fișier ascuns diferit. Permisiunile pentru fișier vor împiedica pe oricine, în afară de dvs. și, evident, utilizatorul root al sistemului, să îl acceseze.

Pentru a trimite rezultatul de la comanda de criptare la un fișier, putem folosi redirecționarea. Fișierul se numește „.secret_vault.txt”. Am schimbat parola de criptare cu ceva mai robust.

 ecou 'ruginit!hering.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!parola' > .secret_vault.txt 

Nu se întâmplă nimic vizibil, dar parola este criptată și trimisă în fișierul „.secret_vault.txt”.

Putem testa că a funcționat prin decriptarea parolei din fișierul ascuns. Rețineți că aici folosim cat , nu echo .

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

Publicitate

Parola este decriptată cu succes din datele din fișier. Vom folosi chmod pentru a schimba permisiunile pe acest fișier, astfel încât nimeni altcineva să nu-l poată accesa.

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

Folosirea unei măști de permisiuni de 600 elimină tot accesul pentru oricine, altul decât proprietarul fișierului. Acum putem trece la scrierea scenariului nostru.

LEGATE: Cum să utilizați comanda chmod pe Linux

Utilizarea OpenSSL într-un script

Scriptul nostru este destul de simplu:

 #!/bin/bash

# numele contului de la distanță
REMOTE_USER=geek

# parolă pentru contul de la distanță
REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!parolă')

# computer la distanță
REMOTE_LINUX=fedora-34.local

# conectați-vă la computerul de la distanță și puneți un marcaj de timp într-un fișier numit script.log
sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_comenzi
echo $USER "-" $(data) >> /home/$REMOTE_USER/script.log
_comenzi_la distanță
  • Am setat o variabilă numită REMOTE_USER la „geek”.
  • Apoi setăm o variabilă numită REMOTE_PASSWD la valoarea parolei decriptate extrase din fișierul „.secret_vault.txt”, folosind aceeași comandă pe care am folosit-o acum un moment.
  • Locația computerului la distanță este stocată într-o variabilă numită REMOTE_LINUX .

Cu aceste informații, putem folosi comanda ssh pentru a vă conecta la computerul de la distanță.

  • Comanda sshpass este prima comandă de pe linia de conexiune. Îl folosim cu opțiunea -p (parolă). Acest lucru ne permite să specificăm parola care ar trebui trimisă la comanda ssh .
  • Folosim opțiunea -T (disable pseudo-terminal allocation) cu ssh deoarece nu trebuie să avem un pseudo-TTY alocat nouă pe computerul de la distanță.
Cum să utilizați „Aici Documente” în Bash pe Linux
LEGATE Cum să utilizați „Aici documentele” în Bash pe Linux

Folosim un scurt document aici pentru a transmite o comandă computerului de la distanță. Tot ceea ce se află între cele două șiruri _remote_commands este trimis ca instrucțiuni către sesiunea utilizator de pe computerul de la distanță — în acest caz, este o singură linie de script Bash.

Comanda trimisă la computerul de la distanță înregistrează pur și simplu numele contului de utilizator și o marca temporală într-un fișier numit „script.log”.

Copiați și inserați scriptul într-un editor și salvați-l într-un fișier numit „go-remote.sh”. Nu uitați să modificați detaliile pentru a reflecta adresa propriului computer la distanță, contul de utilizator la distanță și parola contului la distanță.

Utilizați chmod pentru a face scriptul executabil.

 chmod +x go-remote.sh 

Publicitate

Tot ce mai rămâne este să-l încerci. Să ne pornim scenariul.

 ./go-remote.sh 

Deoarece scriptul nostru este un șablon minimalist pentru un script nesupravegheat, nu există nicio ieșire către terminal. Dar dacă verificăm fișierul „script.log” de pe computerul Fedora, putem vedea că conexiunile la distanță au fost realizate cu succes și că fișierul „script.log” a fost actualizat cu marcaje temporale.

 cat script.log 

Parola dvs. este privată

Parola contului dvs. de la distanță nu este înregistrată în script.

Și, deși parola de decriptare este, în script, nimeni altcineva nu poate accesa fișierul dvs. „.secret_vault.txt” pentru a-l decripta și a prelua parola contului de la distanță.