Artigo do tipo Tutorial
Recursos especiais neste artigo:
Conteúdo sobre boas práticas.
SSH – Protocolo seguro para acesso remoto
Neste artigo serão apresentadas as principais características do protocolo SSH, bem como as novas instalações, configurações e customizações introduzidas em seu arquivo de configuração. Serão descritos os diferentes tipos de opções e seus parâmetros padrão. Além disso, serão apresentadas algumas mudanças que podem ocasionar melhor desempenho e melhor segurança dependendo do ambiente de produção onde se encontra instalada a ferramenta SSH. Por fim, serão expostas as técnicas de túneis criptográficos, e a utilização de chaves simétricas e assimétricas.


Em que situação o tema é útil

Os pontos destacados neste artigo serão úteis para a compreensão do protocolo SSH, bem como de suas principais diferenças quando comparado a outras ferramentas de conexão remota. Os conceitos expostos também permitirão o aprofundamento técnico do tema pelos profissionais e usuários da área de infraestrutura de tecnologia da informação.

Atualmente a maioria das empresas hospeda seus serviços e aplicações de banco de dados fora de suas instalações e dentro de grandes datacenters. Estes oferecem toda instalação e segurança necessárias, com as devidas redundâncias, para sempre manter os serviços executando de forma confiável.

Neste cenário, é natural que você queira fazer conexões remotas nesses servidores para alteração de configuração de algum serviço ou aplicação, atualização de segurança, instalação de algum serviço adicional, copiar arquivos do seu computador para o servidor ou vice-versa. Para executar todos esses passos temos diversas ferramentas como FTP, RCP, Telnet, Rlogin, RSH, SSH entre outros.

Infelizmente, muitos desses programas relacionados a acesso remoto têm um problema fundamental, eles não possuem segurança eficaz. Na tentativa de transmitir um arquivo confidencial através da rede, um intruso pode parcialmente interceptar os dados utilizando ferramentas de sniffer e lê-los (ler Nota DevMan 1). Um exemplo deste problema pode ser encontrado na utilização do Telnet (ler Nota DevMan 2). Este protocolo não aplica criptografia nos dados transmitidos, o que deixa sua comunicação exposta na rede.

Na Figura 1 temos um exemplo do wireshark, uma ferramenta de sniffer de rede capturando dados de uma comunicação realizada com Telnet. Podemos perceber que nos dados transmitidos nessa comunicação não são aplicados hash de criptografia, o que torna fácil identificar os dados transmitidos na comunicação.

Nota DevMan 1. Sniffer

Sniffer (analisador de pacote de rede) é uma ferramenta capaz de interceptar e registrar o tráfego de dados em uma rede de computadores. À medida que os dados trafegam na rede, o sniffer captura os pacotes e os decodifica.


Nota DevMan 2. Telnet

Telnet é um protocolo de conexão remota que permite a comunicação de terminais e de aplicações através da internet.

Figura 1. Capturando dados de comunicação Telnet.

Para amenizar esses problemas você pode utilizar um Firewall que proteja os computadores da rede de um intruso, pode utilizar hash de comunicação para embaralhar os dados tornando sua leitura impossível, ou utilizar o SSH. O SSH é uma ferramenta com ênfase em segurança que utiliza um conjunto de técnicas de criptografia para assegurar que apenas a pessoa autorizada possa conectar ao servidor e que todos os dados transmitidos sejam impossíveis de decifrar mantendo, dessa forma, a integridade da conexão. A ferramenta possui diversas respostas a ataques conhecidos. Por exemplo: o SSH detecta casos em que o servidor tenha sido trocado por outro; situações nas quais se tenta injetar dados na conexão (tirar proveito de uma conexão aberta para incluir pacotes na conexão, alterando as informações passadas); e técnicas de ocultação de pacotes, o que torna mais difícil descobrir em qual pacote criptografado foi transmitida a senha.

Neste contexto, para tentarmos obter uma transmissão segura dos dados em nossa rede, abordaremos a partir de agora a instalação, configuração e customização da ferramenta SSH. Esta possui grande eficiência em termos de segurança na transmissão de dados e comunicação remota.

O que é SSH?

