As melhores maneiras de proteger seu servidor SSH

Um prompt SSH estilizado em uma janela de terminal de um laptop.
Eny Setiyowati / Shutterstock.com

Proteja a conexão SSH do seu sistema Linux para proteger seu sistema e dados. Os administradores de sistema e usuários domésticos precisam proteger e proteger os computadores voltados para a Internet, mas o SSH pode ser complicado. Aqui estão dez vitórias rápidas fáceis para ajudar a proteger seu servidor SSH.

Noções básicas de segurança SSH

SSH significa Secure Shell . O nome “SSH” é usado alternadamente para significar o próprio protocolo SSH ou as ferramentas de software que permitem que administradores de sistema e usuários façam conexões seguras com computadores remotos usando esse protocolo.

O protocolo SSH é um protocolo criptografado projetado para fornecer uma conexão segura em uma rede insegura, como a Internet. SSH no Linux é construído em uma versão portátil do projeto OpenSSH . É implementado em um modelo cliente-servidor clássico , com um servidor SSH aceitando conexões de clientes SSH. O cliente é usado para se conectar ao servidor e exibir a sessão para o usuário remoto. O servidor aceita a conexão e executa a sessão.

Em sua configuração padrão, um servidor SSH escutará as conexões de entrada na porta do Protocolo de Controle de Transmissão ( TCP ) 22. Por ser uma porta padronizada e conhecida , é um alvo para agentes de ameaças e bots malintencionados .

Os agentes de ameaças lançam bots que examinam uma variedade de endereços IP em busca de portas abertas. As portas são então investigadas para ver se há vulnerabilidades que podem ser exploradas. Pensar: “Estou seguro, existem alvos maiores e melhores do que eu para os bandidos visarem”, é um raciocínio falso. Os bots não estão selecionando alvos com base em qualquer mérito; eles estão procurando metodicamente por sistemas que possam violar.

Você se autointitula como vítima se não protegeu seu sistema.

Fricção de Segurança

O atrito de segurança é a irritação – em qualquer grau – que os usuários e outras pessoas sentirão quando você implementar medidas de segurança. Temos longa memória e podemos nos lembrar de apresentar um sistema de computador a novos usuários e ouvi-los perguntar com uma voz horrorizada se realmente precisavam inserir uma senha toda vez que se conectavam ao mainframe. Isso – para eles – era um problema de segurança.

(Aliás, a invenção da senha é creditada a Fernando J. Corbató , outra figura no panteão dos cientistas da computação cujo trabalho combinado contribuiu para as circunstâncias que levaram ao nascimento do  Unix .)

A introdução de medidas de segurança geralmente envolve algum tipo de atrito para alguém. Os proprietários de empresas têm de pagar por isso. Os usuários de computador podem ter que mudar suas práticas familiares, ou lembrar de outro conjunto de detalhes de autenticação, ou adicionar etapas extras para se conectar com sucesso. Os administradores do sistema terão trabalho adicional a fazer para implementar e manter as novas medidas de segurança.

Endurecer e bloquear um sistema operacional Linux ou semelhante ao Unix pode envolver muito, muito rapidamente. O que estamos apresentando aqui é um conjunto de etapas fáceis de implementar que irão melhorar a segurança do seu computador sem a necessidade de aplicativos de terceiros e sem vasculhar o seu firewall.

Essas etapas não são a palavra final em segurança SSH, mas elas o levarão muito além das configurações padrão e sem muito atrito.

Recomendado:  Usuários iniciantes do Linux: não tenham medo do terminal

Use o protocolo SSH versão 2

Em 2006, o protocolo SSH foi atualizado da versão 1 para a versão 2 . Foi uma atualização significativa. Houve tantas mudanças e melhorias, especialmente em torno de criptografia e segurança, que a versão 2 não é compatível com a versão 1. Para evitar conexões de clientes da versão 1, você pode estipular que seu computador só aceitará conexões de clientes da versão 2.

Para fazer isso, edite o /etc/ssh/sshd_configarquivo. Faremos muito isso ao longo deste artigo. Sempre que você precisar editar este arquivo, este é o comando a ser usado:

sudo gedit / etc / ssh / sshd_config

sudo gedit / etc / ssh / sshd_config em uma janela de terminal

Adicione a linha:

Protocolo 2

sshd_config no gedit com as edições destacadas

E salve o arquivo. Vamos reiniciar o processo daemon SSH. Novamente, faremos muito isso ao longo deste artigo. Este é o comando a ser usado em cada caso:

