Medidas simples para proteger um servidor Linux

surrounded by sharksColocar um servidor ligado diretamente à Internet é um dos maiores desafios em termos de segurança. Logo que a ligação é estabelecida, é questão de minutos que comece a receber todo o tipo de tentativas de acesso. As tentativas são muito diversas sendo comuns os varridos das portas para detetar os serviços que correm, identificar versões e potenciais vulnerabilidades ainda não resolvidas. Seguem-se os ataques de força-bruta, onde cada serviço é martelado sistematicamente com as combinações de utilizador e senha mais comuns. As origens também são muito diversas. Por volume, destacam as de origem chinês, mas outros países não são infrequentes (Estados Unidos, França, Romania, entre muitos outros).

O cenârio é formidável, e não sendo possível estar permanentemente a vigiar o servidor nem estar à par de todas as possíveis vulnerabilidades em tempo real (podem consultar as vulnerabilidades em qualquer sistema em https://cve.mitre.org/find/index.html), é preciso procurar métodos que dificultem e atrasem os ataques.

Neste artigo apresentamos algumas medidas simples que ajudam neste objetivo.

A primeira medida é não instalar qualquer programa/servidor que não seja realmente necessário. Um serviço que foi instalado mas que não é usado, normalmente não recebe a atenção devida, e é muito fácil que negligenciemos a sua configuração e acabemos por facilitar o seu abuso.

A segunda medida é manter o sistema atualizado para garantir que são removidas dos nossos sistemas quaisquer eventuais vulnerabilidades já descobertas.

A terceira é garantir que estamos a usar métodos de acesso suficientemente seguros. Se o método de acesso é o habitual nome de utilizador e senha, é importante que a senha seja suficientemente complexa e não trivial. Não deve ser trivial porque o atacante tentará adivinhar a senha antes de tentar métodos mais difíceis. Nomeadamente usam dicionários, com palavras e nomes de dicionários (normalmente ingleses, mas não só) e tentam cada uma das palavras de forma sistemática e incluíndo variações (como mudar maiúsculas e minúsculas, trocar letras por números, inverter as palavras, etc.). Para ser complexa, a senha deve ter, no mínimo 12 carateres e incluir letras minúsculas, maiúsculas, números e símbolos. Quanto ao utilizador, existem alguns nomes bem conhecidos e que são tentados, tais como “root”, “admin”, “ubuntu”, etc. É possível criar um utilizador distinto e com um nome pouco comum com o qual aceder ao sistema, ao tempo que desabilitamos o acesso externo dos utilizadores comuns. É claro que mudar a senha com alguma frequência também ajudará.

Uma quarta medida é usar portas de acesso distintas das habituais. Por ex., o servidor SSH usa a porta 22 para receber ligações. Mudar a porta para outra, como por ex. 2022, dificultará os ataques.

Uma quinta medida é bloquear endereços IPs de origens que sabemos não ser normal tentar aceder ao nosso sistema. Para isso podemos tirar partido dos ficheiros hosts.allow e hosts.deny na pasta /etc de todas as distribuições Linux. Sempre que há uma nova ligação, o sistema comprova se o IP de origem existe no ficheiro hosts.allow. Se existir, a ligação é permitida. Se não existir no ficheiro hosts.allow, é procurado no ficheiro hosts.deny. Se existir em hosts.deny, a ligação é recusada. Se o IP não for encontrado em qualquer um dos ficheiros, a ligação é aceite. Se soubermos que a gestão do servidor via ssh só será feita a partir a partir de Portugal, podemos colocar todos os endereços IP atribuídos a entidades portuguesas no ficheiro hosts.allow, e no ficheiro hosts.deny só precisamos duma linha que diga “sshd: ALL”. Com estes simples método, bloqueamos todas as ligações de fora de Portugal ao nosso servidor ssh. Existem diversos sites que fornecem os blocos de endereços IPs atribuídos, por país ou por empresa. Um destes serviços é https://www.countryipblocks.net/country_selection.php.

Uma última medida, e para não estender demasiado este artigo, é instalar um serviço como fail2ban (http://www.fail2ban.org/wiki/index.php/Main_Page). Este serviço deve ser configurado para funcionar corretamente, e analisa os diferentes logs do sistema, identificando os endereços de origem que geram um número pré-determinado de falhas num certo período de tempo. Os endereços identificados são bloqueados por um período de tempo que podemos definir. É importante que, na configuração, definamos como confiáveis os endereços IP que usamos para aceder. Se por algum motivo fizermos diversas tentativas erradas por engano, poderemos bloquear-nos fora do sistema.