Cum să utilizați parolele criptate în scripturile Bash
Publicat: 2022-01-29Dacă 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.
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"
Șirul este decriptat, iar textul nostru original - parola pentru contul de utilizator la distanță - este 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ă'
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 comandassh
. - Folosim opțiunea
-T
(disable pseudo-terminal allocation) cussh
deoarece nu trebuie să avem un pseudo-TTY alocat nouă pe computerul de la distanță.
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
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ță.