Dicas para manter seu Servidor Web mais Seguro
Muita gente pode aprender com o pouco que você sabe, desde que você compartilhe.
Blog do Frontend
Dicas para tornar seu servidor web seguro
Home » Blog do Frontend » Dicas para tornar seu servidor web seguro
13/01/2017 Segurança
Ter um servidor web seguro é de suma importância para que suas aplicações e seus dados estejam o menos vulneráveis possível. A web é um lugar de trânsito livre (até certo ponto é claro), onde navegam os mais diferentes tipos de usuários, desde os mais leigos aos mais experientes.
Ppensando nesses tipos de usuários desenvolvemos os mais diversos tipos de aplicações para web e muitas delas requerem algum tipo de dado desses usuários para que os mesmos tenham experiências melhores.
Mas o que fazemos para garantir a segurança dos dados desses usuários que esperam mais e o melhor de cada serviço web que utilizam? Bom devemos zelar por eles oferecendo aplicações e serviços seguros e de qualidade.
Vamos tratar aqui de um assunto tão importante quanto desenvolver uma aplicação segura, vamos falar de seu servidor web. Ele é realmente seguro? o que você faz para mantê-lo 100% disponível e funcional?
Bom, aqui darei algumas dicas bem importantes para que o seu servidor web esteja mais seguro do que provavelmente é hoje.
Já que estamos falando de segurança não custa nada relembrar das bases deste conceito numa breve introdução. A segurança da informação diz respeito a assegurar a confidencialidade, integridade, disponibilidade, autenticidade e irretratabilidade ou não repúdio de dados, não importando qual o seu valor.
Esses pilares são essenciais para toda a aplicação que envolve algum tipo de transação de informação seja ela local (aplicativos, sistemas operacionais, etc) ou web (sites, blogs, portais, etc) e deve ser tratada com cuidado e atenção já que sem ele você poderia perder tudo o que construiu. Drástico no é!?
Para evitar que esse desastre aconteça com você, fecharemos algumas das brechas mais comuns encontradas em servidores web baseados em Linux, que apesar de ser uma das opções mais seguras usadas em servidores, vem com configurações padrão que devem ser alteradas de acordo com a sua necessidade.
Como exemplo para os comandos utilizaremos como base um servidor Linux Debian com Apache, PHP5, Mysql e Proftpd instalados.
O que é preciso para manter o seu servidor web seguro?
Manter um servidor web seguro não é uma tarefa fácil, pois requer tempo, atenção e investimento que aumentam exponencialmente de acordo com o propósito de suas aplicações, mas não é por causa disso que deixaremos de cuidar do pouco que temos, e que certamente é algo que te gera algum capital. Começaremos pelas senhas.
Como estamos tratando de um servidor Linux temos por padrão um usuário root que deve ter uma senha forte, ou seja, nada de nomes, datas, ou coisas que fazem muito sentido. Utilize caracteres especiais, números, letras maiúsculas e minúsculas, tudo isso em pelo o menos 16 caracteres
Pode parecer muito e complicado, mas é uma das maneiras mais seguras de evitar um ataque de força bruta a qualquer tipo de usuário desde que todo o resto esteja igualmente seguro. Isso se aplica a todos os usuários ativos e passivos no sistema e aplicações. Para alterar a sua senha de root utilize o comando:
O mesmo serve para outros usuários, bastando alterar o nome root pelo nome do usuário que pretende alterar a senha.
O Apache é um dos servidores web mais utilizados, porém existem outros como lighttpd e nginx. Nesse exemplo utilizo o Apache2, nele existem alguns módulos que cobrem algumas brechas e complementam a instalação padrão, os módulos de segurança mod-security e mod-evasive, que agem como um firewall que proteje sua aplicação contra ataques DOS e DDOS:
Instalando o mod-security:
renomeie o arquivo modesecurity.conf-recomended para modesecurity.conf
$ mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
Abra o arquivo de configuração que renomeamos para podermos alterar o necessário
$ vim /etc/modsecurity/modsecurity.conf
Edite a linha seguinte para ativar o mod-secutiry
Edite a seguinte opção para aumentar o limite de requisição para 16MB ou para o tamanho que achar conveniente e salve o arquivo:
SecRequestBodyNoFilesLimit 16384000
Ative o mod-security:
$ a2enmod mod-security
Instalando o mod-evasive:
Verifique se as linhas abaixo estão contidas no arquivo /etc/apache2/apache2.conf
# Inclusão de configuração dos módulos:
Logo abaixo dessas linhas insira as seguintes:
# Obs.: Essas configurações se aplicam a cada IP que solicite a URL da sua aplicação
# Permite até 50 requisições de todo o site por segundo
# Permite até 2 requisições da mesma URL por segundo
# Caso o IP quebre alguma das regras acima será bloqueado durante 60 segundos e receberá uma mensagem 403 forbiden
# Email que receberá notificações de regras quebradas
DOSEmailNotify alguem@algumacoisa.com
Altere os números de acordo com a quantidade de requisições que o seu servidor recebe deixando uma brecha para que os seus usuários não sejam afetados sem necessidade.
Obs.: Substitua alguem@algumacoisa.com pelo email que você quer que receba as notificações.
Enfim reinicie o apache e para que as novas diretivas de segurança tenham validade:
$ sudo SecRuleEngine On/etc/init.d/apache2 restart
O SSH é um dos serviços de acesso remoto mais utilizados para manutenções à distância. Caso seu servidor seja gerenciado por você e utilize o ssh para acesso remoto, é bom alterar as configurações padrão desse serviço.
Muitos ainda usam o root como usuário ssh principal, isso não é aconselhável, pois root é o nome padrão do usuário administrador no Linux o que facilita um possível ataque de força bruta, e para evitarmos que esse tipo de ataque aconteça você teremos que fechar essa brecha de acesso direto ao super usuário.
Devemos criar um usuário comum para "logar" em acesso remoto com o ssh, e além disso o número de tentativas de acesso com falhas deve ser verificado e deixado em uma quantidade razoável, para que o IP que tentar acessar o serviço ssh muitas vezes com falha de autenticação seja bloqueado.
A quantidade de sessões simultâneas também deve ser verificada. Vamos resolver esses problemas alterando o arquivo de configuração do ssh, o sshd_config, que se encontra em /etc/ssh. Procure as linhas descritas abaixo e faça as seguintes alterações:
# Pertmite ou não o acesso de login ao usuário root opções (yes) ou (no).
#Para maior segurança deixe como (no).
# Permite ou não o acesso remoto sem autenticação, opções (yes) ou (no).
#Para maior segurança deixe como no.
# Limita o número de acessos simultâneos
# Limita o número de tentativas de login o padrão 6
#Permite ou não o acesso remoto sem senha (yes) ou (no)
Ao fim da configuração reinicie o serviço para que as alterações sejam aplicadas:
Protocolo de transferência de arquivos utiliza por padrão duas portas TCP conhecidas: a porta 21 que é usada para o controle da conexão e a porta 20 é usada na transferência de dados. Esse protocolo por padrão não contém nenhum tipo de criptografia.
Se você o utiliza com as configurações default, tem uma vulnerabilidade no seu serviço. Para resolver isso existem algumas configurações que o deixarão menos vulnerável, basta seguir as dicas abaixo e deixar mais seguro o seu serviço de FTP.
# A porta 21 é a porta padrão utilizada pelo serviço FTP
Port 58791
# Para evitar ataques de negação de serviço, defina o número máximo de conexões simultâneas a 5.
# Se você precisa permitir mais de 5 conexões simultâneas aumente este valor.
Após terminar as alterações abra a porta selecionada no iptables:
$ iptables -D INPUT -p tcp --dport 58791 -j DROP
Limite acesso do usuário FTP apenas aos diretórios que sejam necessários. Para isso adicione uma regra no arquivo de configuração do seu servidor. No nosso caso o servidor é o proftpd e o arquivo de configuração do proftpd.conf está em /etc/proftpd/
AllowUser master, frontend
Reinicie o serviço ftp no caso o servidor ftp é o proftpd:
Outra alternativa ao FTP é o SFTP que pode ser ativado editando o arquivo de configuração do SSH sshd_config inserindo a linha abaixo:
Isso habilita a criptografia do serviço de FTP o que deixa a transferência de dados um pouco mais lenta já que os arquivos tem que ser descriptografados e verificados um a um.
Depois reinicie o serviço:
Para manter o php mais seguro existem algumas práticas que podem ser adotadas em sua configuração padrão. Utilizaremos o Suhosin que é um sistema de proteção PHP que hardeniza a sua instalação dos mais conhecidos problemas em aplicações PHP. Atualmente temos o PHP 7 que já tem muitas novidades e correções, e que por certo também suporta o suhoshin.
Primeiro vamos configurar o PHP
O arquivo de configurações do PHP é o php.ini que se localiza em /etc/php5/apache2, nele iremos realizar as alterações necessárias a seguir que são opcionais, e dependem de sua necessidade.
Caso as suas aplicações em PHP não utilizem upload é interessante desabilitar essa funcionalidade, que pode ser uma brecha para uploads de scripts PHP maliciosos. Para isso altere a seguinte linha:
# Habilita ou desabilita uploads via scripts PHP opções (on) ou (off)
Caso utilize upload, limite o tamanho permitido ao necessário para que sua aplicação funcione:
Durante o desenvolvimento de uma aplicação é interessante ver os erros do php, mas mostrar erros online é o mesmo que mostrar ao mundo qual porta está sem tranca. E isso não é bom. Em nosso servidor teremos essa funcionalidade desabilitada já que em produção não é aconselhável deixá-la habilitada.
# Permite ou não que os erros de scripts php sejam exibidos durante o carregamento da página
Obs.: Essas alterações não farão efeito se sua aplicação estiver configurada para mostrar os erros, já que essa alteração é geral, mas pode ser alterada para uma aplicação específica dentro de seu servidor.
Vamos agora ao nosso glorioso Suhosin
Para instalar o Suhosin primeiro devemos ter o pacote dev do php instalado em nosso servidor:
Baixe a última versão do Suhosin Extension direto do site oficial (até a data de postagem deste artigo o Suhosin Extension se encontrava na versão 0.9.38):
$ wget http://download.suhosin.org/suhosin-0.9.38.tgz
Tendo em mãos a última versão vamos agora instalar e configurar esse novo módulo, para isso siga as instruções abaixo:
$ tar zxf suhosin-0.9.38.tgz
Entre no diretório e prepare o ambiente de compilação do Suhosin:
$ cd suhosin-0.9.38 && phpize
Instale o Suhosin:
Adicione ao fim do seu php.ini o seguinte conteúdo:
;Ativa extensão Suhosin
Algumas configurações do Suhosin que podem ser inclusas no fim do php.ini
; Limite de Recursos
memory_limit = 198M
suhosin.get.max_vars = 3000
suhosin.get.max_totalname_length = 8192
Reinicie o apache para validar a nova configuração:
Pronto! O Suhosin está instalado e devidamente configurado. Não vamos nos aprofundar em suas configurações agora, isso é papo pra outro post, basta acompanhar o meu humilde blog e ficar por dentro do pouquinho que eu sei.
Todas essas dicas são apenas o começo para que você tornar o seu servidor web mais seguro, pois além de ter um servidor bem configurado, desenvolver aplicações igualmente seguras e utilizar das melhores práticas de desenvolvimento, você também deve garantir o funcionamento desse servidor adquirindo um no-break para evitar desligamentos brutos o que pode prejudicar o hardware, o sistema e as aplicações.
E além disso manter o seu backup em dia, afinal, não dá pra contar 100% com a sorte. Bom, por hoje é só pessoal, espero que tenham gostado e caso tenham encontrado algum erro ou tenham alguma dica ficarei feliz em saber e ouvir vocês nos comentários abaixo. Valeu, e até a próxima!