SSH – Secure SHell

Muito utilizado em ambientes Unix/Linux, é um sistema de acesso remoto que implementa um serviço similar ao telnet utilizando autenticação criptográfica para confirmar a identidade de um usuário e criptografando todo o fluxo de informações entre dois hosts.

Embora o SSH seja basicamente utilizado para conexão em máquinas remotas e execução de comandos, existem outras funcionalidades como tunelamento, redirecionamento de portas, transferência de arquivos entre outras.

Para garantir segurança em uma comunicação SSH são utilizadas chaves assimétricas compostas pelo par de chaves pública/privada. A chave pública permite encriptar dados enquanto a chave privada permite desencriptar as informações que foram embaralhadas pela chave pública.

Quando criamos um par de chaves, uma será privada e a outra será pública. A chave privada é de sua propriedade e deve ser guardada em segurança; a chave pública deve ser colocada no servidor remoto. Assim, a conexão só será estabelecida se a chave privada se encaixar na chave pública.

Esquema das chaves criptográficas do SSH

Quando se conecta no servidor SSH, o cliente envia sua chave pública e requisita a chave pública do servidor.

Ao receber a chave pública do servidor, o cliente gera uma chave secreta válida para a sessão (chave simétrica), e encripta (a chave secreta) com a chave pública do servidor e envia de volta.

O servidor desencripta a chave secreta, e encripta novamente com a chave pública do cliente enviando a este para confirmação.

Após a confirmação, cliente e servidor estão mutuamente autenticados e trocam os dados criptografados com a chave de sessão.

 

Componentes do servidor SSH

O servidor ssh é composto dos seguintes itens:

Protocolo SSH

  • Define um canal seguro de comunicação.
  • Por padrão, trabalha na porta 22.
  • Existem duas versões (ssh/v1 e ssh/v2).

sshd

  • Daemon do servidor ssh que aceita requisições de clientes SSH, provendo autenticação, privacidade e integridade.

ssh

  • Utilizado no lado cliente, envia requisições ao servidor SSH para abrir a sessão de terminal remoto, transferências de arquivos ou execução de comandos.

Configuração do serviço SSH

Falando na parte de configuração do serviço SSH, antes de tudo é necessário verificar se o pacote está instalado. No Debian e seus derivados o servidor não vem instalado por padrão, então, para checar se temos o pacote:

# dpkg -l | grep ssh
ii  openssh-server                    1:5.1p1-5                  secure shell server, an rshd replacement

Caso não tenha o pacote, para instalar:

# apt-get install openssh-server

Numa instalação básica, o serviço já está pronto para ser utilizado, isto é, o servidor já está pronto para receber conexões. As configurações do ssh ficam armazenadas em /etc/ssh, nesse diretório constam os arquivos para configuração do cliente (ssh_config), servidor (sshd_config), chaves públicas e privadas simétricas e assimétricas além do arquivo moduli que o programa ssh-keygen utiliza para gerar as chaves.

No caso, vamos trabalhar com o arquivo sshd_config:

# cd /etc/ssh

Ahn, sempre que vou mexer em alguma configuração, eu faço um backup do arquivo original… afinal de contas, abençoados sejam os pessimistas, pois ele fizeram backup!

# cp sshd_config /root/backup/sshd_config.ORIGINAL

Acima, só copiei o arquivo sshd_config para o meu diretório de backup com o nome sshd_config.ORIGINAL. Falando sobre as principais linhas do arquivo de configuração:

# vi sshd_config

  • Port 22 – Essa linha indica a porta em que o servidor SSH irá atender as conexões. A porta padrão é a 22, mas podemos mudar esse número para sair do padrão, colocando por exemplo, 1994… aí a linha ficaria assim: Port 1994. No meu caso, estou deixando a porta padrão mesmo.
  • ListenAddress 192.168.0.103 – Essa opção especifca o IP da interface de rede que o servidor SSH irá escutar. O padrão é 0.0.0.0; ou seja escuta em todas interfaces, para melhorar a segurança, limite aqui os endereços das interfaces que o servidor poderá escutar.
  • Protocol 2 –  Versão do protocolo utilizado. Existe a versão 1 e 2; configurar sempre a versão 2 por ser mais segura. Em algumas distros, essa linha pode vir com as duas versões do protocolo, deixar somente uma.
  • KeyRegenerationInterval 3600 – Essa linha indica o tempo (em segundos) para renegociação da chave de sessão.
  • ServerKeyBits 768 – Tamanho da chave. 768 é o padrão
  • LoginGraceTime 120Timeout (em segundos) da conexão SSH caso não haja sucesso no login.
  • PermitRootLogin yes – Habilita o usuário root a fazer login via SSH. Como o root é o super-poderoso administrador da máquina, por questões de segurança, crie um usuário comum para fazer login e depois virar root; sendo assim, altere o valor desse parâmetro para ‘no’.
  • RSAAuthentication yes – Habilita a autenticação através de chave pública. Essa opção só se aplica ao protocolo versão 1.
  • PubkeyAuthentication yes – Habilita a autenticação através de chave pública. Essa opção só se aplica ao protocolo versão 2.
  • PermitEmptyPasswords no – Desabilita a autenticação de usuários sem senha.
  • PasswordAuthentication yes – habilita a autenticação baseada em senha

Após realizar as alterações no sshd-config, bastar salvar o arquivo e reiniciar o serviço:

# /etc/init.d/ssh restart

