in

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.

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 à 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 le bien connu Boîte à outils OpenSSL pour gérer le cryptage et un utilitaire appelé sshpass pour fournir 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.

Les 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 de sel 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échiffrer le mot de passe distant chiffré. 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.

Mot de passe crypté é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.

Mot de passe déchiffré é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 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.

  • Les 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é au ssh commander.
  • Nous utilisons le -T (désactiver l’allocation de pseudo-terminal) avec ssh car nous n’avons pas besoin qu’un pseudo-TTY nous soit attribué sur l’ordinateur distant.

Nous utilisons un court document ici pour transmettre 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.

Utilisation 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 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Comment utiliser strace pour surveiller les appels système Linux

Comment utiliser strace pour surveiller les appels système Linux

Comment utiliser des mots de passe cryptés dans les scripts Bash

Qu’est-ce que « root » sur Linux ?