O cliente
SSH do
OpenSSH suporta os protocolos SSH 1 e 2. O protocolo 2 é o padrão, com SSH voltando para o protocolo 1 se detectar que o protocolo 2 não é suportado. Estas configurações podem ser alteradas usando a opção Protocol em "ssh_config(5)", ou impostas usando as opções "-1" e "-2" (veja acima).
Ambos os protocolos suportam métodos semelhantes de autenticação, mas o protocolo 2 é preferível, pois proporciona mecanismos adicionais de confidencialidade (o tráfego é encriptado usando AES, 3DES, Blowfish, CAST128, ou Arcfour) e integridade (HMAC-MD5, HMAC-SHA1, UMAC-64, HMAC-RIPEMD160). O protocolo 1 carece de um forte mecanismo para assegurar a integridade da conexão.
Os métodos disponíveis para autenticação são:
- Autenticação baseada em GSSAPI;
- Autenticação baseada em host;
- Autenticação por chave pública;
- Autenticação desafio-resposta;
- Autenticação por password.
Métodos de autenticação são tentados na ordem especificada acima, embora o protocolo 2 tenha uma opção de configuração para mudar a ordem padrão: "PreferredAuthentications".
A autenticação baseada em host funciona da seguinte maneira. Se a máquina que o usuário logar estiver listada em
/etc/hosts.equiv ou
/etc/ssh/shosts.equiv na máquina remota, e o nome dos usuários é o mesmo em ambos os lados, ou, se os arquivos
~/.rhosts ou
~/.shosts existirem no diretório HOME do usuário na máquina remota e conter uma linha contendo o nome da máquina cliente e o nome do usuário naquela máquina, o usuário é considerado para logar.
Adicionalmente o servidor precisa ser capaz de verificar a chave de host do cliente (veja a descrição de
/etc/ssh/ssh_known_hosts e
~/.ssh/known_hosts, abaixo) para o login ser permitido.
Este método de autenticação fecha buracos na segurança devido ao IP spoofing, DNS spoofing, e spoofing de roteamento.
** Nota para o administrador:
/etc/hosts.equiv, ~/.rhosts e o protocolo
rlogin/rsh, em geral, são inerentemente inseguros e devem ser desativados se a segurança é desejada.
A autenticação por chave pública funciona da seguinte maneira: O esquema é baseado na criptografia de chave-pública, usando criptosistemas onde a encriptação e decriptação são feitas usando chaves separadas, e é inviável derivar a chave de decriptação através da chave de encriptação.
A ideia é que cada usuário crie um par de chaves pública/privada para o propósito de autenticação. O servidor conhece a chave pública, e somente o usuário conhece a chave privada. O SSH implementa o protocolo de autenticação por chave pública automaticamente, usando o algoritmo RSA ou DAS.
O protocolo 1 é restringido a usar somente chaves RSA, mas o protocol 2 pode usar qualquer um. A seção HISTORY de "ssl(8)" (em sistemas não-OpenBSD, veja em
HISTORY) contém uma breve discussão dos dois algoritmos.
O arquivo
~/.ssh/authorized_keys lista as chaves públicas que são permitidas para efetuar logon. Quando o usuário loga, o programa SSH diz ao servidor qual par de chaves gostaria de usar para a autenticação. O cliente prova que tem acesso à chave privada e o servidor checa que a chave pública correspondente está autorizada a aceitar a conta.
O usuário cria seu par de chaves executando
ssh-keygen(1). Isto armazena a chave privada em
~/.ssh/identity (protocolo 1),
~/.ssh/id_dsa (protocolo 2 DSA), ou
~/.ssh/id_rsa (protocolo 2 RSA) e armazena a chave pública em
~/.ssh/identity.pub (protocolo 1),
~/.ssh/id_dsa.pub (protocolo 2 DSA), ou
~/.ssh/id_rsa.pub (protocolo 2 RSA) no diretório HOME do usuário.
O usuário deve, então, copiar a chave pública para
~/.ssh/authorized_keys em seu diretório HOME na máquina remota. O arquivo "authorized_keys" corresponde ao arquivo
~/.rhosts convencional, e tem uma chave por linha, embora as linhas podem ser muito longas. Depois disto, o usuário pode efetuar logon sem dar o password.
A maneira mais conveniente de usar autenticação por chave pública pode ser com um agente de autenticação. Veja "ssh-agent(1)" para mais informações.
A autenticação desafio-resposta funciona da seguinte maneira. O servidor envia um "desafio" arbitrário em texto, e espera por uma resposta. O protocolo 2 permite múltiplos desafios e respostas; o protocolo 1 é restrito a apenas um desafio/resposta. Exemplos de autenticação desafio-resposta incluem autenticação BSD (veja login.conf(5)) e PAM (para alguns sistemas não-OpenBSD).
Finalmente, se outros métodos de autenticação falharem, o SSH pede uma senha para o usuário. A senha é enviada para o host remoto para ser checada; entretanto, já que todas as comunicações são encriptadas, a senha não pode ser vista por alguém que esteja escutando a rede.
O SSH, automaticamente, mantém e checa um banco de dados contendo uma identificação de todos os hosts com que ele já foi usado. As chaves do host são armazenadas em
~/.ssh/known_hosts no diretório HOME do usuário.
Adicionalmente, o arquivo
/etc/ssh/ssh_known_hosts é automaticamente checado para hosts conhecidos. Quaisquer novos hosts são automaticamente adicionados ao arquivo do usuário. Se a identificação de um host mudar, o SSH alerta sobre isto e desativa a autenticação por senha para prevenir ataques de spoof de servidor ou
man-in-the-middle, que poderiam caso contrário ser usados para circundar a encriptação.
A opção
StrictHostKeyChecking pode ser usada para controlar logins em máquinas cuja chave hospedeira não é conhecida ou tenha mudado.
Quando a identidade do usuário for aceita pelo servidor, ou o servidor executa o comando dado, ou loga na máquina e dá ao usuário um shell normal na máquina remota, todas as comunicações com o comando remoto ou shell vão ser automaticamente encriptados.
Se um pseudo-terminal foi alocado (sessão normal de login), o usuário poderá usar os caracteres de escape escritos abaixo.
Se nenhum
pseudo-tty foi alocado, a sessão é transparente e pode ser usada para transferir dados binários confiavelmente. Na maioria dos sistemas, definindo o caractere de escape para "none", também fará a sessão ser transparente mesmo se um tty for utilizado.
A sessão finaliza quando o comando, ou shell na máquina remota, sai e todas conexões X11 e TCP são fechadas.