(o servidor é muito mais do que parece ser)
Artigo Relacionado
SSH Client (artigo que fala sobre o client SSH)
O SSH (Secure SHell) é um protocolo da camada de aplicação usado para acessar máquinas remotas e executar todas as tarefas como se tivesse fisicamente na máquna local. Ele roda em cima de TCP. Para realizar a conexão, existe o comando "ssh" que implementa esse protocolo de mesmo nome para acessar máquinas remotas. Esse comando tem o objetivo de substituir outros comandos como rlogin, rsh e famoso telnet, acrescentando mecanismos de segurança para uma comunicação encriptada entre dois hosts numa rede insegura. Além disso, é possível usar esse canal seguro do SSH para executar aplicações X11/gráficas.
Ao iniciar uma conexão SSH várias informações em nível de aplicação são trocadas para prover a encriptação de dados em nível também de aplicação. Essas informações são: a versão do protocolo SSH (1 ou 2), os algoritmos de encriptação, as chaves de codificação etc. Depois dessa troca, todos os dados da camada de aplicação são enviados encriptados. Só para ter uma idéa dos pacotes e informações trocadas, a seguir tem uma captura do tráfego SSH realizada pelo Wireshark:

O servidor SSH suporta a versão 1 e 2 do protocolo. A versão 1 suporta somente o algoritmo RSA. Já a versão 2 suporta o RSA e DSA. Na versão 1 a chave pública é disponibilizada para os clientes e armazenada em sua base de dados. Quando o cliente se conectar no servidor um número randômico de 256 bits é gerado. Esse número é encriptado usando a chave pública do servidor e a chave privada cliente. Com esse procedimento, garante de uma só vez a criptografia (somente o servidor vai conseguir decriptografa com sua chave privada) e a assinatura/autenticidade da mensagem (pois vai ser necessário usar a chave pública do cliente, validando assim a autenticidade). Depois disso, o cliente e o servidor usarão esse número randômico para criptografar todas as informações subsequentes com o algoritmo 3DES ou Blowfish. O padrão é o 3DES.
Para o versão 2 do SSH, a segurança é provida pelo algoritmo Diffie-Hellman. Em conjunto com esse algoritmo é gerada uma chave compartilhada simétrica que criptografará todas as informações subsequentes com os algoritmos AES, Blowfish, 3DES, CAST, Arcfour etc. O cliente decidirá qual desses algoritmos será utilizado. Adicionalmente, para verificar a integridade, pode ser usado os algoritmos HMAC-SHA1 ou HMAC-MD5.
Somente depois desses passos é que serão escolhidas as formas de autênticação. As opções são: host-based, public key, challenge-response ou password.
- /etc/ssh/ssh_config: arquivo de configuração do cliente ssh. Toda vez que o comando "ssh" e seus equivalentes forem usados, esse arquivo é lido. Mais informações "man ssh_config";
- /etc/ssh/sshd_config: arquivo de configuração do servidor ssh. Toda vez que executamos o comando "/etc/init.d/ssh restart", esse arquivo é lido. Mais informações "man sshd_config";
- /etc/ssh/ssh_host_rsa_key: chave privada RSA global usada na versão 2 do ssh. Também conhecida como "HostKey" ou "host key". Ela é usada para a autênticação baseada em host;
- /etc/ssh/ssh_host_rsa_key.pub: chave plúbica RSA global usada na versão 2 do ssh. Também conhecida como "RSA key fingerprint" ou "RSA host key" (na verdade, o RSA key fingerprint é a assinatura/message digest da chave pública RSA e o RSA host key é a própria chave pública RSA. Para ver a fingerprint da chave pública digite "ssh-keygen -l" ou "ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub"). Essa chave é criada somente no servidor ssh no momento da instalação e serve para que o cliente verifique a autênticidade do servidor na hora da conexão, com isso, evitando um man-in-the-middle e um DNS Spoofing. Quando um cliente ssh tenta se conectar num servidor pela primeira vez, aparecerá uma mensagem solicitando a permissão de adicionar a chave pública "/etc/ssh/ssh_host_rsa_key.pub" na lista de hosts conhecidos, ou seja, na lista de chaves públicas. Essa chave é armazena em "~/.ssh/known_hosts"no computador cliente e relacionada ao IP e nome de host do servidor. Toda vez de fizer a conexão novamente, tais chaves ("/etc/ssh/ssh_host_rsa_key.pub" e "~/.ssh/known_hosts") serão comparadas juntamente com IP ou HostName. Todos esse procedimentos seriam uma espécie de assinatura/fingerprint. Além disso tudo, ela é usada para a autênticação baseada em host;
- /etc/ssh/ssh_host_dsa_key: chave privada DSA global usada na versão 2 do ssh. Também conhecida como "HostKey" ou "host key". Ela é usada para a autênticação baseada em host;
- /etc/ssh/ssh_host_dsa_key.pub: chave pública DSA global usada na versão 2 do ssh. Ela é usada para a autênticação baseada em host;
- /etc/ssh/ssh_host_key: chave privada global usada na versão 1 do ssh. Ela é usada para a autênticação baseada em host;
- /etc/ssh/ssh_host_key.pub: chave pública global usada na versão 1 do ssh. Ela é usada para a autênticação baseada em host;
- ~/.ssh/known_hosts: armazena as chaves públicas dos servidores ssh e os relacionam com o IP e HostName. A chave pública dos servidores ficam em "/etc/ssh/ssh_host_rsa_key.pub". Toda vez que o comando "ssh" e seus equivalentes são usados, esse arquivo é lido e são feitas comparações entre a chave armazenada no cliente e a chave publica do servidor;
- ~/.ssh/known_hosts2: idem;
- /etc/ssh/ssh_known_hosts: é "~/.ssh/known_hosts" global usado por todos os usuários e preparado/feito pelo administrador do sistema. Esse arquivo é opcional;
- /etc/ssh/ssh_known_hosts2: idem;
- ~/.ssh/identity: chave privada gerada com o comando "ssh-keygen" a partir da versão 1 do protocolo SSH, usando o algoritmo RSA;
- ~/.ssh/identity.pub: chave pública gerada com o comando "ssh-keygen" a partir da versão 1 do protocolo SSH, usando o algoritmo RSA;
- ~/.ssh/id_rsa: chave privada gerada com o comando "ssh-keygen" a partir da versão 2 do protocolo SSH, usando o algoritmo RSA;
- ~/.ssh/id_rsa.pub: chave pública gerada com o comando "ssh-keygen" a partir da versão 2 do protocolo SSH, usando o algoritmo RSA;
- ~/.ssh/id_dsa: chave privada gerada com o comando "ssh-keygen" a partir da versão 2 do protocolo SSH, usando o algoritmo DSA;
- ~/.ssh/id_dsa.pub: chave pública gerada com o comando "ssh-keygen" a partir da versão 2 do protocolo SSH, usando o algoritmo DSA;
- ~/.ssh/authorized_keys: chave pública dos usuários armazernadas no servidor. Quando o cliente exporta para servidor ou quando o servido importar do cliente, as chaves públicas (de qualquer versão do SSH e de qualquer algoritmo) devem ter esse nome;
- ~/.ssh/authorized_keys2: idem;
- /etc/ssh/moduli: contém os grupos Diffie-Hellman usados pelo algoritmos. Mais informações "man moduli";
- PassPhrase: a PASSPHRASE é uma senha que pode ser inserida na chave privada. Ela é opcional, contudo se deve sempre considerá-la como aliada na segurança e não como uma inimiga da usabilidade, pois imaginem que a sua chave privada seja roubada, a única proteção para que o bandido não se passe por você será a PASSPHRASE;
# apt-get update ; apt-get install openssh-server (além de instalar o servidor, instala também o cliente, ou seja, o comando "ssh" estará disponível. Também cria as chaves SSH RSA e DSA da versão 2 do servidor)
# vi /etc/ssh/sshd_config (toda vez que modificar esse arquivo é necessário restartar o serviço com o comando "/etc/init.d/ssh restart")
# What ports, IPs and protocols we listen for
Port 22 (especifica a porta que será aperta para aceitar as conexões. O padrão é 22)
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress :: (especifica qual interface rede que as conexões serão aceitas, sendo que se deve usar o endereço IPv6 para isso)
#ListenAddress 0.0.0.0 (especifica qual interface rede que as conexões serão aceitas, sendo que se deve usar o endereço IPv4 para isso)
Protocol 2 (especifica a versão do protocolo SSH que deve ser suportado. Nesse caso, é a versão 2 do ssh)
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key (chave privada RSA global usada na versão 2 do ssh. Também conhecida como "HostKey" ou "host key". Ela é usada para a autênticação baseada em host)
HostKey /etc/ssh/ssh_host_dsa_key (chave privada DSA global usada na versão 2 do ssh. Também conhecida como "HostKey" ou "host key". Ela é usada para a autênticação baseada em host)
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes ()
# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600 ()
ServerKeyBits 768 ()
# Logging
SyslogFacility AUTH (logging)
LogLevel INFO (logging)
# Authentication:
LoginGraceTime 120 ()
PermitRootLogin yes (permite ou não o acesso ssh com o usuario usando "root". Em caso negativo, se deve logar primeiro com um usuário comum e depois mudar (comando "su") para o "root")
StrictModes yes ()
RSAAuthentication yes (especifica se o servidor vai aceitar a autênticação via RSA pura. Esta opção só é válida para a versão 1 do SSH)
PubkeyAuthentication yes (especifica se o servidor vai aceitar a autênticação via chave pública. Esta opção só é válida para a versão 2 do SSH)
#AuthorizedKeysFile %h/.ssh/authorized_keys (especifica a chave pública dos usuários armazernadas no servidor. Quando o cliente exporta para servidor ou quando o servidor importa do cliente, as chaves públicas (de qualquer versão do SSH e de qualquer algoritmo) devem ter esse nome)
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes (especifica se os arquivos "~/.rhosts" and "~/.shosts" dos usuários devem ser lidos. Eles são usados no "Host Based Authentication")
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no (especifica a autênticação baseada em rhosts deve ser com RSA. Somente para usada na versão 1 do SSH. Para a versão 2 use "HostbasedAuthentication")
# similar for protocol version 2
HostbasedAuthentication yes (especifica se haverá autênticação baseada em host e se deve ser com RSA. Somente para usada na versão 2 do SSH. Para a versão 1 use "RhostsRSAAuthentication")
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes ()
# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no (permite ou não uma autenticação utilizando senha em branco)
Change to yes to enable challenge-response passwords (beware issues with some PAM modules and threads)
ChallengeResponseAuthentication no ()
# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes (especifica se o cliente pode usar a autênticação por senha)
# Kerberos options
#KerberosAuthentication no ()
#KerberosGetAFSToken no ()
#KerberosOrLocalPasswd yes ()
#KerberosTicketCleanup yes ()
# GSSAPI options
GSSAPIAuthentication no (especifica se a autênticação do usuário baseada em GSSAPI é permitida)
#GSSAPICleanupCredentials yes ()
X11Forwarding yes (permite que um programa X11 seja acessado e visualizado num cliente, usando um túnel ssh. No cliente se deve usar a opção "-X" do comando ssh. Para saber mais informações sobre isso, acess SSH Client e procure pelo tópico "X11 SSH Tunnel")
X11DisplayOffset 10 (especifica o número diponível para o display do X11 ao utilizar o "ssh". Isso previne que o "sshd" interfira com as conexões nativas do X11 servers. O padrão é 10)
PrintMotd no ()
PrintLastLog yes ()
TCPKeepAlive yes ()
#UseLogin no ()
#MaxStartups 10:30:60 ()
#Banner /etc/issue.net (o conteúdo desse arquivo é mostrado (pelo getty) para o cliente ao se conectar no servidor. Essa mensagem vem antes da digitação da senha)
# Allow client to pass locale environment variables
AcceptEnv LANG LC_* (especifica se aceitará as variáveis do ambiente enviadas pelo cliente. Somente suportado na versão 2)
Subsystem sftp /usr/lib/openssh/sftp-server ()
UsePAM yes ()
# TIMEOUT da conexão TCP
ClientAliveInterval 600 (depois de 600 segundos a conexão SSH será cancelada)
ClientAliveCountMax 0 (essa opção é necessária para que o TIMEOUT funcione)
#
AllowTcpForwarding yes (permite TCP Port Forwarding - tunnelling - para um SSH Server)
Host Based Authentication é um tipo de acesso remoto sem o uso de senha, baseando-se no HostName ou IP do cliente em conjunto a chave RSA ou DSA do servidor.
Arquivo de configuração# vi /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key (chave privada RSA do servidor. Essa linha já existe e está correta, só coloquei aqui para informar que ela é usada na autenticação RSA baseada em host. Na verdade, quando um cliente tenta se autenticar, ele utiliza a chave pública do servidor que está a disposição de todos em "/etc/ssh/ssh_host_rsa_key.pub" (no server), sendo armazenada em "~/.ssh/known_hosts" (no client) para criptografar os dados, sendo que esses dados ao chegar no servidor será decriptografado usando a sua chave privada "/etc/ssh/ssh_host_rsa_key")
HostKey /etc/ssh/ssh_host_dsa_key (idem, só que voltada para o DSA)
IgnoreRhosts no (especifica se os arquivos "~/.rhosts" and "~/.shosts" dos usuários devem ser lidos)
Salve e Saia
# /etc/init.d/ssh restart
Crie o arquivo "/root/.rhosts" ou "/root/.shosts" para o usuário "root"
# vi /root/.rhosts
IP_cliente_ssh root (insira o endereço IP do cliente ssh. Nos testes que fiz, ao colocar o hostname ao invés do IP do cliente, a configuração não funcionou, mesmo com o DNS realizando a resolução do nome)
Salve e Saia
Crie o arquivo "/etc/hosts.equiv" para um usuário "comum"
# vi /etc/hosts.equiv
IP_cliente_ssh usuario_comum (insira o endereço IP do cliente ssh e o nome do usuário que se quer logar. Nos testes que fiz, ao colocar o hostname ao invés do IP do cliente, a configuração não funcionou, mesmo com o DNS realizando a resolução do nome)
Salve e Saia
Obs: pelos testes que fiz a resolução do IP pelo DNS não influenciou no resultado.
Agora que já configuramos o servidor, acesse o artigo SSH Client na parte "Host Based Authentication" para saber como configurar o cliente.
Referências Bibliográgicas
http://www.juniper.net/techpubs/software/erx/junose61/swconfig-system-basics/html/passwords-security-config7.html