Come utilizzare le password crittografate negli script bash

Contenuti

Un laptop Linux in stile Ubuntu.

Se sei costretto a usare 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 realtà, è una pessima idea. Se la sceneggiatura cade nelle mani sbagliate, tutti quelli che lo leggono potranno vedere qual è la password. Ma se sei costretto a usare uno script, Cos'altro puoi fare??

Puoi inserire la password manualmente quando la procedura raggiunge quel punto, ma se lo script verrà eseguito senza supervisione, non funzionerà. fortunatamente, c'è un'alternativa alle password hard-coding nello script. Contrariamente all'intuizione, usa 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 incustodito e non vogliamo inserire la password dell'account remoto nello script. Non possiamo usare le chiavi SSH per questo caso, perché fingiamo di non avere alcun controllo o diritti di amministratore sul computer Fedora.

Faremo uso delle conoscenze OpenSSL Toolkit per gestire la crittografia e un'utilità chiamata sshpass per inserire la password nel comando SSH.

IMPARENTATO: Come creare e installare chiavi SSH da Linux Shell

Installazione di OpenSSL e sshpass

Perché molti altri strumenti di crittografia e sicurezza utilizzano OpenSSL, È possibile che sia già installato nel computer. Nonostante questo, Se non è così, Ci vuole solo un attimo per installarlo.

In Ubuntu, scrivi questo comando:

sudo apt get openssl

Installare sshpass, usa questo comando:

sudo apt installare sshpass

In Fedora, deve scrivere:

sudo dnf installare openssl

Il comando da installare sshpass è:

sudo dnf installare sshpass

In Manjaro Linux, possiamo installare OpenSSL con:

sudo pacman -Sy openssl

Finire, Clicca e scarica il file sshpass, usa questo comando:

sudo pacman -Sy sshpass

Crittografia da riga di comando

Prima di iniziare a utilizzare il comando openssl comando con script, facciamo conoscenza 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 openssl comando. Daremo un'occhiata a ciascuno di essi in un momento..

eco "arrugginito"!aringa.pozzo' | 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 pipeline e per openssl comando.

il openssl I parametri sono:

  • enc -aes-256-cbc: Il tipo di codifica. Stiamo utilizzando la crittografia a chiave standard della crittografia avanzata di 256 bit con concatenamento dei blocchi di crittografia.
  • -md sha512: Tipo di riepilogo del messaggio (Hash). Stiamo utilizzando l'algoritmo crittografico SHA512.
  • -un: Questo dice openssl Per applicare la codifica di base 64 dopo la fase di crittografia e prima della fase di decrittografia.
  • -PBKDF2: Utilizzo della funzione 2 derivazione della chiave basata su password (PBKDF2 ·) rende molto più difficile per un attacco di forza bruta riuscire a indovinare la tua password. PBKDF2 ha bisogno di molti calcoli per eseguire la crittografia. Un utente malintenzionato dovrebbe replicare tutti questi calcoli.
  • -Iter 100000: Imposta il numero di calcoli che PBKDF2 utilizzerà.
  • -deve: 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 usare per decrittografare la password remota crittografata. Sostituire pick.your.password con una password sicura a tua scelta.

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

Password crittografata scritta nella finestra del terminale

Per decifrare questo, dobbiamo passare quella stringa crittografata a openssl con gli stessi parametri che usiamo per crittografare, ma aggiungendo il -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'

La stringa è decifrata e il nostro testo originale, la password dell'account utente remoto, è scritto nella finestra del terminale.

Password decifrata scritta nella finestra del terminale

Ciò dimostra che possiamo crittografare in sicurezza la password del nostro account utente remoto. Possiamo anche decifrarlo quando ne abbiamo bisogno utilizzando la password che forniamo in fase di crittografia..

Ma, Questo migliora davvero la nostra situazione?? Se abbiamo bisogno della password di crittografia per decifrare la password dell'account remoto, Certamente la password di decrittazione dovrebbe essere nello script? Bene, se 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 di (e l'utente root del sistema, evidentemente) accedi.

Per inviare l'output del comando di crittografia a un file, possiamo usare il reindirizzamento. Il file viene chiamato “.secret_vault.txt”. Abbiamo cambiato la password di crittografia in qualcosa di più robusto.

eco "arrugginito"!aringa.pozzo' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:"segreto#cassetta"!parola d'ordine' > .secret_vault.txt

Non succede nulla di visibile, Ma la password viene crittografata e inviata al file “.secret_vault.txt”.

Possiamo testare che ha funzionato craccando la password nel file nascosto. Si prega di notare che stiamo usando cat qui nel echo.

gatto .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:"segreto#cassetta"!parola d'ordine'

La password è stata decifrata con successo dai dati del file. noi useremo chmod per modificare i permessi di questo file in modo che nessun altro possa accedervi.

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

Utilizzo di una maschera di autorizzazione 600 Rimuove tutti gli accessi per chiunque non sia il proprietario del file. Ora possiamo passare alla scrittura della nostra sceneggiatura.

IMPARENTATO: Come usare il comando chmod in Linux

Utilizzare OpenSSL in uno script

La nostra sceneggiatura è piuttosto semplice:

#!/cestino/bash

# name of the remote account
REMOTE_USER=geek

# password for the remote account
REMOTE_PASSWD=$(gatto .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:"segreto#cassetta"!parola d'ordine')

# 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 "-" $(Data) >> /home/$REMOTE_USER/script.log
_remote_commands
  • Impostiamo una variabile chiamata REMOTE_USER un “La virgoletta singola o l'apostrofo della parola”.
  • Quindi impostiamo una variabile chiamata REMOTE_PASSWD al valore della password decrittografata estratta dal file ".secret_vault.txt", usando 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 comando è il primo comando sulla linea di connessione. Lo usiamo con il -p (parola d'ordine) opzione. Questo ci permette di specificare la password che deve essere inviata al ssh comando.
  • Noi usiamo il -T (disabilita la mappatura dello pseudo-terminale) con opzione ssh perché non abbiamo bisogno di avere uno pseudo-TTY assegnato sul computer remoto.

Indossiamo un corto qui documento per passare un comando al computer remoto. Tutto tra i due _remote_commands le stringhe vengono inviate come istruzioni alla sessione dell'utente sul computer remoto; per questo caso, è una singola riga dello 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”. Ricordati di modificare i dettagli per riflettere 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

Non resta che provarlo. Iniziamo il nostro script.

./go-remote.sh

Perché il nostro script è un modello minimalista per uno script non presidiato, non c'è uscita al terminal. 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 anche quando la password di decrittazione è, nella sceneggiatura, nessun altro può accedere al tuo file “.secret_vault.txt” per decrittografarlo e recuperare la password dell'account remoto.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.