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 120 – Timeout (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 i686The 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:
System Administration Toolkit: Set up remote access in UNIX through OpenSSH