terça-feira, 26 de maio de 2015

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

Introdução

Nos posts anteriores [1, 2] eu ensinei a 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.

Nesse post eu vou 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.

O servidor que recebe o arquivo será tratado neste documento como Servidor Destino e o servidor que envia o arquivo como Servidor Origem.
Lembrando que se existir a necessidade dos servidores trocarem arquivos entre si, será necessário realizar os dois procedimentos (origem e destino) em ambos os servidores.

Procedimentos Servidor Origem

Gerar o par de chaves Pública/Privada

# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/teste/.ssh/id_rsa): <ENTER>
Created directory '/home/teste/.ssh'.
Enter passphrase (empty for no passphrase): <ENTER>
Enter same passphrase again: <ENTER>
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:
79:2d:88:c4:35:1e:be:8f:f2:c1:df:dc:ae:27:b0:39 teste@private.localhost
The key's randomart image is:
+--[ RSA 2048]----+
|        +        |
|     . + o       |
|      o o        |
|     . . + .     |
|      . S o .    |
|       . +..     |
|      . + .+     |
|       o oEo...  |
|        . ..+=o  |
+-----------------+


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, nesse caso vamos criar uma chave sem senha, portanto basta pressionar Enter.

Copiar a Chave Pública

# cat /home/teste/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxka6+ntfEcwUMCXYRpCS9im8yJrlyp/+LhFh3K/X0Ad5QPUlUTTklZ2bDps4CdKNbQf/6T4j1nu/ylJwUHBBJyK6y8uZDXCjCtjCcZfLsO8pSLjsmYJfKqXeD50y+zSYqC9GB+HeQf+It09unQt5gTvGtfgWdKzq2hchfpkEEgWQD0mKyQZAl5cU2SbmLMJV8YxfBpwAONyj7ARKtUrkW3XcVa+QKFdYFTfHshMdcBCAsGuO6tDFmWSRjcEkYHgyNaaeIufOwHPvLzs4TVk3/NmOC1Pd1bYUcmEQslL0U6UPun9X8A6aNs3eu6JgOWWifze6bxgshp9dKVJHlgAxbQ== 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.

Procedimentos Servidor Destino

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 authorized_keys
# 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.

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

Testar a conexão - Partindo do Servidor Origem

# ssh teste@servidor_destino

The authenticity of host '[servidor_destino]:1922 ([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.

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


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


Observações:
Se você mudar 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 -p
2891' teste teste@servidor_destino:/home/teste/

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

Observação:
Todas as recomendações de segurança dos posts anteriores devem ser implementadas.

terça-feira, 19 de maio de 2015

Acesso via SSH por Chave Pública entre Servidores Linux

Introdução

No post anterior ensinei a criar um par de chaves publica/privada através de utilitários no Windows, e acessar um servidor Linux.
Agora vou demonstrar como gerar o seu par de chaves em um servidor Linux, tratado neste post como Servidor Origem, como disponibiliza-la em outros servidores que você deseja acessar, tratados neste post como Servidor Destino. E por último, mas não menos importante, como importar essa chave para ser utilizada nos utilitários no Windows.

Gerar o par de chaves Pública/Privada no Servidor Origem

# 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.

Procedimentos Servidor Destino

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 authorized_keys
# 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.

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

Testar a conexão - Partindo do Servidor Origem

$ 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.

Converter a chave gerada no Linux para ser usada no Putty

Pode ser necessário em algum momento utilizar essa 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, basta seguir o post anterior.Você pode realizar o acesso pelo Windows normalmente, a chave importada contém o mesmo hash da chave original.

Observação:
Todas as recomendações de segurança do post anterior devem ser implementadas. 

terça-feira, 12 de maio de 2015

Acesso via SSH por Chave Pública

 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.

Gerar a chave no 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á nos 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 conteudo 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.

Configurações no Servidor Linux

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 já era) - Dica do meu amigo Gesiel.

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

Testar a conexão

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 meu usuário, mas sim a senha da minha chave privada. Aquela que nós definimos no momento da criação da chave.


E agora estamos logados.


Incrementar a segurança do SSH

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
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys
RSAAuthentication yes
PubkeyAuthentication yes
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

# service sshd restart

Testar acesso com usuário e senha

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 ;-)

Referências

Locaweb
Man sshd_config
Fórum FreeBSD