wget http://example.com/install.sh -O - | bash
executa o script automaticamente, mas devido a possíveis ataques MITM (TLS), etc., isso não é seguro. É possível construir um one-liner que baixe o script, mas o execute apenas se seu hash corresponder ao especificado no one-liner? Seria bom se o one-liner imprimisse algo como Warning! Hash mismatch
se a verificação de hash falhasse.
Então você quer baixar e executar
http://example.com/install.sh
.Por enquanto, suponho que você tenha seu hash SHA256 armazenado localmente em um arquivo chamado
my-sha256.txt
. O arquivo contém apenas o próprio hash e um caractere de quebra de linha no estilo Unix, portanto, seu tamanho deve ser exatamente 65 bytes. Você pode criá-lo simplesmente executando isto:Como você distribui este arquivo hash de sua máquina de desenvolvimento para o cliente não faz parte desta resposta (ainda, você pode esclarecer sua pergunta e me pedir para atualizar esta parte com base em suas especificações detalhadas).
O comando real que seu cliente deve executar para baixar, verificar e, em caso de sucesso, executar o script pode ser assim:
Versão ligeiramente abreviada e feia sem espaços em branco:
Colocado em várias linhas para facilitar a leitura:
Se você deseja fornecer diretamente o hash dentro do comando como string em vez de ler de um arquivo, basta usar uma das minhas versões de comando originais acima e substituir a ocorrência de
my-sha256.txt
por<(echo YOUR_HASH)
, inserindo seu hash real em vez do espaço reservado "SEU_HASH", é claro.Explicação:
O script/one-liner primeiro cria um arquivo temporário usando
mktemp
(usa a pasta temporária do sistema/tmp
).Em seguida, ele usa
wget
para baixar o script de instalação do URL especificado e salvá-lo no arquivo temporário.Agora calculamos sua soma de hash, filtramos apenas o valor de hash da saída de
sha256sum
e comparamos com o que armazenamos em outmy-sha256.txt
.Se ambos os hashes forem iguais, invocaremos
bash
com nosso arquivo de script temporário como argumento, caso contrário, nósecho FAIL
ou você poderemos gerar uma mensagem de erro personalizada.No final, limpamos excluindo nosso arquivo temporário em ambos os casos.
Porém, voltando ao problema de distribuir o hash com segurança para verificar o script original, esta solução acima não vai te ajudar muito, pois resolve um problema criando outro do mesmo tipo.
O que você realmente deve fazer é criar um par de chaves GPG (e publicar sua chave pública em um servidor de chaves), assinar seu script com ele e oferecer o binário assinado compactado para download. Em seguida, deixe o cliente verificar e descriptografar o script usando
gpg
novamente e execute-o com sucesso.Como as impressões digitais GPG usam hash SHA-1 inseguro , aqui está uma linha única que permite a autenticação com hash SHA256 não oficial calculado a partir da chave pública com
gpg --export <key ID> | sha256sum
comando:
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;