Checando se o serviço está no ar:

# netstat -antp | grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2858/sshd

# fuser -v 22/tcp
USER        PID ACCESS COMMAND
22/tcp:              root       2858 f…. sshd

Com o serviço no ar, é hora de realizar o teste de conexão. E para não haver confusão em quem é cliente e servidor:

  • Servidor SSH – Permite outras máquinas realizarem a conexão.
  • Cliente SSH – Apenas realiza a conexão em uma máquina que tenha o servidor SSH configurado.

Testando a conexão

Existem diversas formas para realizarmos a conexão SSH, a sintaxe do comando para isso é:

# ssh <nome_do_usuário_remoto>@<ip_do_servidor>

No meu ambiente, estou considerando que a máquina 192.168.0.108 é o servidor SSH, e irei utilizar o usuário nixi para estabelecer a conexão remota. A sintaxe do comando acima fica assim:

# ssh nixi@192.168.0.108

No futuro, não aparecerá a mensagem de autencidade do host, como mostrado abaixo (é a primeira conexão que faço para a a máquina 192.168.0.108), porém esse aviso aparece quando o sistema detecta uma diferença na chave pública retornada pelo host remoto e a chave pública que temos. O arquivo que guarda as chaves públicas reside em ~/.ssh/known_hosts (lembrando que ‘~’ significa o diretório home do usuário logado ;)).

Para estabelecer a conexão, basta responder ‘yes‘ (sem as aspas!) e será solicitada a senha do usuário. Após informar a senha, será retornado o prompt do terminal remoto:

# ssh nixi@192.168.0.108
The authenticity of host ‘192.168.0.108 (192.168.0.108)’ can’t be established.
RSA key fingerprint is 8b:51:62:94:52:01:1e:74:d6:8e:7c:b9:39:37:fb:ff.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.0.108’ (RSA) to the list of known hosts.
nixi@192.168.0.108’s password:
Linux nixi 2.6.26-2-686 #1 SMP Thu Sep 16 19:35:51 UTC 2010 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Feb 18 22:38:39 2011 from 192.168.0.103
nixi@nixi:~$

Acima, acessei como um usuário comum, se for utilizar comandos que necessitam do poder do root, será necessário utilizar o comando su.

Para sair da máquina remota, basta executar o comando logout:

nixi@nixi:~$ logout
Connection to 192.168.0.108 closed.

Outras coisas para fazer com o ssh…

  • Executar comandos remotamente, o usuário faz o login via ssh e depois que o resultado do comando é exibido, a conexão com o servidor é fechada:

$ ssh nixi@192.168.0.108 df -h
nixi@192.168.0.108’s password:
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             1.3G  110M  1.2G   9% /
tmpfs                  62M     0   62M   0% /lib/init/rw
udev                   10M  652K  9.4M   7% /dev
tmpfs                  62M     0   62M   0% /dev/shm
/dev/sda1             137M   15M  116M  11% /boot
/dev/sda5             942M   18M  877M   2% /home
/dev/sda8             471M   11M  437M   3% /tmp
/dev/sda6             942M  277M  618M  31% /usr
/dev/sda7             471M   85M  362M  19% /var

  • Fazer cópias (download ou upload) de arquivos ou diretórios utilizando o comando scp:

Exemplo de download:

$ scp nixi@192.168.0.108:~/teste_download_nixi.txt /tmp
nixi@192.168.0.108’s password:
teste_download_nixi.txt                       100%    0     0.0KB/s   00:00

$ ls -l /tmp/teste_download_nixi.txt
-rw-r–r– 1 ivani ivani 0 2011-02-20 19:39 /tmp/teste_download_nixi.txt

Apenas copiei o arquivo teste_download_nixi.txt para minha máquina local (lembrando que temos que salvar o arquivo em um diretório que temos permissão de escrita!).

Exemplo de upload:

$ scp teste_nix.txt nixi@192.168.0.108:
nixi@192.168.0.108’s password:
teste_nix.txt                                 100%    0     0.0KB/s   00:00

$ ssh nixi@192.168.0.108 ls -l teste_nix.txt
nixi@192.168.0.108’s password:
-rw-r–r– 1 nixi nixi 0 2011-02-18 23:05 teste_nix.txt

Acima, copiei o arquivo teste_nix.txt para a máquina 192.168.0.108; depois eu chequei remotamente se o arquivo realmente estava lá.

Para copiar diretórios, a sintaxa é praticamente a mesma, com a diferença que temos que acrescentar a opção -r:

Exemplo de download:

Copiar o diretório /root/backup da máquina 192.168.0.108 para o diretório /tmp da minha máquina:

$ scp -r root@192.168.0.108:~/backup /tmp

Exemplo de upload:

Enviar o diretório nixi_bkp para a máquina 192.168.0.108 no diretório /tmp:

$ scp -r nixi_bkp root@192.168.0.108:/tmp/

Depois, conferi remotamente se o diretório estava no servidor remoto:

$ ssh root@192.168.0.108 ls -ld /tmp/nixi_bkp
root@192.168.0.108’s password:
drwxr-xr-x 2 root root 1024 2011-02-18 23:30 /tmp/nixi_bkp

Referências:

Servidor ssh (Foca Linux)

System Administration Toolkit: Set up remote access in UNIX through OpenSSH

Be-a-bá do SSH, parte 1

SSH, The Secure Shell: The Definitive Guide

SSH (Esquema das chaves criptográficas)