sudo systemctl restart sshd

sudo gedit / etc / ssh / sshd_config em uma janela de terminal

Vamos verificar se nossa nova configuração está em vigor. Iremos pular para uma máquina diferente e tentar fazer o SSH em nossa máquina de teste. E usaremos a opção -1 (protocolo 1) para forçar o sshcomando a usar a versão 1 do protocolo.

ssh -1 dave@howtogeek.local

ssh -1 dave@howtogeek.local em uma janela de terminal

Ótimo, nosso pedido de conexão foi rejeitado. Vamos garantir que ainda podemos nos conectar com o protocolo 2. Usaremos a opção -2(protocolo 2) para provar o fato.

ssh -2 dave@howtogeek.local

ssh -2 dave'howtogeek.local em uma janela de terminal

O fato de o servidor SSH estar solicitando nossa senha é uma indicação positiva de que a conexão foi feita e você está interagindo com o servidor. Na verdade, como os clientes SSH modernos usarão o protocolo 2 por padrão, não precisamos especificar o protocolo 2, desde que nosso cliente esteja atualizado.

ssh dave@howtogeek.local

ssh dave@howtogeek.local em uma janela de terminal

E nossa conexão é aceita. Portanto, apenas as conexões do protocolo 1 mais fracas e menos seguras estão sendo rejeitadas.

Evite a porta 22

A porta 22 é a porta padrão para conexões SSH. Se você usar uma porta diferente, ele adiciona um pouco de segurança através da obscuridade ao seu sistema. A segurança através da obscuridade nunca é considerada uma medida de segurança verdadeira, e tenho criticado isso em outros artigos. Na verdade, alguns dos bots de ataque mais inteligentes investigam todas as portas abertas e determinam qual serviço estão transportando, em vez de confiar em uma simples lista de pesquisa de portas e presumir que fornecem os serviços usuais. Mas usar uma porta não padrão pode ajudar a reduzir o ruído e o tráfego ruim na porta 22.

Para configurar uma porta não padrão, edite seu arquivo de configuração SSH:

sudo gedit / etc / ssh / sshd_config

Arquivo de configuração SSH em gedit com edições destacadas

Remova o hash # do início da linha “Port” e substitua “22” pelo número da porta de sua escolha. Salve seu arquivo de configuração e reinicie o daemon SSH:

sudo systemctl restart sshd

Vamos ver o efeito que isso teve. Em nosso outro computador, usaremos o sshcomando para conectar ao nosso servidor. O sshpadrão do comando é usar a porta 22:

ssh dave@howtogeek.local

ssh dave@howtogeek.local em uma janela de terminal

Nossa conexão foi recusada. Vamos tentar novamente e especificar a porta 470, usando a opção -p (porta):

ssh -p 479 dave@howtogeek.local

ssh -p 479 dave@howtogeek.local em uma janela de terminal

Nossa conexão é aceita.

Filtrar conexões usando TCP Wrappers

TCP Wrappers é uma lista de controle de acesso fácil de entender . Ele permite excluir e permitir conexões com base nas características da solicitação de conexão, como endereço IP ou nome de host. Wrappers TCP devem ser usados ​​em conjunto com, e não em vez de, um firewall configurado corretamente. Em nosso cenário específico, podemos restringir as coisas consideravelmente usando TCP wrappers.

Wrappers TCP já estavam instalados na máquina Ubuntu 18.04 LTS usada para pesquisar este artigo. Ele teve que ser instalado no Manjaro 18.10 e Fedora 30.

Para instalar no Fedora, use este comando:

sudo yum install tcp_wrappers

sudo yum instalar tcp_wrappers em uma janela de terminal

Para instalar no Manjaro, use este comando:

sudo pacman -Syu tcp-wrappers

sudo pacman -Syu tcp-wrappers em uma janela de terminal

Existem dois arquivos envolvidos. Um detém a lista de permitidos e o outro detém a lista de negados. Edite a lista de negação usando:

sudo gedit /etc/hosts.deny

sudo gedit /etc/hosts.deny em uma janela de terminal

Isso abrirá o gediteditor com o arquivo negar carregado nele.

Recomendado:  O Windows 10 está finalmente obtendo uma linha de comando real

arquivo hosts.deny carregado no gedit

Você precisa adicionar a linha:

TUDO TUDO

