Skip to main content

212.3 Secure Shell (SSH)


Introdução


O SSH (Secure Shell) é um protocolo de rede que permite aos usuários acessar e controlar de forma segura um computador remotamente através da Internet ou de uma rede local. Ele fornece criptografia de ponta a ponta para proteger a comunicação entre o cliente e o servidor, tornando mais difícil para invasores interceptar ou manipular os dados transmitidos.


O SSH utiliza chaves criptográficas para autenticar a identidade do cliente e do servidor, garantindo que apenas usuários autorizados possam acessar o sistema remoto. Além disso, ele oferece recursos avançados, como túneis de porta para permitir que os usuários acessem serviços de rede remotos como se estivessem em sua rede local, e transferência de arquivos segura (SFTP) para transferir arquivos de forma segura entre sistemas.


Antes de prosseguir revise o que já foi aplicado na LPIC-1 no módulo 110.3.



Arquivos de configurações do SSH


Primeiro instale o SSH:

$ sudo apt install openssh-server -y

Os arquivos de configuração ficam dentro de /etc/ssh, aqui dentro temos os seguintes arquivos:

OpçãoDescrição
ssh_configArquivo de configuração global do cliente SSH.
- Contém configurações que afetam o comportamento do cliente SSH em todas as conexões.
- O arquivo de configuração cliente para cada usuário, que configure opções do SSH individuais para cada um fica em ~/.ssh/config.
ssh_config.dDiretório que pode conter arquivos de configuração adicionais para o cliente SSH.
- Lidos em ordem alfabética.
- Configurações em arquivos posteriores sobrescrevem as configurações em arquivos anteriores.
ssh_host_ecdsa_keyArquivo contendo a chave privada do servidor SSH para criptografia de chave pública baseada em curva elíptica (ECDSA).
ssh_host_ecdsa_key.pubArquivo contendo a chave pública do servidor SSH para criptografia de chave pública baseada em curva elíptica (ECDSA).
- Normalmente enviada para o cliente SSH, sendo armazenada em ~/.ssh/known_hosts.
ssh_host_ed25519_keyArquivo contendo a chave privada do servidor SSH para criptografia de chave pública baseada em Ed25519.
ssh_host_ed25519_key.pubArquivo contendo a chave pública do servidor SSH para criptografia de chave pública baseada em Ed25519.
- Normalmente enviada para o cliente SSH, sendo armazenada em ~/.ssh/known_hosts.
ssh_host_rsa_keyArquivo contendo a chave privada do servidor SSH para criptografia de chave pública baseada em RSA.
ssh_host_rsa_key.pubArquivo contendo a chave pública do servidor SSH para criptografia de chave pública baseada em RSA.
- Normalmente enviada para o cliente SSH, sendo armazenada em ~/.ssh/known_hosts.
ssh_import_idArquivo usado para armazenar as chaves de autenticação do SSH Agent para permitir que o agente SSH seja usado em sessões de login remotas.
sshd_configArquivo de configuração global do servidor SSH.
- Contém as configurações que afetam o comportamento do servidor SSH para todas as conexões.
sshd_config.dDiretório que pode conter arquivos de configuração adicionais para o servidor SSH.
- Lidos em ordem alfabética.
- Configurações em arquivos posteriores sobrescrevem as configurações em arquivos anteriores.


Opções de configuração do SSH


Com o SSH instalado vamos ver as opções disponíveis de configuração do servidor SSH:


OpçãoDescrição
ProtocolDefine qual versão o Protocolo SSH deve operar, o padrão é 2.
PortO número da porta que o servidor SSH deve ouvir para conexões de entrada. O padrão é 22. Pode ser configurado mais de uma porta.
ListenAddressEspecifica o endereço IP ou nome do host que o servidor SSH deve ouvir para conexões de entrada. É possível configurar mais de um IP com uma porta para cada IP. Ex: ListenAddress 192.168.1.100:22
ListenAddress 10.0.0.1:2222.
HostKeyAlgorithmsDefine quais algoritmos de chave de host o servidor SSH aceita para autenticar-se com os clientes. Isso significa que o servidor só permitirá conexões de clientes que suportem pelo menos um dos algoritmos de chave de host definidos em HostKeyAlgorithms. Essa opção deve ser usada em conjunto com a PubkeyAcceptedKeyTypes. Alguns dos algoritmos comuns suportados pelo HostKeyAlgorithms incluem:

