Como usar senhas criptografadas em scripts bash

Conteúdo

Um laptop Linux estilo Ubuntu.

Se você for forçado a usar um script Linux para se conectar a um recurso protegido por senha, você provavelmente não se sente confortável ao colocar essa senha no script. OpenSSL resolve esse problema para você.

Senhas e scripts

Não é uma boa ideia colocar senhas em scripts de shell. Na realidade, é uma ideia muito ruim. Se o script cair nas mãos erradas, todos que lerem poderão ver qual é a senha. Mas se você for forçado a usar um script, O que mais você pode fazer?

Você pode inserir a senha manualmente quando o procedimento chegar a esse ponto, mas se o script for executado sem supervisão, isso não vai funcionar. Por sorte, há uma alternativa para a codificação de senhas em script. Ao contrário da intuição, use uma senha diferente para conseguir isso, junto com criptografia forte.

Em nosso cenário de exemplo, precisamos fazer uma conexão remota a um computador Fedora Linux a partir de nosso computador Ubuntu. Usaremos um script de shell Bash para fazer uma conexão SSH ao computador Fedora. O script precisa ser executado sem supervisão e não queremos colocar a senha da conta remota no script. Não podemos usar chaves SSH para este caso, porque fingimos que não temos nenhum controle ou direitos de administrador sobre o computador Fedora.

Faremos uso dos conhecidos OpenSSL Toolkit para lidar com a criptografia e um utilitário chamado sshpass para inserir a senha no comando SSH.

RELACIONADO: Como criar e instalar chaves SSH a partir do Linux Shell

Instalação OpenSSL e sshpass

Porque muitas outras ferramentas de criptografia e segurança usam o OpenSSL, é viável que ele já está instalado em seu computador. Apesar disto, sim, não é assim, só leva um momento para instalá-lo.

No Ubuntu, escreva este comando:

sudo apt obter openssl

Instalar sshpass, use este comando:

sudo apt instalar sshpass

No Fedora, deve escrever:

sudo dnf instalar abresl

O comando para instalar sshpass isto é:

sudo dnf instalar sshpass

Em Manjaro Linux, podemos instalar o OpenSSL com:

sudo pacman -Sy abre

Para terminar, para instalar sshpass, use este comando:

sudo pacman -Sy sshpass

Criptografia de linha de comando

Antes de começar a usar o openssl comando roteirizado, vamos nos familiarizar com ele usando-o na linha de comando. Digamos que a senha da conta no computador remoto seja rusty!herring.pitshaft. Vamos criptografar essa senha usando openssl.

Precisamos fornecer uma senha de criptografia quando fazemos. A senha de criptografia é usada nos processos de criptografia e descriptografia. Existem muitos parâmetros e opções no openssl comando. Vamos dar uma olhada em cada um deles em um momento..

echo 'enferrujado!herring.pitshaft ' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -passe de sal:'escolha.sua.senha'

Estamos usando echo para enviar a senha da conta remota através de um pipeline e para openssl comando.

a openssl os parâmetros são:

  • enc -aes-256-cbc: O tipo de codificação. Estamos usando a criptografia de chave padrão da criptografia avançada de 256 bits com encadeamento de blocos de criptografia.
  • -md sha512: O tipo de resumo da mensagem (hash). Estamos usando o algoritmo criptográfico SHA512.
  • -uma: Isso diz openssl para aplicar codificação base 64 após o estágio de criptografia e antes do estágio de descriptografia.
  • -pbkdf2: Usando a função 2 derivação de chave baseada em senha (PBKDF2) torna muito mais difícil para um ataque de força bruta para ter sucesso em adivinhar sua senha. PBKDF2 precisa de muitos cálculos para executar criptografia. Um invasor precisaria replicar todos esses cálculos.
  • -Iter 100000: Define o número de cálculos que o PBKDF2 usará.
  • -deve: O uso de um valor de sal aplicado aleatoriamente torna a saída criptografada diferente cada vez, mesmo que o texto simples é o mesmo.
  • -passe passe: 'pick.your.password’: A senha que precisaremos usar para descriptografar a senha remota criptografada. Substituir pick.your.password com uma senha forte de sua escolha.

A versão criptografada de nosso rusty!herring.pitshaft A senha é escrita na janela do terminal.

Senha criptografada escrita na janela do terminal