E salve o arquivo. Isso bloqueia todos os acessos que não foram autorizados. Agora precisamos autorizar as conexões que você deseja aceitar. Para fazer isso, você precisa editar o arquivo de permissão:

sudo gedit /etc/hosts.allow

sudo gedit /etc/hosts.allow em uma janela de terminal

Isso abrirá o gediteditor com o arquivo de permissão carregado nele.

Arquivo hosts.allow carregado no gedit com destaques das ediçõesd

Adicionamos o nome do daemon SSH SSHD, e o endereço IP do computador que permitiremos fazer uma conexão. Salve o arquivo e vamos ver se as restrições e permissões estão em vigor.

Primeiro, tentaremos nos conectar de um computador que não está no hosts.allowarquivo:

Conexão SSH recusada por TCP wrappers

A conexão foi recusada. Agora tentaremos conectar a partir da máquina no endereço IP 192.168.4.23:

Conexão SSH permitida por TCP wrappers

Nossa conexão é aceita.

Nosso exemplo aqui é um pouco brutal – apenas um único computador pode se conectar. Wrappers TCP são bastante versáteis e mais flexíveis do que isso. Ele oferece suporte a nomes de host, curingas e máscaras de sub-rede para aceitar conexões de intervalos de endereços IP. Você é encorajado a verificar a página do manual .

Rejeitar solicitações de conexão sem senhas

Embora seja uma prática ruim, um administrador de sistema Linux pode criar uma conta de usuário sem senha. Isso significa que as solicitações de conexão remota dessa conta não terão senha para verificação. Essas conexões serão aceitas, mas não autenticadas.

As configurações padrão para SSH aceitam solicitações de conexão sem senhas. Podemos mudar isso facilmente e garantir que todas as conexões sejam autenticadas.

Precisamos editar seu arquivo de configuração SSH:

sudo gedit / etc / ssh / sshd_config

Arquivo de configuração SSH carregado no gedit com as edições destacadas

Percorra o arquivo até ver a linha que diz “#PermitEmptyPasswords no.” Remova o hash #do início da linha e salve o arquivo. Reinicie o daemon SSH:

sudo systemctl restart sshd

Use chaves SSH em vez de senhas

As chaves SSH fornecem um meio seguro de login em um servidor SSH. As senhas podem ser adivinhadas, quebradas ou com força bruta . As chaves SSH não estão abertas a esses tipos de ataque.

Ao gerar chaves SSH, você cria um par de chaves. Uma é a chave pública e a outra é a chave privada. A chave pública é instalada nos servidores aos quais você deseja se conectar. A chave privada, como o nome sugere, é mantida em segurança no seu próprio computador.

As chaves SSH permitem que você faça conexões sem uma senha que são – contra-intuitivamente – mais seguras do que as conexões que usam autenticação de senha.

Quando você faz uma solicitação de conexão, o computador remoto usa sua cópia da sua chave pública para criar uma mensagem criptografada que é enviada de volta ao seu computador. Como ele foi criptografado com sua chave pública, seu computador pode descriptografá-lo com sua chave privada.

Em seguida, o computador extrai algumas informações da mensagem, principalmente a ID da sessão, a criptografa e a envia de volta ao servidor. Se o servidor puder descriptografá-lo com sua cópia de sua chave pública e se as informações dentro da mensagem corresponderem às que o servidor enviou para você, sua conexão será confirmada como proveniente de você.

Aqui, uma conexão está sendo feita ao servidor em 192.168.4.11, por um usuário com chaves SSH. Observe que eles não são solicitados a fornecer uma senha.

ssh dave@192.168.4.11

Solicitação SSH sendo autenticada por chave SSH em uma janela de terminal

As chaves SSH merecem um artigo só para elas. Com folga, temos um para você. Veja como criar e instalar chaves SSH .

Desativar autenticação de senha completamente

Obviamente, a extensão lógica do uso de chaves SSH é que, se todos os usuários remotos forem forçados a adotá-las, você poderá desativar a autenticação de senha completamente.

Recomendado:  Como saber se você está comprando de um vendedor terceirizado na Amazon

Precisamos editar seu arquivo de configuração SSH:

sudo gedit / etc / ssh / sshd_config

editor gedit com o arquivo de configuração ssh carregado e as edições destacadas

Percorra o arquivo até ver a linha que começa com “#PasswordAuthentication yes”. Remova o hash #do início da linha, altere o “sim” para “não” e salve o arquivo. Reinicie o daemon SSH:

