Comment utiliser des mots de passe cryptés dans les scripts Bash
Si vous êtes obligé d’utiliser un script Linux pour vous connecter à une ressource protégée par mot de passe, vous vous sentez probablement mal à l’aise de mettre ce mot de passe dans le script. OpenSSL résout ce problème pour vous.
Sommaire
Mots de passe et scripts
Ce n’est pas une bonne idée de mettre des mots de passe dans des scripts shell. En fait, c’est une très mauvaise idée. Si le script tombe entre de mauvaises mains, tous ceux qui le lisent peuvent voir quel est le mot de passe. Mais si vous êtes obligé d’utiliser un script, que pouvez-vous faire d’autre ?
Vous pouvez entrer le mot de passe manuellement lorsque le processus atteint ce point, mais si le script doit s’exécuter sans surveillance, cela ne fonctionnera pas. Heureusement, il existe une alternative au codage en dur des mots de passe dans le script. Contre-intuitivement, il utilise un mot de passe différent pour y parvenir, ainsi qu’un cryptage fort.
Dans notre exemple de scénario, nous devons établir une connexion à distance à un ordinateur Fedora Linux à partir de notre ordinateur Ubuntu. Nous utiliserons un script shell Bash pour établir une connexion SSH avec l’ordinateur Fedora. Le script doit s’exécuter sans surveillance et nous ne voulons pas mettre le mot de passe du compte distant dans le script. Nous ne pouvons pas utiliser les clés SSH dans ce cas, car nous prétendons que nous n’avons aucun droit de contrôle ou d’administration sur l’ordinateur Fedora.
Nous allons utiliser la boîte à outils OpenSSL bien connue pour gérer le cryptage et un utilitaire appelé sshpass
pour alimenter le mot de passe dans la commande SSH.
Installer OpenSSL et sshpass
Étant donné que de nombreux autres outils de chiffrement et de sécurité utilisent OpenSSL, il est peut-être déjà installé sur votre ordinateur. Cependant, si ce n’est pas le cas, l’installation ne prend que quelques instants.
Sur Ubuntu, tapez cette commande :
sudo apt get openssl
À installer sshpass
, utilisez cette commande :
sudo apt install sshpass
Sur Fedora, vous devez taper :
sudo dnf install openssl
La commande à installer sshpass
est:
sudo dnf install sshpass
Sur Manjaro Linux, nous pouvons installer OpenSSL avec :
sudo pacman -Sy openssl
Enfin, pour installer sshpass
, utilisez cette commande :
sudo pacman -Sy sshpass
Chiffrement sur la ligne de commande
Avant de commencer à utiliser le openssl
commande avec des scripts, familiarisons-nous avec elle en l’utilisant sur la ligne de commande. Disons que le mot de passe du compte sur l’ordinateur distant est rusty!herring.pitshaft
. Nous allons chiffrer ce mot de passe en utilisant openssl
.
Nous devons fournir un mot de passe de cryptage lorsque nous le faisons. Le mot de passe de cryptage est utilisé dans les processus de cryptage et de décryptage. Il y a beaucoup de paramètres et d’options dans le openssl
commander. Nous examinerons chacun d’eux dans un instant.
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'
Nous utilisons echo
pour envoyer le mot de passe du compte distant via un tuyau et dans le openssl
commander.
le openssl
les paramètres sont :
- enc -aes-256-cbc: Le type d’encodage. Nous utilisons le chiffrement de clé Advanced Encryption Standard 256 bits avec chaînage par blocs de chiffrement.
- -md sha512: le type de condensé de message (hachage). Nous utilisons l’algorithme cryptographique SHA512.
- -une: cela raconte
openssl
appliquer le codage en base 64 après la phase de chiffrement et avant la phase de déchiffrement. - -pbkdf2: L’utilisation de la fonction de dérivation de clé basée sur un mot de passe 2 (PBKDF2) rend beaucoup plus difficile pour une attaque par force brute de réussir à deviner votre mot de passe. PBKDF2 nécessite de nombreux calculs pour effectuer le cryptage. Un attaquant aurait besoin de répliquer tous ces calculs.
- -iter 100000: définit le nombre de calculs que PBKDF2 utilisera.
- -sel: L’utilisation d’une valeur salt appliquée de manière aléatoire rend la sortie chiffrée différente à chaque fois, même si le texte brut est le même.
- -pass pass:’choisissez.votre.mot de passe’: Le mot de passe que nous devrons utiliser pour décrypter le mot de passe distant crypté. Remplacer
pick.your.password
avec un mot de passe robuste de votre choix.
La version cryptée de notre rusty!herring.pitshaft
le mot de passe est écrit dans la fenêtre du terminal.
Pour décrypter cela, nous devons passer cette chaîne cryptée dans openssl
avec les mêmes paramètres que nous avons utilisés pour crypter, mais en ajoutant dans le -d
(déchiffrer) option.
echo U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'
La chaîne est déchiffrée et notre texte d’origine (le mot de passe du compte d’utilisateur distant) est écrit dans la fenêtre du terminal.
Cela prouve que nous pouvons chiffrer en toute sécurité le mot de passe de notre compte d’utilisateur distant. Nous pouvons également le décrypter lorsque nous en avons besoin en utilisant le mot de passe que nous avons fourni lors de la phase de cryptage.
Mais cela améliore-t-il réellement notre situation ? Si nous avons besoin du mot de passe de cryptage pour décrypter le mot de passe du compte distant, le mot de passe de décryptage devra sûrement être dans le script ? Eh bien, oui, il le fait. Mais le mot de passe du compte d’utilisateur distant crypté sera stocké dans un fichier caché différent. Les autorisations sur le fichier empêcheront quiconque d’autre que vous (et l’utilisateur root du système, évidemment) d’y accéder.
Pour envoyer la sortie de la commande de chiffrement vers un fichier, nous pouvons utiliser la redirection. Le fichier s’appelle « .secret_vault.txt ». Nous avons changé le mot de passe de cryptage pour quelque chose de plus robuste.
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt
Rien de visible ne se passe, mais le mot de passe est crypté et envoyé dans le fichier « .secret_vault.txt ».
Nous pouvons tester que cela a fonctionné en déchiffrant le mot de passe dans le fichier caché. Notez que nous utilisons cat
pas ici echo
.
cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password'
Le mot de passe est déchiffré avec succès à partir des données du fichier. nous utiliserons chmod
pour modifier les autorisations sur ce fichier afin que personne d’autre ne puisse y accéder.
chmod 600 .secret_vault.txt
ls -l .secret_vault.txt
L’utilisation d’un masque d’autorisations de 600 supprime tout accès pour toute personne autre que le propriétaire du fichier. Nous pouvons maintenant passer à l’écriture de notre script.
Utiliser OpenSSL dans un script
Notre script est assez simple :
#!/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
- Nous définissons une variable appelée
REMOTE_USER
à « geek ». - Nous définissons ensuite une variable appelée
REMOTE_PASSWD
à la valeur du mot de passe déchiffré extrait du fichier « .secret_vault.txt », en utilisant la même commande que nous avons utilisée il y a un instant. - L’emplacement de l’ordinateur distant est stocké dans une variable appelée
REMOTE_LINUX
.
Avec ces informations, nous pouvons utiliser le ssh
commande pour se connecter à l’ordinateur distant.
- le
sshpass
commande est la première commande sur la ligne de connexion. Nous l’utilisons avec le-p
(mot de passe). Cela nous permet de spécifier le mot de passe qui doit être envoyé aussh
commander. - Nous utilisons le
-T
(désactiver l’allocation de pseudo-terminal) avecssh
car nous n’avons pas besoin qu’un pseudo-TTY nous soit attribué sur l’ordinateur distant.
Nous utilisons un court ici document pour passer une commande à l’ordinateur distant. Tout entre les deux _remote_commands
strings est envoyé sous forme d’instructions à la session utilisateur sur l’ordinateur distant – dans ce cas, il s’agit d’une seule ligne de script Bash.
La commande envoyée à l’ordinateur distant enregistre simplement le nom du compte d’utilisateur et un horodatage dans un fichier appelé « script.log ».
Copiez et collez le script dans un éditeur et enregistrez-le dans un fichier appelé « go-remote.sh ». N’oubliez pas de modifier les détails pour refléter l’adresse de votre propre ordinateur distant, compte d’utilisateur distant et mot de passe du compte distant.
Utiliser chmod
pour rendre le script exécutable.
chmod +x go-remote.sh
Il ne reste plus qu’à l’essayer. Allumons notre script.
./go-remote.sh
Parce que notre script est un modèle minimaliste pour un script sans surveillance, il n’y a aucune sortie vers le terminal. Mais si nous vérifions le fichier « script.log » sur l’ordinateur Fedora, nous pouvons voir que les connexions à distance ont été effectuées avec succès et que le fichier « script.log » a été mis à jour avec les horodatages.
cat script.log
Votre mot de passe est privé
Le mot de passe de votre compte distant n’est pas enregistré dans le script.
Et bien que le mot de passe de déchiffrement est, dans le script, personne d’autre ne peut accéder à votre fichier « .secret_vault.txt » afin de le décrypter et récupérer le mot de passe du compte distant.