Desenvolvido por Tatu Ylonen em 1995 para uso no Unix, o SSH (Secure Shell) é uma ferramenta de acesso remoto com grande ênfase em segurança. Com o SSH, sempre que os dados forem enviados de uma máquina para outra, os dados enviados de host a host serão automaticamente criptografados e descriptografado (trata-se de uma criptografia transparente).

Caso você tenha alguma desconfiança sobre algoritmos de criptografia (por exemplo, se os mesmos podem ser quebrados com força bruta), considere a seguinte situação que demonstra como o algoritmo utilizado pelo SSH é confiável: uma chave de 64 bits que era utilizada no SSL dos navegadores necessitaria de um cluster de 250 servidores Xeon para quebrar a senha, que é 16 milhões de vezes mais forte que uma de 40 bits utilizada em protocolos WEP. Já a chave de 128 bits é 19.567.000.000.000.000.000 vezes mais forte que uma chave de 64 bits, o que tornaria o processo muito demorado. Um servidor SSH bem configurado é de certa forma impenetrável e você pode utilizá-lo de forma segura mesmo se sua rede estiver comprometida.

O SSH utiliza um conjunto de algoritmos de criptografa moderno e seguro para permitir a transmissão confiável de dados em sua conexão, mantendo assim a integridade das informações transmitidas. Sua arquitetura cliente/servidor, normalmente instalada e executada por um administrador de sistema, pode utilizar o SSH para aceitar e rejeitar conexões de entrada para seu host, limitando os IPs ou o range de IPs que poderão iniciar a conexão com o servidor SSH.

A Figura 2 apresenta um modelo cliente/servidor de uma conexão SSH onde os hosts com permissão de iniciar a conexão conseguiram acesso e os hosts sem permissão tiveram a conexão bloqueada pelo servidor SSH.

Figura 2. Comunicação Cliente/Servidor do Protocolo SSH.

O SSH utiliza um conjunto de criptografia de chaves assimétricas onde, além de uma chave pública que permite que todos possam criptografar os dados, existe uma chave privada que apenas as máquinas que irão fazer a conexão possuem para poder descriptografar os dados. Quando o usuário se conecta a um servidor SSH, seu host e os servidores trocam suas chaves públicas, permitindo que um envie informações para o outro de forma segura. É através deste canal que é feita a autenticação, seja ela por login e senha, seja utilizando uma chave e passphrase.

O SSH realiza a conexão entre o cliente e o servidor sempre utilizando chaves de 512 bits. Desta forma, é praticamente impossível quebrar este nível de criptografia. Entretanto, ele demanda um grande volume de processamento, e se o SSH transmitisse toda informação com esse algoritmo, sua comunicação ficaria muito lenta. Para resolver esse problema, depois de ter feito a autenticação, o SSH utiliza um algoritmo mais simples para transmitir os dados entre o cliente e o servidor. Este algoritmo mais simples demanda menos processamento para transmitir os dados, tornando a comunicação mais eficiente.

Na Figura 3 temos um exemplo de um túnel SSH encriptado, onde cliente e servidor realizam a autenticação para transmissão dos dados.

Figura 3. Túnel encriptado na comunicação do protocolo SSH.

O SSH é dividido em dois módulos:

· sshd: é o daemon (script para inicialização ou parada de um serviço) do serviço do protocolo SSH, e fica residente no servidor;

· ssh: é apenas uma aplicação instalada no cliente para fornecer uma interface de comunicação com o servidor.

Para instalar o SSH em um servidor derivado de distribuição Debian, devemos executar o seguinte comando no terminal:

# apt-get install openssh-server

Para realizar a mesma instalação utilizando uma distribuição derivada da família Red Hat, executamos o mesmo comando, trocando apenas o gerenciador de instalação para o da família Red Hat:

# yum install openssh-server

Feita a instalação em modo servidor, o serviço do SSH já é iniciado automaticamente durante o boot, mas caso tenha algum problema e o daemon não seja iniciado automaticamente, você poderá iniciá-lo da seguinte forma:

· Debian:#/etc/init.d/sshd start

· Red Hat:# service sshd start

O SSH utiliza a porta 22 para se conectar, havendo a possibilidade de alterá-la (mas não entraremos nesse detalhe). Por conta disso, é necessário manter a porta 22 no firewall aberta, pois o protocolo SSH utiliza essa porta para comunicação, e caso a porta esteja fechada, a comunicação será filtrada ou negada pelo firewall.