sudo systemctl restart sshd

Desativar encaminhamento X11

O encaminhamento X11 permite que usuários remotos executem aplicativos gráficos a partir do seu servidor em uma sessão SSH. Nas mãos de um agente de ameaças ou de um usuário mal-intencionado, uma interface GUI pode facilitar seus propósitos malignos.

Um mantra padrão na segurança cibernética é, se você não tiver um motivo genuíno para ativá-la, desative-a. Faremos isso editando seu arquivo de configuração SSH:

sudo gedit / etc / ssh / sshd_config

editor gedit com o arquivo de configuração ssh carregado e as edições destacadas

Percorra o arquivo até ver a linha que começa com “# X11Forwarding no.” Remova o hash #do início da linha e salve o arquivo. Reinicie o daemon SSH:

sudo systemctl restart sshd

Defina um valor de tempo limite de inatividade

Se houver uma conexão SSH estabelecida com o seu computador e não houver atividade nele por um período de tempo, isso pode representar um risco à segurança. É possível que o usuário tenha deixado sua mesa e esteja ocupado em outro lugar. Qualquer outra pessoa que passar por sua mesa pode se sentar e começar a usar seu computador e, via SSH, o seu computador.

É muito mais seguro estabelecer um limite de tempo limite. A conexão SSH será interrompida se o período inativo corresponder ao limite de tempo. Mais uma vez, editaremos seu arquivo de configuração SSH:

sudo gedit / etc / ssh / sshd_config

editor gedit com o arquivo de configuração SSH carregado e edições destacadas

Percorra o arquivo até ver a linha que começa com “#ClientAliveInterval 0” Remova o hash #do início da linha, altere o dígito 0 para o valor desejado. Usamos 300 segundos, o que significa 5 minutos. Salve o arquivo e reinicie o daemon SSH:

sudo systemctl restart sshd

Definir um limite para tentativas de senha

Definir um limite para o número de tentativas de autenticação pode ajudar a impedir a adivinhação de senhas e ataques de força bruta. Após o número designado de solicitações de autenticação, o usuário será desconectado do servidor SSH. Por padrão, não há limite. Mas isso é rapidamente remediado.

Novamente, precisamos editar seu arquivo de configuração SSH:

sudo gedit / etc / ssh / sshd_config

editor gedit com o arquivo de configuração ssh carregado e as edições destacadas

Percorra o arquivo até ver a linha que começa com “#MaxAuthTries 0”. Remova o hash #do início da linha, altere o dígito 0 para o valor desejado. Usamos 3 aqui. Salve o arquivo ao fazer as alterações e reinicie o daemon SSH:

sudo systemctl restart sshd

Podemos testar isso tentando conectar e inserindo deliberadamente uma senha incorreta.

Usuário sendo desconectado após dois ataques de autenticação incorretos em uma janela de terminal

Observe que o número de MaxAuthTries parece ser um a mais do que o número de tentativas permitidas ao usuário. Após duas tentativas erradas, nosso usuário de teste é desconectado. Isso foi com MaxAuthTries definido como três.

Desativar log-ins de raiz

É uma má prática fazer login como root em seu computador Linux. Você deve fazer login como um usuário normal e usar sudopara executar ações que requerem privilégios de root. Ainda mais, você não deve permitir que o root faça login em seu servidor SSH. Apenas usuários regulares devem ter permissão para se conectar. Se eles precisarem realizar uma tarefa administrativa, eles também devem usar sudo. Se você for forçado a permitir que um usuário root efetue login, você pode pelo menos forçá-lo a usar chaves SSH.

Pela última vez, teremos que editar seu arquivo de configuração SSH:

sudo gedit / etc / ssh / sshd_config

editor gedit com o arquivo de configuração ssh carregado e as edições destacadas

Percorra o arquivo até ver a linha que começa com “#PermitRootLogin proibir-senha” Remova o hash #do início da linha.

  • Se você quiser evitar que o root efetue login, substitua “proibir senha” por “não”.
  • Se você vai permitir que o root efetue login, mas forçá-lo a usar chaves SSH, deixe “proibir senha” no lugar.

Salve suas alterações e reinicie o daemon SSH:

sudo systemctl restart sshd

The Ultimate Step

Claro, se você não precisa do SSH em execução no seu computador, certifique-se de que esteja desabilitado.

sudo systemctl stop sshd
sudo systemctl disable sshd

Se você não abrir a janela, ninguém pode entrar.