ssh-ed25519
ecdsa-sha2-nistp256
ecdsa-sha2-nistp384
ecdsa-sha2-nistp521
ssh-rsa
PubkeyAcceptedKeyTypesRestringe os tipos de chaves públicas que o servidor vai aceitar.
HostKeyEspecifica o arquivo contendo a chave privada do servidor.
LoginGraceTimeO tempo permitido para o usuário fazer login antes de ser desconectado.
MaxAuthTriesO número máximo de tentativas de autenticação permitidas antes do usuário ser desconectado.
PubkeyAuthenticationDefine se a autenticação baseada em chave pública é permitida. O valor padrão é yes.
PasswordAuthenticationDefine se a autenticação baseada em senha é permitida. O valor padrão é yes.
PermitRootLoginDefine se a autenticação como usuário root é permitida. O valor padrão é no.
AllowUsersEspecifica quais usuários são permitidos fazer login no servidor. Se um usuário não estiver listado nessa opção, ele não terá permissão para se conectar ao servidor SSH.
DenyUsersEspecifica quais usuários NÃO são permitidos fazer login no servidor.
AllowGroupsEspecifica quais grupos são permitidos fazer login no servidor.
DenyGroupsEspecifica quais grupos NÃO são permitidos fazer login no servidor.
X11ForwardingDefine se a conexão X11 é permitida. O valor padrão é no.
PrintMotdDefine se a mensagem do dia (MOTD) é exibida no início da sessão. O valor padrão é yes.
BannerEspecifica o arquivo que contém a mensagem que é exibida antes da autenticação.
AllowTcpForwardingPermite ou não que o cliente abra túneis de redirecionamento de porta no servidor. Se essa opção estiver definida como "yes", o cliente poderá usar o redirecionamento de porta TCP. Se a opção estiver definida como "no", o redirecionamento de porta será desabilitado e o cliente não poderá usá-lo.
GatewayPortsControla se o SSH permitirá que as conexões de túnel TCP encaminhadas pelos clientes possam ser direcionadas para qualquer endereço de destino ou apenas para o próprio servidor SSH. Se definido como no, as conexões de túnel TCP só poderão ser direcionadas para o próprio servidor SSH, ou seja, para as interfaces locais do servidor. Se definido como yes, as conexões de túnel TCP poderão ser direcionadas para qualquer endereço, o que pode permitir o acesso a outros dispositivos na rede.
SubsystemDefine o subsistema que será usado para a conexão SSH. Um subsistema é um programa que é executado em nome do usuário que se conecta ao servidor SSH e que gerencia um serviço específico.
Por exemplo, se você quiser permitir que usuários remotos usem o servidor como um servidor de arquivos, poderá configurar o subsistema "sftp" para ser usado para conexões SFTP. Isso permite que os usuários façam o upload e download de arquivos usando um cliente SFTP como o FileZilla ou o WinSCP.
UsePAMHabilita ou desabilita o uso do PAM (Pluggable Authentication Modules) para autenticação de usuários.
ChallengeResponseAuthenticationHabilita ou desabilita a autenticação baseada em desafio-resposta.
Se essa opção estiver habilitada, o servidor SSH solicitará uma resposta do usuário a um desafio específico antes de permitir que o usuário faça login no sistema. Isso adiciona uma camada adicional de segurança ao processo de autenticação, mas pode ser um pouco mais incômodo para o usuário.
IgnoreRhostsHabilita ou desabilita a verificação de arquivos de hosts remotos.
Essa opção é usada para permitir ou negar o uso de arquivos .rhosts e .shosts para autenticação do usuário. Esses arquivos são usados para permitir que os usuários façam login em sistemas remotos sem fornecer uma senha. No entanto, o uso desses arquivos pode ser um risco de segurança, pois eles permitem que usuários remotos acessem o sistema sem fornecer autenticação adequada.
HostbasedAuthenticationHabilita ou desabilita a autenticação baseada em hosts.
Essa opção permite a autenticação de um usuário com base no nome do host ou endereço IP do sistema cliente. Em vez de solicitar que o usuário forneça uma senha ou uma chave de autenticação, o servidor SSH verifica se o nome do host ou endereço IP fornecido pelo cliente corresponde a uma entrada autorizada no arquivo hosts.equiv do servidor SSH. Essa opção é menos segura do que outras opções de autenticação do SSH.
StrictModesHabilita ou desabilita a verificação das permissões dos arquivos do usuário. Quando habilitado, o servidor SSH verifica se as permissões de arquivos são rígidas o suficiente para evitar que usuários não autorizados possam modificar ou acessar esses arquivos.
RekeyLimitEspecifica após quantos bytes de dados transferidos deve ocorrer uma renegociação da chave de criptografia. Essa opção ajuda a melhorar a segurança do canal criptografado SSH, pois limita o tempo que uma chave de criptografia pode ser usada antes que uma nova chave seja gerada.
default: usa os valores padrão definidos pelo servidor SSH.
valors: define o intervalo de tempo em segundos após o qual uma nova negociação de chave será iniciada. Por exemplo, 3600s definiria um limite de uma hora.
none: desabilita a renegociação de chave.
TCPKeepAliveHabilita ou desabilita o envio de pacotes TCP keepalive para manter a conexão viva.
LogLevelDefine o nível de verbosidade dos logs do SSH.
QUIET (0): não gera logs.
FATAL (1): registra apenas erros fatais.
ERROR (2): registra erros.
INFO (3): registra informações gerais.
VERBOSE (4): registra informações mais detalhadas.
DEBUG (5): registra informações de depuração.
DEBUG1 (6): registra informações de depuração de nível 1.
DEBUG2 (7): registra informações de depuração de nível 2.
DEBUG3 (8): registra informações de depuração de nível 3.
CompressionHabilita ou desabilita a compressão de dados durante a transmissão.
ClientAliveIntervalDefine o tempo de inatividade máximo em segundos antes do envio de um pacote de sinalização.
ClientAliveCountMaxDefine o número máximo de pacotes de sinalização que podem ser enviados sem resposta antes de a conexão ser encerrada.
UseDNSHabilita ou desabilita a resolução de DNS reversa.
MaxStartupsDefine um limite de número de conexões que o servidor SSH pode receber de forma simultânea.
PermitTunnelHabilita ou desabilita a criação de túnel. Esses túneis podem ser usados para rotear o tráfego de rede de um cliente para um servidor remoto ou para redirecionar tráfego de uma porta local para um servidor remoto através de uma conexão SSH criptografada e segura.
ChrootDirectoryDefine o diretório base para a sessão chroot do usuário. Esse diretório passa a ser a raiz (/) do sistema de arquivos para o usuário, restringindo o acesso a outros arquivos e diretórios do sistema.
Um exemplo de configuração serie: ChrootDirectory /home/%u.
VersionAddendumAdiciona um texto personalizado à versão do protocolo SSH enviada ao cliente.

