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ção | Descrição |
---|---|
ssh_config | Arquivo 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.d | Diretó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_key | Arquivo contendo a chave privada do servidor SSH para criptografia de chave pública baseada em curva elíptica (ECDSA). |
ssh_host_ecdsa_key.pub | Arquivo 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_key | Arquivo contendo a chave privada do servidor SSH para criptografia de chave pública baseada em Ed25519. |
ssh_host_ed25519_key.pub | Arquivo 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_key | Arquivo contendo a chave privada do servidor SSH para criptografia de chave pública baseada em RSA. |
ssh_host_rsa_key.pub | Arquivo 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_id | Arquivo 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_config | Arquivo 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.d | Diretó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ção | Descrição |
---|---|
Protocol | Define qual versão o Protocolo SSH deve operar, o padrão é 2. |
Port | O 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. |
ListenAddress | Especifica 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 . |
HostKeyAlgorithms | Define 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 |
PubkeyAcceptedKeyTypes | Restringe os tipos de chaves públicas que o servidor vai aceitar. |
HostKey | Especifica o arquivo contendo a chave privada do servidor. |
LoginGraceTime | O tempo permitido para o usuário fazer login antes de ser desconectado. |
MaxAuthTries | O número máximo de tentativas de autenticação permitidas antes do usuário ser desconectado. |
PubkeyAuthentication | Define se a autenticação baseada em chave pública é permitida. O valor padrão é yes. |
PasswordAuthentication | Define se a autenticação baseada em senha é permitida. O valor padrão é yes. |
PermitRootLogin | Define se a autenticação como usuário root é permitida. O valor padrão é no. |
AllowUsers | Especifica 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. |
DenyUsers | Especifica quais usuários NÃO são permitidos fazer login no servidor. |
AllowGroups | Especifica quais grupos são permitidos fazer login no servidor. |
DenyGroups | Especifica quais grupos NÃO são permitidos fazer login no servidor. |
X11Forwarding | Define se a conexão X11 é permitida. O valor padrão é no. |
PrintMotd | Define se a mensagem do dia (MOTD) é exibida no início da sessão. O valor padrão é yes. |
Banner | Especifica o arquivo que contém a mensagem que é exibida antes da autenticação. |
AllowTcpForwarding | Permite 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. |
GatewayPorts | Controla 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. |
Subsystem | Define 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. |
UsePAM | Habilita ou desabilita o uso do PAM (Pluggable Authentication Modules) para autenticação de usuários. |
ChallengeResponseAuthentication | Habilita 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. |
IgnoreRhosts | Habilita 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. |
HostbasedAuthentication | Habilita 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. |
StrictModes | Habilita 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. |
RekeyLimit | Especifica 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. |
TCPKeepAlive | Habilita ou desabilita o envio de pacotes TCP keepalive para manter a conexão viva. |
LogLevel | Define 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. |
Compression | Habilita ou desabilita a compressão de dados durante a transmissão. |
ClientAliveInterval | Define o tempo de inatividade máximo em segundos antes do envio de um pacote de sinalização. |
ClientAliveCountMax | Define o número máximo de pacotes de sinalização que podem ser enviados sem resposta antes de a conexão ser encerrada. |
UseDNS | Habilita ou desabilita a resolução de DNS reversa. |
MaxStartups | Define um limite de número de conexões que o servidor SSH pode receber de forma simultânea. |
PermitTunnel | Habilita 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. |
ChrootDirectory | Define 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 . |
VersionAddendum | Adiciona 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
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 ambienteSSH_AUTH_SOCK
é definida com o caminho do socket do agente SSH e a variávelSSH_AGENT_PID
é definida com o PID do processo do agente SSH (podemos ver com o comandoenv|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 nomechave1
aossh-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 umssh-agent
rodando nele, adiciona a chave/home/fulano/chave2
ao agente e, em seguida, clona o repositóriogit@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
).