Conexões SSH, SCP, Rsync e Scripts usando Chave Pública e Privada

1. Introdução

    A maioria dos administradores de rede toma alguma ação com relação ao serviço de ssh, como, por exemplo, não permitir login como root, alterar a porta default do serviço, tudo isso pode e deve ser feito, mas o objetivo dessa documentação é implementar uma camada a mais de segurança, o uso de chaves.

    Isso deve ser implementado em todos os seus servidores, pois mesmo sendo um servidor interno da sua rede, ele ainda está exposto aos atacantes internos e aos ataques automatizados através de botnet. Algum usuário da sua rede pode estar atacando seu servidor sem nem suspeitar disso.

2. Termos usados nesse documento:

Servidor onde a chave é gerada: Servidor Origem.
Servidor que desejamos conectar: Servidor Destino.
Chave Pública: Chave que compartilhamos no Servidor Destino.
Chave Privada: Chave utilizada no Servidor Origem no momento da conexão.

3. Gerar o par de chaves – Servidor Origem
3.1 Servidor Windows

Para gerar a chave no Windows vamos utilizar um utilitário chamado Puttygen. Baixe o executável e inicie o mesmo.

A tela inicial já vem configurada para chave SSH-2 RSA de 2048 bits, clique no botão Generate.

 

Movimente o mouse na área sem dados para gerar a senha.

Na parte superior temos a chave pública que será colocada no servidor, selecione o seu conteúdo e copie para um txt temporário.

A segunda seleção é onde você deve cadastrar uma senha para sua chave privada, crie a maior senha que você consiga lembrar, se alguém quebrar essa senha você perdeu sua chave privada.

E na última seleção temos a opção de salvar a chave pública e privada. Salve apenas a chave privada.

3.2 Servidor Linux

Para gerar a chave no Linux vamos utilizar o comando ssh-keygen.

 # ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/teste/.ssh/id_rsa): <ENTER>
Enter passphrase (empty for no passphrase): <SENHA DA CHAVE PRIVADA>
Enter same passphrase again:
<SENHA DA CHAVE PRIVADA>

Your identification has been saved in /home/teste/.ssh/id_rsa.
Your public key has been saved in /home/teste/.ssh/id_rsa.pub.
The key fingerprint is:
fc:21:f9:9f:1e:45:9d:3f:fa:40:45:70:d6:bb:7f:b1 teste@private.localhost

The key’s randomart image is:
+–[ RSA 2048]—-+
|             ..+.|
|              +.o|
|              .oo|
|       . .   ….|
|        S .  …o|
|         + ….o.|
|          o .o  +|
|           . ooEo|
|           .+  ..|
+—————–+

Observações:

Created directory ‘/home/teste/.ssh’. – Aparece apenas na primeira vez que a chave é criada;

Enter passphrase (empty for no passphrase): – É a senha para sua chave privada, quanto maior a frase maior a segurança da chave. Quando fornecendo uma frase-chave, ela não é exibida na tela (nem mesmo *s aparecerão).

 Copiar a Chave Pública

# cat /home/teste/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1iQX//ED02Ranp2M4GD4uQCVtDjMg5nArtUDz0Voblvz02fcnmUePu36TU85q6eHf4RlR3z/w0wNmz4b4haQRoMmIMZSi4TxYZKtyUIHipiQkCt+TpLNZm9chekLCn5pMGB4DSpL2XJC5N2Yw12w5HNKvAXZOUqUnKK+lX5G/YYM+Td0p/t+PG3E3ZjSy9kMDDpc61uGz/BjnIvrSFj+rot5l5tn2mynmfb4lhTkLE+0Ot30+q+s9IkK7J33+Y4cpEX+jMb4MvfdEyUUnjjZPgGlaXggsaKrE5ZMUhGvmIX0t/b81DRxtpI+1iu01/GHOUZ5EoSTo/EsUAViXrPV6w== teste@private.localhost

 Copie esta chave para um txt temporário, pois ela será necessária no Procedimento Servidor Destino.

Obs.: As informações da chave acima estão em uma única linha.

3.3. Converter a chave gerada no Linux para ser usada no Putty

Pode ser necessário em algum momento utilizar a chave gerada no Linux, para acessar o Servidor Destino a partir de uma máquina Windows, para isso será necessário converter a chave, mas o processo é bem simples.

Copie a chave para o Windows e abra o Puttygen

Na tela principal clique em Load

Mude o tipo de arquivo para All Files e selecione a chave privada gerada no Linux

Digite a senha da sua chave privada

Será exibida a mensagem que a chave foi importada com sucesso clique em OK

Agora você pode visualizar a sua chave pública e salvar a chave privada

De posse das chaves devidamente importadas pelo Puttygen você pode realizar o acesso pelo Windows normalmente, a chave importada contém o mesmo hash da chave original.

4. Configurações no Servidor Linux – Servidor Destino
4.1 Criar o usuário e configurar o acesso via chave

Crie o usuário no Linux
# adduser teste

Entre no diretório do usuário
# cd /home/teste/

Crie o diretório.ssh
# mkdir .ssh

Acesse o diretório
# cd .ssh/

 Crie o arquivo.

# vi authorized_keys

 Dentro desse arquivo você vai colocar o conteúdo da chave pública, aquela que você colou em um arquivo temporário. Tenha certeza de que não houve quebra de linha, se você colar no Word por exemplo, ele vai quebrar a chave em várias linhas, e fará com que a chave não funcione.

Uma boa prática é colocar uma linha com a identificação do servidor:

# Servidor 01
<CHAVE>

# Servidor 02
<CHAVE>

Dica do grande amigo Andreyev

 Altere as permissões do diretório
