Comment utiliser des mots de passe cryptés dans les scripts Bash
Publié: 2022-01-29Si vous êtes obligé d'utiliser un script Linux pour vous connecter à une ressource protégée par un 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.
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 toute attente, 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 allons utiliser un script shell Bash pour établir une connexion SSH à 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 fournir le mot de passe à la commande SSH.
CONNEXION: Comment créer et installer des clés SSH à partir du shell Linux
Installer OpenSSL et sshpass
Étant donné que de nombreux autres outils de chiffrement et de sécurité utilisent OpenSSL, il se peut qu'il soit 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 obtenir openssl
Pour installer sshpass
, utilisez cette commande :
sudo apt installer sshpass
Sur Fedora, vous devez taper :
sudo dnf installer openssl
La commande pour installer sshpass
est :
sudo dnf installer sshpass
Sur Manjaro Linux, on peut 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 la commande openssl
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 chiffrement est utilisé dans les processus de chiffrement et de déchiffrement. Il y a beaucoup de paramètres et d'options dans la commande openssl
. Nous allons jeter un oeil à 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 canal et dans la commande openssl
.
Les paramètres openssl
sont :
- enc -aes-256-cbc : Le type d'encodage. Nous utilisons le chiffrement à clé Advanced Encryption Standard 256 bits avec enchaînement de blocs de chiffrement.
- -md sha512 : Le type de résumé de message (hachage). Nous utilisons l'algorithme cryptographique SHA512.
- -a : Cela indique à
openssl
d'appliquer l'encodage 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 le 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 chiffrement. Un attaquant aurait besoin de répliquer tous ces calculs.
- -iter 100000 : Définit le nombre de calculs que PBKDF2 utilisera.
- -salt : L'utilisation d'une valeur de sel appliquée de manière aléatoire rend la sortie cryptée différente à chaque fois, même si le texte brut est le même.
- -pass pass:'pick.your.password' : Le mot de passe que nous devrons utiliser pour décrypter le mot de passe distant crypté. Remplacez
pick.your.password
par un mot de passe robuste de votre choix.
La version cryptée de notre mot de passe rusty!herring.pitshaft
est écrite 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 l'option -d
(décrypter).
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 crypter 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 chiffrement pour déchiffrer le mot de passe du compte distant, le mot de passe de déchiffrement devra sûrement figurer dans le script ? Eh bien, oui, c'est le cas. Mais le mot de passe chiffré du compte d'utilisateur distant sera stocké dans un autre fichier caché. Les autorisations sur le fichier empêcheront quiconque sauf 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é au 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
ici, pas echo
.
chat .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.
CONNEXION: Comment utiliser la commande chmod sous Linux
Utiliser OpenSSL dans un script
Notre script est assez simple :
#!/bin/bash # nom du compte distant REMOTE_USER=geek # mot de passe pour le compte distant REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password') # ordinateur distant REMOTE_LINUX=fedora-34.local # se connecter à l'ordinateur distant et mettre un horodatage dans un fichier appelé 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
sur "geek". - Nous avons ensuite défini une variable appelée
REMOTE_PASSWD
sur 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 la commande ssh
pour nous connecter à l'ordinateur distant.
- La commande
sshpass
est la première commande sur la ligne de connexion. Nous l'utilisons avec l'option-p
(mot de passe). Cela nous permet de spécifier le mot de passe qui doit être envoyé à la commandessh
. - Nous utilisons l'
-T
(désactiver l'allocation de pseudo-terminal) avecssh
car nous n'avons pas besoin d'avoir un pseudo-TTY qui nous soit alloué sur l'ordinateur distant.
Nous utilisons ici un court document pour transmettre une commande à l'ordinateur distant. Tout ce qui se trouve entre les deux chaînes _remote_commands
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.
Utilisez chmod
pour rendre le script exécutable.
chmod +x go-remote.sh
Il ne reste plus qu'à l'essayer. Lançons notre script.
./go-remote.sh
Parce que notre script est un modèle minimaliste pour un script sans assistance, il n'y a pas de 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é établies avec succès et que le fichier "script.log" a été mis à jour avec des horodatages.
chat 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 soit, dans le script, personne d'autre ne peut accéder à votre fichier « .secret_vault.txt » afin de le déchiffrer et de récupérer le mot de passe du compte distant.