wget http://example.com/install.sh -O - | bash
exécute le script automatiquement, mais en raison d'attaques possibles (TLS) MITM, etc., ce n'est pas sans danger. Est-il possible de construire une ligne qui télécharge le script, mais ne l'exécute que si son hachage correspond à celui spécifié dans la ligne? Ce serait bien si one-liner imprimait quelque chose comme Warning! Hash mismatch
si la vérification du hachage échouait.
Donc, vous voulez télécharger et exécuter http://example.com/install.sh
.
Pour l'instant, je suppose que son hachage SHA256 est stocké localement dans un fichier nommé my-sha256.txt
. Le fichier ne contient que le hachage lui-même et un caractère de saut de ligne de style Unix; sa taille doit donc être exactement de 65 octets. Vous pouvez le créer en exécutant simplement ceci:
sha256sum ORIGINAL_FILE.SH | grep -Eo '^\w+' > my-sha256.txt
La façon dont vous distribuez ce fichier de hachage de votre ordinateur de développement au client ne fait pas partie de cette réponse (vous pouvez néanmoins clarifier votre question et me demander de mettre à jour cette partie en fonction de vos spécifications détaillées).
La commande réelle que votre client doit exécuter pour télécharger, vérifier et en cas d’exécution, le script pourrait ressembler à ceci:
t=$(mktemp) && wget 'http://example.com/install.sh' -qO "$t" && if sha256sum "$t" | grep -Eo '^\w+' | cmp -s my-sha256.txt ; then bash "$t" ; else echo FAIL ; fi ; rm "$t"
Version légèrement raccourcie et laide sans espace:
t=$(mktemp)&&wget 'http://example.com/install.sh' -qO"$t"&&if sha256sum "$t"|grep -Eo '^\w+'|cmp -s my-sha256.txt;then bash "$t";else echo FAIL;fi;rm "$t"
Placé sur plusieurs lignes pour plus de lisibilité:
t=$(mktemp) &&
wget 'http://example.com/install.sh' -qO "$t" &&
if sha256sum "$t" | grep -Eo '^\w+' | cmp -s my-sha256.txt
then bash "$t"
else echo FAIL
fi
rm "$t"
Si vous souhaitez fournir directement le hachage dans la commande sous forme de chaîne au lieu de le lire dans un fichier, utilisez simplement l'une de mes versions de commande d'origine ci-dessus et remplacez l'occurrence de my-sha256.txt
par <(echo YOUR_HASH)
en insérant votre véritable hachage. au lieu de l’espace réservé "YOUR_HASH" bien sûr.
Explication:
Le script/one-liner crée d’abord un fichier temporaire en utilisant mktemp
(utilise le dossier temporaire du système /tmp
).
Il utilise ensuite wget
pour télécharger votre script d'installation à partir de l'URL spécifiée et l'enregistrer dans le fichier temporaire.
Maintenant, nous calculons sa somme de hachage, filtrons uniquement la valeur de hachage de la sortie de sha256sum
et la comparons à celle que nous avons stockée dans out my-sha256.txt
.
Si les deux hachages sont égaux, nous invoquerons bash
avec notre fichier de script temporaire en tant qu'argument, sinon nous echo FAIL
ou vous pourriez générer un message d'erreur personnalisé.
Finalement, nous nettoyons en supprimant notre fichier temporaire dans les deux cas.
Cependant, pour revenir au problème de la distribution sécurisée du hachage afin de vérifier le script original, cette solution ci-dessus ne vous aidera pas beaucoup, car elle résout un problème en créant un autre du même type.
Ce que vous devez réellement faire est de créer une paire de clés GPG (et de publier votre clé publique sur un serveur de clés), de signer votre script avec celui-ci et de proposer le binaire signé signé au téléchargement. Laissez ensuite le client vérifier et déchiffrer le script en utilisant à nouveau gpg
et exécutez-le en cas de succès.
Puisque les empreintes digitales de GPG utilisent un hachage SHA-1 non sécurisé, voici une solution unique permettant l’authentification avec un hachage non officiel SHA256 calculé à partir de la clé publique avec
gpg --export <key ID> | sha256sum
commander:
h="<SHA256 hash of exported public key>"; fp="<PGP key SHA1 fingerprint>"; f='key.pub'; gpg --keyserver pgp.mit.edu --recv $fp && gpg --export $fp > $f && if sha256sum $f | grep -Eo '^\w+' | cmp -s <(echo $h); then rm $f && wget https://example.com/install.sh{,.asc} -q && gpg --verify install.sh{.asc,} && bash install.sh; else rm $f; echo "ERROR: Signing key had invalid SHA256 hash"; fi;