Concluída a instalação do servidor SSH que irá disponibilizar o serviço necessário para comunicação, é preciso instalar o cliente SSH. Este é a ferramenta utilizada para efetuar a comunicação com o servidor. O pacote openssh-client é o cliente do SSH utilizado para se comunicar com o servidor.

A configuração do servidor SSH baseado na distribuição Unix-like mantém seu arquivo de configuração em /etc/ssh/sshd_config, e /etc/ssh/ssh_config para o pacote instalado no cliente.

Configuração do servidor SSH

É possível alterar diversas opções relacionadas ao servidor SSH, bastando apenas editar o arquivo /etc/ssh/sshd_config. Alguns exemplos de configuração são: a porta de comunicação, a lista de IPs que o protocolo irá permitir conectar, a versão do protocolo a ser utilizada e os usuários que poderão se conectar ao servidor SSH.

Os arquivos de configuração do servidor e do cliente SSH já vêm com configurações padrão da porta de comunicação, versão do protocolo SSH a ser utilizada e a lista de IPs que poderão se conectar no servidor SSH. Isto possibilita que eles já possuam uma segurança razoável. Entretanto, é sempre necessário alterar as opções do arquivo de configuração do servidor SSH de acordo com a necessidade da empresa, trazendo uma tranquilidade maior e evitando qualquer tipo de incômodo que possa ocorrer por causa de um intruso.

Conheceremos a partir de agora algumas das principais opções relacionadas ao arquivo de configuração do servidor SSH.

Porta

Esta é a primeira linha do arquivo de configuração do servidor SSH. Como já mencionado, a porta padrão de comunicação é a de número 22.

Algumas empresas adotam um padrão mais rigoroso de segurança e alteram essa porta para uma porta acima de 1024, pois a maioria dos scanners de portas é baseada em assinaturas de portas já conhecidas, ou seja, serviços que por padrão definem uma porta para execução. Dessa forma será dificultada a identificação do serviço que está em execução na porta do servidor. Portanto, ao conectar com o cliente no servidor SSH, é necessário usar a opção -p no cliente para indicar a porta de conexão. Por exemplo:

# ssh -p 2229 fandezhi.efglobe.com

Outra forma de se comunicar com o servidor SSH em uma porta diferente da padrão é alterar o arquivo de configuração do cliente SSH e alterar o campo Port para a porta utilizada pelo servidor SSH. Esse tipo de técnica vem sendo utilizada porque a maioria dos ataques já faz rastreamento em portas padrões de serviços como 21, 22, 23 e 80. Alterar a porta para uma mais alta deixa o servidor menos exposto.

Lista de Acesso

Logo abaixo da opção de porta no arquivo de configuração do servidor SSH, temos a opção que define a interface de rede ou IP que poderá requisitar o servidor SSH sem a necessidade de um firewall. Para exemplificar, considere um servidor SSH que rode no endereço 192.168.1.1 e você quer apenas liberar o acesso ao servidor para esse intervalo de IP. Para isso, será necessário definir a seguinte informação no arquivo de configuração:

ListenAddress 192.168.1.1

Perceba que foi necessário informar apenas o endereço IP da máquina onde o SSH roda, e não a lista de endereços completa da rede.

Protocolo

O SSH é utilizado atualmente na versão SSH2, mas alguns clientes ainda rodam o serviço na primeira versão. No campo protocol você pode especificar de quais versões o SSH irá aceitar conexões, por exemplo:

Protocol 2,1

Por questão de segurança é sempre bom deixar o SSH 1 desativado, o que neste caso iria alterar a linha no arquivo de configuração para:

Protocol 2

Usuários e Senhas

Uma das opções que podemos utilizar para o login é a seguinte:

PermitRootLogin no

Esse campo irá bloquear a conexão direta como usuário root. Esse é um parâmetro de segurança, pois o usuário terá que logar como um usuário normal, sem privilégios, e depois terá que invocar o su para se tornar root, podendo então fazer qualquer alteração no sistema. Para permitir logar diretamente como usuário root, basta alterar o campo para:

PermitRootLogin yes

Outra forma é restringir os usuários do sistema que poderão logar no servidor SSH, utilizando o seguinte parâmetro (colocando os nomes separados por espaço):

AllowUsers sotam fire

