Come utilizzare le password crittografate negli script Bash
Pubblicato: 2022-01-29Se sei costretto a utilizzare uno script Linux per connetterti a una risorsa protetta da password, probabilmente ti senti a disagio a inserire quella password nello script. OpenSSL risolve questo problema per te.
Password e script
Non è una buona idea inserire le password negli script della shell. In effetti, è davvero una pessima idea. Se lo script cade nelle mani sbagliate, tutti coloro che lo leggono possono vedere qual è la password. Ma se sei costretto a usare uno script, cos'altro puoi fare?
Puoi inserire la password manualmente quando il processo raggiunge quel punto, ma se lo script verrà eseguito automaticamente, non funzionerà. Per fortuna, c'è un'alternativa all'hardcoding delle password nello script. Controintuitivamente, utilizza una password diversa per ottenere ciò, insieme a una crittografia avanzata.
Nel nostro scenario di esempio, dobbiamo effettuare una connessione remota a un computer Fedora Linux dal nostro computer Ubuntu. Useremo uno script di shell Bash per creare una connessione SSH al computer Fedora. Lo script deve essere eseguito automaticamente e non vogliamo inserire la password per l'account remoto nello script. Non possiamo usare le chiavi SSH in questo caso, perché stiamo fingendo di non avere alcun controllo o diritto di amministratore sul computer Fedora.
Utilizzeremo il noto toolkit OpenSSL per gestire la crittografia e un'utilità chiamata sshpass
per inserire la password nel comando SSH.
CORRELATI: Come creare e installare chiavi SSH dalla shell di Linux
Installazione di OpenSSL e sshpass
Poiché molti altri strumenti di crittografia e sicurezza utilizzano OpenSSL, potrebbe essere già installato sul tuo computer. Tuttavia, in caso contrario, l'installazione richiede solo un momento.
Su Ubuntu, digita questo comando:
sudo apt get openssl
Per installare sshpass
, usa questo comando:
sudo apt install sshpass
Su Fedora, devi digitare:
sudo dnf install openssl
Il comando per installare sshpass
è:
sudo dnf install sshpass
Su Manjaro Linux, possiamo installare OpenSSL con:
sudo pacman -Sy openssl
Infine, per installare sshpass
, usa questo comando:
sudo pacman -Sy sshpass
Crittografia sulla riga di comando
Prima di iniziare a usare il comando openssl
con gli script, prendiamo familiarità con esso usandolo sulla riga di comando. Diciamo che la password per l'account sul computer remoto è rusty!herring.pitshaft
. Crittograferemo quella password usando openssl
.
Dobbiamo fornire una password di crittografia quando lo facciamo. La password di crittografia viene utilizzata nei processi di crittografia e decrittografia. Ci sono molti parametri e opzioni nel comando openssl
. Daremo un'occhiata a ciascuno di essi tra un momento.
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'
Stiamo usando echo
per inviare la password dell'account remoto attraverso una pipe e nel comando openssl
.
I parametri openssl
sono:
- enc -aes-256-cbc : il tipo di codifica. Utilizziamo la crittografia della chiave Advanced Encryption Standard a 256 bit con concatenamento a blocchi di crittografia.
- -md sha512 : il tipo di digest del messaggio (hash). Stiamo usando l'algoritmo crittografico SHA512.
- -a : indica ad
openssl
di applicare la codifica base-64 dopo la fase di crittografia e prima della fase di decrittografia. - -pbkdf2 : l'utilizzo della funzione di derivazione della chiave basata su password 2 (PBKDF2) rende molto più difficile per un attacco di forza bruta riuscire a indovinare la password. PBKDF2 richiede molti calcoli per eseguire la crittografia. Un utente malintenzionato dovrebbe replicare tutti questi calcoli.
- -iter 100000 : Imposta il numero di calcoli che PBKDF2 utilizzerà.
- -salt : l'utilizzo di un valore salt applicato in modo casuale rende l'output crittografato diverso ogni volta, anche se il testo normale è lo stesso.
- -pass pass:'pick.your.password' : la password che dovremo utilizzare per decrittografare la password remota crittografata. Sostituisci
pick.your.password
con una password robusta a tua scelta.
La versione crittografata della nostra password rusty!herring.pitshaft
viene scritta nella finestra del terminale.
Per decrittografare questo, dobbiamo passare quella stringa crittografata in openssl
con gli stessi parametri che abbiamo usato per crittografare, ma aggiungendo l'opzione -d
(decodifica).
echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'
La stringa viene decifrata e il nostro testo originale, la password per l'account utente remoto, viene scritto nella finestra del terminale.
Ciò dimostra che possiamo crittografare in modo sicuro la password dell'account utente remoto. Possiamo anche decodificarlo quando ne abbiamo bisogno utilizzando la password che abbiamo fornito in fase di crittografia.
Ma questo migliora davvero la nostra situazione? Se abbiamo bisogno della password di crittografia per decrittografare la password dell'account remoto, sicuramente la password di decrittazione dovrà essere nello script? Ebbene sì, lo fa. Ma la password dell'account utente remoto crittografato verrà archiviata in un file nascosto diverso. Le autorizzazioni sul file impediranno a chiunque tranne te, e ovviamente all'utente root del sistema, di accedervi.
Per inviare l'output del comando di crittografia a un file, possiamo utilizzare il reindirizzamento. Il file si chiama ".secret_vault.txt". Abbiamo cambiato la password di crittografia in qualcosa di più robusto.
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt
Non accade nulla di visibile, ma la password viene crittografata e inviata al file ".secret_vault.txt".
Possiamo testare che ha funzionato decrittografando la password nel file nascosto. Nota che stiamo usando cat
qui, non echo
.
gatto .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password'
La password è stata decifrata con successo dai dati nel file. Useremo chmod
per modificare i permessi su questo file in modo che nessun altro possa accedervi.
chmod 600 .secret_vault.txt
ls -l .secret_vault.txt
L'utilizzo di una maschera di autorizzazioni di 600 rimuove tutti gli accessi per chiunque non sia il proprietario del file. Possiamo ora passare alla scrittura del nostro copione.
CORRELATI: Come utilizzare il comando chmod su Linux
Utilizzo di OpenSSL in uno script
Il nostro script è piuttosto semplice:
#!/bin/bash # nome dell'account remoto REMOTE_USER = secchione # password per l'account remoto REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password') # computer remoto REMOTE_LINUX=fedora-34.local # connettersi al computer remoto e inserire un timestamp in un file chiamato script.log sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands echo $USER "-" $(data) >> /home/$REMOTE_USER/script.log _comandi_remoti
- Impostiamo una variabile chiamata
REMOTE_USER
su "geek". - Impostiamo quindi una variabile denominata
REMOTE_PASSWD
sul valore della password decifrata estratta dal file “.secret_vault.txt”, utilizzando lo stesso comando che abbiamo usato poco fa. - La posizione del computer remoto è memorizzata in una variabile chiamata
REMOTE_LINUX
.
Con queste informazioni, possiamo usare il comando ssh
per connetterci al computer remoto.
- Il comando
sshpass
è il primo comando sulla linea di connessione. Lo usiamo con l'opzione-p
(password). Questo ci permette di specificare la password che dovrebbe essere inviata al comandossh
. - Usiamo l'
-T
(disabilita l'allocazione pseudo-terminale) conssh
perché non abbiamo bisogno di avere uno pseudo-TTY assegnato a noi sul computer remoto.
Stiamo usando un breve documento qui per passare un comando al computer remoto. Tutto ciò che si trova tra le due stringhe _remote_commands
viene inviato come istruzioni alla sessione utente sul computer remoto, in questo caso è una singola riga di script Bash.
Il comando inviato al computer remoto registra semplicemente il nome dell'account utente e un timestamp in un file chiamato "script.log".
Copia e incolla lo script in un editor e salvalo in un file chiamato "go-remote.sh". Ricordarsi di modificare i dettagli in modo che riflettano l'indirizzo del proprio computer remoto, l'account utente remoto e la password dell'account remoto.
Usa chmod
per rendere eseguibile lo script.
chmod +x go-remote.sh
Non resta che provarlo. Accendiamo il nostro copione.
./go-remote.sh
Poiché il nostro script è un modello minimalista per uno script automatico, non viene inviato alcun output al terminale. Ma se controlliamo il file "script.log" sul computer Fedora, possiamo vedere che le connessioni remote sono state effettuate con successo e che il file "script.log" è stato aggiornato con i timestamp.
cat script.log
La tua password è privata
La password dell'account remoto non è registrata nello script.
E sebbene la password di decrittografia sia, nello script, nessun altro può accedere al tuo file ".secret_vault.txt" per decrittografarlo e recuperare la password dell'account remoto.