Após aplicar as configurações reinicie o serviço do SSH:

$ sudo systemctl restart sshd


Uso de Chaves


Reveja os links abaixo:


Vamos criar uma chave:

# Crie uma chave ed25519:
$ ssh-keygen -b 2048 -C 'chave para teste' -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_ed25519
Your public key has been saved in /home/vagrant/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:Se4fOyB+QllZlajnFjxi/z5Fhr/lK2dpsCF7mCdoBm8 chave para teste
The key's randomart image is:
+--[ED25519 256]--+
| o.. |
| o . |
| .= . |
| o*.= . o |
| +S= o + |
| +o. +. oo .|
| o .+oo.=.++.|
| o .E.Bo=.=.|
| o+ oo=.=..|
+----[SHA256]-----+

Agora é só pegar a chave pública e enviar para o authorized_keys dentro do servidor SSH. Esse arquivo fica em ~/.ssh/authorized_keys, dentro da sua própria home (se não existir crie ele).

# Veja a chave pública criada:
$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP/NBigP9ka94vZwdt0r4Bb4MdFdjMc0tl52sZKbOVGz chave para teste

criação de chave

A opção -t é usada para especificar o tipo de chave que será gerado, nesse caso ed25519, um algoritmo de criptografia de chave pública.


A opção -b é usada para especificar o tamanho da chave em bits, que nesse caso é 2048 bits. Quanto maior o tamanho da chave, mais segura ela será, mas também pode afetar o desempenho da comunicação SSH.


A opção -C é usada para incluir um comentário na chave, que pode ajudar a identificar a chave e seu propósito.



SSH-Agent e SSH-ADD


O ssh-agent é um programa que gerencia chaves privadas usadas para autenticação no SSH. Ele é executado como um daemon em segundo plano e armazena as chaves privadas em sua memória. Isso faz com que não seja necessário ficar digitando a "senha" (passphrase) da chave privada a todo momento.


O ssh-add é um utilitário que adiciona chaves privadas ao ssh-agent. Ele pode ser usado para adicionar chaves privadas armazenadas em arquivos ou chaves privadas que estejam em um servidor remoto, e permite que você use essas chaves para autenticação sem precisar digitar a senha toda vez.


O método mais simples de adicionar uma chave é:

$ ssh-agent bash
$ ssh-add

Inicia um novo shell Bash e configura variáveis de ambiente para usar o agente SSH: ssh-agent bash
Ao executar esse comando, a variável de ambiente SSH_AUTH_SOCK é definida com o caminho do socket do agente SSH e a variável SSH_AGENT_PID é definida com o PID do processo do agente SSH (podemos ver com o comando env|grep SSH).

O segundo comando ssh-add vai adicionar todas as chaves que o usuário possui, a menos que seja informada a chave.


Um exemplo seria:

$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/chave1

O comando eval "$(ssh-agent -s)" é usado para iniciar o ssh-agent.

Já o comando ssh-add ~/.ssh/chave1 adiciona a chave privada de nome chave1 ao ssh-agent.


Outro comando interessante é:

$ ssh-agent bash -c  'ssh-add /home/fulano/chave2; git clone git@github.com:fulano/proj.git'

Esse comando cria um novo shell bash com um ssh-agent rodando nele, adiciona a chave /home/fulano/chave2 ao agente e, em seguida, clona o repositório git@github.com:fulano/proj.git usando a chave adicionada.

É uma forma de garantir que a chave SSH esteja disponível para autenticação durante todo o processo, sem precisar adicionar a chave a cada vez que for necessário usá-la.



Recursos do SSH


Reveja sobre túnel SSH.


Como o SSH aceite o TCP Wrapper reveja sobre ele também no módulo 110.2.


Com a opção -X do comando ssh é possível abrir uma aplicação gráfica remotamente (essa função deve estar ativa no servidor SSH, sendo a opção X11Forwarding yes).