Ou negar os usuários que não poderão logar no servidor SSH:

DenyUsers beta teta

Outra opção muito utilizada é a de não permitir o usuário logar se sua senha estiver vazia. Essa restrição pode ser definida da seguinte forma:

PermitEmptyPasswords no

Banner

O banner é a opção utilizada para mostrar uma mensagem de aviso ou advertência no momento em que o prompt do terminal loga no servidor SSH. Você pode especificar esse parâmetro da seguinte forma:

Banner = /etc/issue.net

X11

Esta é uma opção utilizada para clientes que desejam executar aplicativos gráficos. Ela pode ser definida da seguinte forma:

X11Forwarding yes

Configuração do cliente SSH

Quando instalado, o SSH permite que todas as contas cadastradas no sistema façam conexão remota na máquina. Assim, para se conectar a uma máquina com IP 192.168.10.1 usando o padrão normal de conexão, teríamos:

# ssh zukiari@192.168.10.1

Você também pode utilizar a opção –l, que representa o login do usuário para conexão da seguinte forma:

# ssh -l zukiari 192.168.10.1

Além disso, você pode conectar a uma máquina em uma mesma rede apenas chamando seu nome, como em ssh zukiari@, e, caso omitido o usuário na conexão, o SSH utiliza o próprio usuário logado na máquina para tentar a conexão.

Conexões SSH que necessitem rodar aplicativos gráficos podem utilizar a opção –X. Esta irá habilitar a execução de janelas gráficas “Xterm” para a inicialização do aplicativo, ou você pode adicionar ou remover o comentário da opção “X11Forwarding = yes” do arquivo de configuração do cliente SSH.

Tempo de Execução

O SSH, por padrão, mantém um tempo de ociosidade de cada usuário e o desconecta caso ele fique sem interagir com o terminal de acesso remoto um tempo maior que o definido no arquivo de configuração. Isto pode se tornar um incômodo quando estamos trabalhando nos terminais e precisamos sempre digitar alguma informação para que não sejamos desconectados.

Para evitar esse trabalho, podemos adicionar um parâmetro que irá permitir que o cliente permaneça enviando pacotes para o servidor, mantendo desta forma a conexão aberta. Para ativar esse recurso, adicione a seguinte linha no final do arquivo SSH ou em qualquer parte do arquivo, especificando o tempo em segundos para manter a conexão aberta:

ServerAliveInterval 120

Parâmetros de autenticação com chaves

Diante da existência da possibilidade de um invasor conseguir descobrir sua senha, o SSH oferece um tipo de autenticação baseado em duas chaves. Isto melhora o nível de segurança, pois desta forma não dependemos apenas de uma senha para o login. Ao invés disso, teremos duas chaves: uma chave pública instalada no servidor SSH, e uma chave privada protegida por um passphrase. Com estas duas chaves será necessário saber o passphrase para estabelecer a conexão e ainda ter a chave privada instalada em seu computador. Sem essa chave é impossível fazer a conexão. Dessa forma, teremos uma segurança de dois níveis, onde é preciso saber o passphrase e ter a chave privada dentro do computador (ou qualquer meio de armazenamento). Para gerar essas chaves (cliente), usamos o seguinte comando:

# ssh-keygen -t rsa

A saída para esse comando pode ser vista na Listagem 1.

Listagem 1. Saída do comando de geração de chave.

Generating public/private rsa key pair.

Enter file in which to save the key 
(/zukiari/.ssh/id_rsa): 

Created directory '/zukiari/.ssh'.

Enter passphrase (empty for no passphrase): 
*********
Enter same passphrase again: 
********
Your identification has been saved in 
/zukiari/.ssh/id_rsa.

Your public key has been saved in
 /zukiari/.ssh/id_rsa.pub.

The key fingerprint is:

4e:0c:3d:fb:7d:d8:be:e5:5f:09:
e2:10:9e:d6:a8:e0 zukiari@kelevra

Este comando irá gerar os arquivos .ssh/id_rsa e .ssh/id_rsa.pub dentro do diretório do usuário que o executou. É aconselhável não utilizar o root para executar esse comando, mas sim o usuário que você utiliza para se conectar ao servidor SSH. Os arquivos gerados são respectivamente uma chave privada e uma chave pública.