Para decifrar isso, precisamos passar essa string criptografada para openssl com os mesmos parâmetros que usamos para criptografar, mas adicionando o -d (decifrar) opção.

echo U2FsdGVkX19iiiRNhEsG + wm / uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -passe de sal:'escolha.sua.senha'

A string é descriptografada e nosso texto original, a senha da conta do usuário remoto, está escrito na janela do terminal.

Senha descriptografada escrita na janela do terminal

Isso mostra que podemos criptografar com segurança a senha de nossa conta de usuário remoto. Também podemos descriptografá-lo quando precisarmos usando a senha que fornecemos no estágio de criptografia..

Mas, Isso realmente melhora a nossa situação? Se precisarmos da senha de criptografia para quebrar a senha da conta remota, Certamente, a senha de descriptografia deve estar no script? Nós vamos, se isso acontecer. Mas a senha da conta do usuário remoto criptografada será armazenada em um arquivo oculto diferente. As permissões no arquivo impedirão que qualquer pessoa, exceto você, (e o usuário root do sistema, evidentemente) Acesse isso.

Para enviar a saída do comando de criptografia para um arquivo, podemos usar o redirecionamento. O arquivo é chamado “.secret_vault.txt”. Mudamos a senha de criptografia para algo mais robusto.

echo 'enferrujado!herring.pitshaft ' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -passe de sal:'segredo # cofre!senha' > .secret_vault.txt

Nada visível acontece, mas a senha é criptografada e enviada para o arquivo “.secret_vault.txt”.

Podemos testar se funcionou quebrando a senha no arquivo oculto. Observe que estamos usando cat aqui no echo.

cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -passe de sal:'segredo # cofre!senha'

A senha foi descriptografada com sucesso a partir dos dados do arquivo. Usaremos chmod para alterar as permissões deste arquivo para que ninguém mais possa acessá-lo.

chmod 600 .secret_vault.txt
ls -l .secret_vault.txt

Usando uma máscara de permissões 600 remove todos os acessos para qualquer pessoa que não seja o proprietário do arquivo. Agora podemos passar a escrever nosso roteiro.

RELACIONADO: Como usar o comando chmod no Linux

Use OpenSSL em um script

Nosso roteiro é bem simples:

#!/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 -passe de sal:'segredo # cofre!senha')

# 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 "-" $(encontro) >> /home/$REMOTE_USER/script.log
_remote_commands
  • Definimos uma variável chamada REMOTE_USER uma “geek”.
  • Em seguida, definimos uma variável chamada REMOTE_PASSWD ao valor da senha descriptografada extraída do arquivo ".secret_vault.txt", usando o mesmo comando que usamos agora.
  • A localização do computador remoto é armazenada em uma variável chamada REMOTE_LINUX.

Com essa informação, podemos usar o ssh comando para conectar ao computador remoto.

  • a sshpass command é o primeiro comando na linha de conexão. Usamos com -p (senha) opção. Isso nos permite especificar a senha que deve ser enviada para o ssh comando.
  • Nós usamos o -T (desabilitar mapeamento de pseudo-terminal) com opção ssh porque não precisamos ter um pseudo-TTY atribuído no computador remoto.

Estamos vestindo um short aqui documento para passar um comando para o computador remoto. Tudo entre os dois _remote_commands strings são enviadas como instruções para a sessão do usuário no computador remoto; para este caso, é uma única linha do script bash.

O comando enviado ao computador remoto simplesmente registra o nome da conta de usuário e um carimbo de data/hora em um arquivo chamado “script.log”.

Copie e cole o script em um editor e salve-o em um arquivo chamado “go-remote.sh”. Lembre-se de alterar os detalhes para refletir o endereço do seu próprio computador remoto, conta de usuário remoto e senha de conta remota.

Usar chmod para tornar o script executável.

chmod + x go-remote.sh

Só falta tentar. Vamos começar nosso script.

./go-remote.sh

Porque nosso script é um modelo minimalista para um script autônomo, não há saída no terminal. Mas se verificarmos o arquivo “script.log” no computador Fedora, podemos ver que as conexões remotas foram feitas com sucesso e que o arquivo “script.log” foi atualizado com timestamps.

cat script.log

Sua senha é privada

A senha da sua conta remota não está registrada no script.

E mesmo quando a senha de descriptografia isto é, no script, ninguém mais pode acessar seu arquivo “.secret_vault.txt” para descriptografá-lo e recuperar a senha da conta remota.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.