# chmod 700 .

E do arquivo
# chmod 600 authorized_keys

E por último de todo o diretório .ssh
# chown -R teste:teste /home/teste/.ssh

5. Testar a conexão – Servidor Origem
5.1 Servidor Windows

Para se conectar ao servidor Linux vamos utilizar outro utilitário o Putty. Baixe o executável e inicie o mesmo

 Em Session informe o IP e Porta do Servidor

Em Connection // Data informe o nome do usuário

Em Connection // SSH // Auth informe o caminho da sua chave privada e clique em Open.

Observe que ele não pede a senha do usuário, mas sim a senha da chave privada. Aquela que nós definimos no momento da criação da chave.

E agora estamos logados.

5.2 Servidor Linux

$ ssh teste@servidor_destino
The authenticity of host ‘[servidor_destino]:22 ([192.168.100.2]:22)’ can’t be established.
RSA key fingerprint is 3e:99:b4:aa:c6:8a:e2:e0:e0:55:d4:f8:01:76:2a:8b.
Are you sure you want to continue connecting (yes/no)? <yes>
Warning: Permanently added ‘[servidor_destino]:22,[192.168.100.2]:22’ (RSA) to the list of known hosts.
Enter passphrase for key ‘/home/teste/.ssh/id_rsa’: <SENHA DA CHAVE>
Last login: Wed May 13 17:43:38 2015 from servidor_origem

[teste@servicor_destino ~]$ logout
Connection to servidor_destino closed.

Observações:
Essas mensagens informando que a conexão não foi possível e que vai adicionar o host ao arquivo know hosts só aparece na primeira conexão.

6. Incrementar a segurança do SSH – Servidor Destino

Uma vez logados com sucesso, chegou a hora de incrementarmos a segurança do SSH no servidor Linux. Para isso execute o login como root e edite o arquivo sshd_config

# vi /etc/ssh/sshd_config
# Alterar a porta padrao
#Port 22
Port 2891

# Proibir login como root, os usuarios devem usar o su –
#PermitRootLogin yes
PermitRootLogin no

# Liberar acesso via chave
#RSAAuthentication yes
RSAAuthentication yes
#PubkeyAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

# Proibir o acesso via senha
#PasswordAuthentication yes
PasswordAuthentication no

Se o servidor em questão for um FreeBSD altere também a diretiva abaixo:

#ChallengeResponseAuthentication no
ChallengeResponseAuthentication no

# service sshd restart

7. Testar acesso com usuário e senha – Servidor Origem Windows

Ao tentar se logar passando um nome de usuário a mensagem abaixo é exibida

Pronto! Basta acessar passando a sua chave privada e a porta correta

8. Manipulação de arquivos via SCP, Rsync e Scripts por Chave Pública e Privada

Até agora demonstramos como criar um par de chaves publica/privada através de utilitários no Windows e no Linux, e como acessar os servidores utilizando essas chaves. Agora vamos demonstrar como criar chaves sem senha que serão utilizadas para realizar cópias de arquivos via scp e rsync, e em servidores onde existe a necessidade de realizar cópias automatizadas (via scripts), dispensando assim a necessidade de digitação e/ou armazenamento de senhas.

Observações:
Apesar da conexão sem senha, esse procedimento é infinitamente mais seguro do que armazenar senhas em scripts.
Se existir a necessidade dos servidores trocarem arquivos entre si, será necessário realizar os dois procedimentos (origem e destino) em ambos os servidores.

8.1 Procedimentos Servidor Origem: Gerar o par de chaves Pública/Privada

Ver item 3.2, a única diferença é que no momento de informar a chave privada iremos simplemente teclar Enter:
Enter passphrase (empty for no passphrase): <ENTER>
Enter same passphrase again: <ENTER>

8.2  Procedimentos Servidor Destino: Criar o usuário e configurar o acesso via chave

Ver item 4.1.

8.3 Testar a conexão – Partindo do Servidor Origem

# ssh teste@servidor_destino
The authenticity of host ‘[servidor_destino]:2891 ([192.168.100.2]:22)’ can’t be established.
RSA key fingerprint is 3e:99:b4:aa:c6:8a:e2:e0:e0:55:d4:f8:01:76:2a:8b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘[servidor_destino]:22,[192.168.100.2]:22’ (RSA) to the list of known hosts.

[teste@servidor_destino ~]$
[teste@servidor_destino ~]$ logout
Connection to servidor_destino closed.

Observações:
Essas mensagens informando que a conexão não foi possível e que vai adicionar o host ao arquivo know hosts só aparece na primeira conexão.

8.4 Copiar um arquivo do Servidor Origem para o Servidor de Destino usando scp

# scp teste.txt teste@servidor_destino:/home/teste
teste.txt                                     100%    0     0.0KB/s   00:00

8.5 Copiar um arquivo do Servidor Origem para o Servidor de Destino usando rsync

# rsync -Cravzp teste teste@servidor_destino:/home/teste/
sending incremental file list
teste/
teste/teste.txt
teste/teste01.txt
teste/teste02.txt
teste/teste03.txt

sent 270 bytes  received 92 bytes  724.00 bytes/sec
total size is 0  speedup is 0.00

8.6. Procedimentos após incrementar a segurança do SSH:

Como mudamos a porta do SSH nos Servidores a sintaxe dos comandos passam a ser:

# scp -P 2891 teste.txt teste@servidor_destino:/home/teste
# rsync -Cravzp –rsh=’ssh -p2891′ teste teste@servidor_destino:/home/teste/

Os mesmos procedimentos podem ser usados em scripts, sem a necessidade de senhas.

9. Referências

Locaweb

Man sshd_config

Fórum FreeBSD