O arquivo .ssh/id_rsa é um arquivo oculto e sua permissão de acesso deve ser alterada para 600, de forma a evitar o acesso do arquivo por outros usuários (alguns servidores proíbem a conexão se o arquivo estiver com permissões incorretas). Gerado o par de chaves, agora é necessário instalar a chave no servidor para que ele entenda e permita a autenticação:

# ssh-copy-id -i ~/.ssh/id_rsa.pub zukiari@serve

O comando ssh-copy-id irá copiar a chave pública gerada para o servidor e irá instalá-la no servidor. Feito isso, ao tentar logar no servidor SSH não será necessária mais a senha. O servidor irá enviar um “teste” encriptado usando a chave pública compartilhada. Para respondê-lo, o cliente SSH irá precisar de uma chave privada, que precisa de um passphrase para destravá-la.

A instalação manual dessa chave também é possível da seguinte forma: o arquivo .ssh/id_rsa.pub é composto por uma única linha muito longa que contém sua chave pública de encriptação. Ela possui o seguinte formato:

# ssh-rsa 2yVe4cBNMz5LZj7fNvaoNiYbrfgwWbD/ SzfSwMMWSMYZJV4yXQmK9

Você pode conectar no servidor SSH e copiar a linha para dentro do arquivo .ssh/authorized_keys. Isto pode ser feito usando qualquer editor de texto normal. Assim, o final do arquivo .ssh/authorized_keys do servidor SSH terá o mesmo conteúdo do arquivo .ssh/id_rsa.pub da máquina cliente, o que irá fazer o servidor remoto passar a verificar a sua chave privada com o passphrase ao invés da senha.

Dessa forma, você pode incrementar a segurança do SSH proibindo a conexão no servidor com qualquer tipo de senha, mesmo a do root, apenas habilitando o uso dos pares de chaves. Para executar esse tipo de configuração, você terá que alterar o arquivo de configuração do servidor SSH (/etc/ssh/sshd_config) modificando ou inserindo as seguintes opções:

PasswordAuthentication no

UsePAM no

O parâmetro PasswordAuthentication no irá desativar o uso de senhas e o UsePAM no desativa qualquer tipo de autenticação exceto por chaves. Em seguida, é necessário reiniciar o serviço do SSH para que as alterações entrem em vigor. Para isso, você pode proceder da seguinte forma:

# /etc/init.d/sshd force-reload

ou:

# service sshd force-reload

Existe também a possibilidade de se utilizar múltiplas chaves, ou seja, um passphrase para cada conexão que existir. Imagine que você tenha 20 servidores. Dessa forma você teria 1 passphrase para cada servidor, e não somente um passphrase para todas as conexões. Esse é um parâmetro de segurança exigido, pois se um invasor descobrir um passphrase para um servidor, terá que descobrir outro passphrase para a outra conexão. Para gerar novas chaves, use o comando ssh-keygen -t rsa, apenas prestando atenção para alterar o diretório onde você deseja salvar as chaves.

Desta forma você pode gerar quantos pares quiser e, antes da comunicação, basta utilizar o ssh-copy-id com a opção -i e especificar o caminho até a chave mais o servidor para conexão, como no exemplo:

# ssh-copy-id -i /zukiari/.ssh/id_rsa zukiari@serve

Logins automáticos com o SSH

Esta é uma opção muito utilizada por administradores de redes. Não é incomum termos que administrar mais de 20 servidores, o que acaba se tornando cansativo e monótono por conta da repetição do login a cada conexão. Uma forma de amenizar este problema é o uso do login automático. Isto pode ser feito de duas formas.

A primeira é deixar o passphrase vazio e apenas autenticar com a identificação da chave privada. Entretanto, essa é uma opção não muito utilizada por motivos de segurança, pois se alguém, de alguma forma, conseguir sua chave privada (alguém consegue acesso físico ao seu computador, copia a chave e a coloca em outra máquina), todo seu mecanismo de segurança se tornará inválido. A segunda opção é deixar que o ssh-agent grave seu passphrase na memória em uma área especial, acessível somente pelo ssh-agent. Para utilizar o ssh-agent, execute os seguintes comandos:

# ssh-agent

# ssh-add

