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á.
- -sal: 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.
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.
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 ossh
comando. - Nós usamos o
-T
(desabilitar mapeamento de pseudo-terminal) com opçãossh
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.