Come utilizzare le password crittografate negli script Bash

Un laptop Linux in stile Ubuntu.
fatmawati achmad zaenuri/Shutterstock.com

Se sei costretto a utilizzare uno script Linux per connetterti a una risorsa protetta da password, probabilmente ti sentirai 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, chiunque lo legga può 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 incustodito, non funzionerà. Per fortuna, c’è un’alternativa all’hard-coding delle password nello script. Controintuitivamente, utilizza una password diversa per raggiungere questo obiettivo, 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 non presidiato e non vogliamo inserire la password per l’account remoto nello script. Non possiamo usare le chiavi SSH in questo caso, perché stiamo facendo finta di non avere alcun controllo o diritti 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.

RELAZIONATO: Come creare e installare chiavi SSH dalla shell Linux

Installazione di OpenSSL e sshpass

Poiché molti altri strumenti di crittografia e sicurezza utilizzano OpenSSL, potrebbe essere già installato sul tuo computer. Tuttavia, se non lo è, ci vuole solo un momento per l’installazione.

Su Ubuntu, digita questo comando:

sudo apt get openssl

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 openssl comando con gli script, prendiamo confidenza con esso utilizzandolo 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 openssl comando. Daremo un’occhiata a ciascuno di essi in 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 tramite una pipe e nel openssl comando.

Il openssl i parametri sono:

  • enc -aes-256-cbc: il tipo di codifica. Utilizziamo la cifratura a chiave Advanced Encryption Standard a 256 bit con concatenamento di blocchi di cifratura.
  • -md sha512: il tipo di digest (hash) del messaggio. Stiamo usando l’algoritmo crittografico SHA512.
  • -un: Questo dice openssl applicare la codifica base 64 dopo la fase di crittografia e prima della fase di decrittografia.
  • -pbkdf2Nota: l’utilizzo della funzione di derivazione 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 utilizzerà PBKDF2.
  • -saleNota: 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:’scegli.la.tua.password’: La password che dovremo usare per decrittografare la password remota crittografata. Sostituire pick.your.password con una password robusta di tua scelta.

La versione criptata del nostro rusty!herring.pitshaft la password viene scritta nella finestra del terminale.

Password crittografata scritta nella finestra del terminale

Per decifrarlo, dobbiamo passare quella stringa crittografata in openssl con gli stessi parametri che abbiamo usato per crittografare, ma aggiungendo nel -d (decifrare) opzione.

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

Annuncio pubblicitario

La stringa viene decifrata e il nostro testo originale, la password per l’account utente remoto, viene scritto nella finestra del terminale.

Password decifrata scritta nella finestra del terminale

Ciò dimostra che possiamo crittografare in modo sicuro la password dell’account utente remoto. Possiamo anche decifrarlo 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 decrittografia 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 dal comando di crittografia a un file, possiamo usare 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 verificare che ha funzionato decrittografando la password nel file nascosto. Nota che stiamo usando cat qui, no echo.

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

Annuncio pubblicitario

La password è stata decifrata con successo dai dati nel file. useremo chmod per modificare le autorizzazioni 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 autorizzazione di 600 rimuove tutti gli accessi per chiunque non sia il proprietario del file. Ora possiamo passare alla scrittura della nostra sceneggiatura.

RELAZIONATO: Come usare il comando chmod su Linux

Utilizzo di OpenSSL in uno script

Il nostro script è piuttosto semplice:

#!/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
  • Impostiamo una variabile chiamata REMOTE_USER a “geek”.
  • Impostiamo quindi una variabile chiamata REMOTE_PASSWD al 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 ssh comando per connettersi al computer remoto.

  • Il sshpass command è il primo comando sulla linea di connessione. Lo usiamo con il -p opzione (password). Questo ci permette di specificare la password che deve essere inviata al ssh comando.
  • Noi usiamo il -T (disabilita allocazione pseudo-terminale) opzione con ssh perché non abbiamo bisogno di avere uno pseudo-TTY assegnato a noi sul computer remoto.
Come usare "Here Documents" in Bash su Linux

RELAZIONATOCome usare “Here Documents” in Bash su Linux

Stiamo usando un corto qui documento per passare un comando al computer remoto. Tutto tra i due _remote_commands strings viene inviato come istruzioni alla sessione utente sul computer remoto, in questo caso si tratta di 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”. Ricorda di modificare i dettagli in modo che riflettano l’indirizzo del tuo computer remoto, account utente remoto e password dell’account remoto.

Utilizzo chmod per rendere eseguibile lo script.

chmod +x go-remote.sh

Annuncio pubblicitario

Non resta che provarlo. Accendiamo il nostro script.

./go-remote.sh

Poiché il nostro script è un modello minimalista per uno script non presidiato, non c’è output sul 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 decrittazione è, nello script, nessun altro può accedere al file “.secret_vault.txt” per decrittografarlo e recuperare la password dell’account remoto.

Articoli correlati

Ultimi articoli