Feito isto, ele irá solicitar seu passphrase. Informado o passphrase, o ssh-agent irá gravá-lo na memória e você não precisará mais se preocupar. Nas situações em que você tenha mais de uma chave para autenticação, basta usar o ssh-add com o caminho da chave que irá utilizar, como no exemplo:

# ssh-add /zukiari/.ssh_rsa2

Transferência de arquivos remotamente

O SSH pode ser considerado um verdadeiro canivete suíço. Além de sua segurança, ele ainda possui diversas ferramentas que podem auxiliar outros serviços. Um deles é o “scp”, uma ferramenta que permite transferir arquivos remotamente entre cliente e servidor apenas pela linha de comando. Esta facilidade pode ser executada da seguinte forma:

# scp /home/zukiari/teste.zip zukiari@server:/home/teste/Download

O scp ainda permite a utilização de alguns parâmetros que irão auxiliar você a transferir o arquivo. Um exemplo é a opção -p. Esta irá preservar as permissões dos arquivos transmitidos. Alguns exemplos destas permissões são: quem pode alterar, ler ou abrir o arquivo. Você também pode utilizar o parâmetro –r. Este faz a cópia recursivamente e é extremamente útil quando precisamos transmitir dados de um diretório inteiro. Considere que você tenha uma pasta com diversas fotos. Sem precisar comprimir, você pode utilizar o parâmetro –r e fazer a cópia de todo diretório. Você pode também utilizar o parâmetro -v (modo verbose) para mostrar o progresso e os arquivos que estão sendo copiados. Por fim, utilize o parâmetro -C para realizar a compressão dos dados e facilitar a transferência dos arquivos. Observe como ficaria nosso comando considerando este cenário:

# scp -prvC /home/zukiari/teste.zip zukiari@server:home/teste/Download

SSH no Windows

Um exemplo de cliente SSH para o Windows é o PuTTY, que inclui o PSFTP, um cliente para transferir arquivos usando comandos de transferência como: put, get, cd, lcd e pwd. Este aplicativo pode ser baixado em http://www.putty.org/.

A utilização do PuTTY para conexão é bem simples. Quando feito o download, não é necessária uma instalação. Ele é um arquivo executável apenas.

Na Figura 4 temos um exemplo de como funciona a ferramenta PuTTY dentro do Windows.

Figura 4. Utilização do PuTTY como ferramenta de conexão remota SSH no Windows.

O PuTTY permite diversos tipos de conexões como Telnet, rlogin e SSH, e também trabalha com túneis encriptados. Para iniciar uma conexão, informe o endereço IP ou o domínio do servidor que vai se conectar no campo Host Name (or IP address) na tela principal. Para customização da conexão, utilize os parâmetros do lado direito. Por exemplo: para adicionar um túnel, clique em Connections > SSH > Tunnels, na opção source port defina a porta do seu host que receberá o túnel, e na Destination, defina o endereço IP ou o domínio do servidor seguido da porta, como 192.168.10.1: 2229. Depois é só clicar em open e a conexão remota será iniciada.

Na Figura 5 temos uma visão geral das opções que a ferramenta PuTTY nos oferece para efetuar conexões remotas e opções para customização da própria ferramenta. Geralmente a conexão é efetuada apenas preenchendo os campo de IP e porta. Feito isso, basta clicar em open e um terminal idêntico ao prompt apresentado na Figura 4 será visto.

Figura 5. Putty: ferramenta utilizada para acesso remoto via SSH no Windows.

Conclusão

O protocolo SSH, além de ser uma ferramenta segura de conexão remota, possui diversas funções (como firewall interno) que permitem uma proteção bastante abrangente contra ataques tipo força bruta, DOS, DDOS, transferências de arquivos, execução de ambientes gráficos e túneis seguros. A sua utilização já se tornou padrão e até tecnologias antigas deixaram de ser adotadas, como o Telnet, que foi desativado pela Microsoft nas versões mais recentes do Windows.

Dessa forma, para evitar que seus dados sejam roubados ou sua comunicação ameaçada, uma boa prática é a utilização do protocolo SSH, que lhe traz comodidade quando estiver acessando remotamente servidores para manutenção, transferência de arquivos e instalação de serviços.

Links
PuTTY SSH – Cliente de comunicação SSH para Distribuição Microsoft Windows.

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

OpenSSH – Site com informações, atualizações e pacotes para instalação da ferramenta.
http://www.openssh.org/