Servidor web: Dicas para manter seu ambiente Web seguro

Segurança

Ter um ambiente web seguro é de suma importância para que suas aplicações e seus dados estejam 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, pensando 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 de qualidade e seguros.
Vamos tratar aqui de um assunto tão importante quanto desenvolver uma aplicação segura, vamos falar de seu ambiente 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.

Pilares da segurança da informação

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 ambiente web seguro?

Manter um ambiente web seguro não é uma tarefa fácil, pois requer muito 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:

password root

O mesmo serve para outros usuários, bastando alterar o nome root pelo nome do usuário que pretende alterar a senha.

Apache

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:

$ sudo apt-get install libapache-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

SecRuleEngine On

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:

SecRequestBodyLimit 16384000
SecRequestBodyNoFilesLimit 16384000

Ative o mod-security:

$ a2enmod headers
$ a2enmod mod-security

Instalando o mod-evasive:

$ sudo apt-get install libapache2-mod-evasive

Verifique se as linhas abaixo estão contidas no arquivo /etc/apache2/apache2.conf

# Inclusão de configuração dos módulos: 
Include mods-enabled/*.load
Include mods-enabled/*.conf

Logo abaixo dessas linhas insira as seguintes:

<IfModule mod_evasive20.c>

    # Obs.: Essas configurações se aplicam a cada IP que solicite a URL da sua aplicação
    DOSHashTableSize 3097

    # Permite até 50 requisições de todo o site por segundo
    DOSSiteInterval 1
    DOSSiteCount 50

    # Permite até 2 requisições da mesma URL por segundo
    DOSPageInterval 1
    DOSPageCount 2

    # Caso o IP quebre alguma das regras acima será bloqueado durante 60 segundos e receberá uma mensagem 403 forbiden 
    DOSBlockingPeriod 60

    # Email que receberá notificações de regras quebradas
    DOSEmailNotify alguem@algumacoisa.com

</IfModule>

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

SSH

O SSH é um dos serviços de acesso remoto muito utilizados para manutenções à distância, caso seu servidor de 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 devemos 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).
PermitRootLogin no

# Permite ou não o acesso remoto sem autenticação, opções (yes) ou (no). 
#Para maior segurança deixe como no.
PasswordAuthentication yes

# Limita o número de acessos simultâneos 
MaxSessions 2

# Limita o número de tentativas de login o padrão 6
MaxAuthTries 2

#Permite ou não o acesso remoto sem senha (yes) ou (no)
PermitEmptyPasswords no

Ao fim da configuração reinicie o serviço para que as alterações sejam aplicadas:

$ sudo /etc/init.d/sshd restart

FTP

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.
MaxInstances 30

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/

<Directory /var/www/>
<Limit ALL>

      AllowUser master, frontend

</Limit>
</Directory>

Reinicie o serviço ftp no caso o servidor ftp é o proftpd:

$ sudo /etc/init.d/proftpd restart

Outra alternativa ao FTP é o SFTP que pode ser ativado editando o arquivo de configuração do SSH sshd_config  inserindo a linha abaixo:

Subsystem sftp /usr/lib/openssh/sftp-server

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:

$ sudo /etc/init.d/ssh restart

PHP

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)
file_uploads = Off

Caso utilize upload, limite o tamanho permitido ao necessário para que sua aplicação funcione:

upload_max_filesize = 2M

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
display_errors = Off

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:

$ sudo apt-get install php5-dev

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

Execute o script de configuração:

./configure

Instale o Suhosin:

$ make && make install

Adicione ao fim do seu php.ini  o seguinte conteúdo:

;Ativa extensão Suhosin
extension = suhosin.so

Algumas configurações do Suhosin que podem ser inclusas no fim do php.ini

;;;;;;;;;;;;;;;;;;;;;;
; Limite de Recursos 
;;;;;;;;;;;;;;;;;;;;;;

max_execution_time = 60

max_input_time = 90

memory_limit = 198M

post_max_size = 64M

max_input_vars = 3000

suhosin.memory_limit = 0

suhosin.request.max_vars = 3000

suhosin.request.max_value_length = 1000000

suhosin.request.max_array_index_length = 256

suhosin.request.max_totalname_length = 8192

suhosin.post.max_vars = 3000

suhosin.post.max_array_index_length = 256

suhosin.post.max_totalname_length = 8192

suhosin.post.max_value_length = 1000000

suhosin.get.max_vars = 3000

suhosin.get.max_array_index_length = 256

suhosin.get.max_totalname_length = 8192

suhosin.get.max_value_length = 1000000

suhosin.sql.bailout_on_error = Off

suhosin.log.phpscript.is_safe = Off

suhosin.log.script = 0

suhosin.log.use-x-forwarded-for = Off

Reinicie o apache para validar a nova configuração:

$ sudo /etc/init.d/apache2 restart

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.

Concluindo

Todas essas dicas são apenas o começo para que você mantenha o seu ambiente web seguro, pois além de ter um servidor bem configurado, e desenvolver aplicações igualmente seguras utilizando 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!

Referências:

http://forums.cpanel.net/f402/suhosin-extension-does-not-officially-support-php-5-2-a-266221.html

http://www.suhosin.org/stories/install.html

http://journalxtra.com/wordpress/wordpress-php-suhosin-out-of-memory-and-execution-timeouts/