28 de dez. de 2018

Configurando o Apache

  • Desabilitando acesso aos diretórios e links simbolicos:
  • Edite o arquivo /etc/apache2/apache2.conf (Debian/Ubuntu):
    <Directory /var/www/zeldani/>
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
    </Directory>
    E mude para:
    <Directory /var/www/zeldani/>
            Options -Indexes
            Options -FollowSymLinks
            AllowOverride None
            Require all granted
    </Directory>
    Depois reinicie o Apache: $ sudo service apache2 restart
    • Escondendo a versão do Apache e OS:
    Quando instalamos o Apache, ele mostra a versão do servidor, sistema operacional e informações sobre os módulos nas páginas de Erro. Para esconder esses detalhes, edite o arquivo de configuração:
    $ sudo vim /etc/apache2/apache2.conf 
    Adicione as linhas:
    ServerSignature Off
    ServerTokens Prod
    
    E reinicie o Apache.

    • Personalizando Páginas de Erro:
    No diretório do site,  vamos criar os arquivos erro_404.html, erro_403.html e erro_50x.html:
    $ echo "<h1 style='color:purple'>404 Página não encontrada (∩︵∩)</h1>" | sudo tee /var/www/html/zeldani/erro_404.html
    $ echo "<h1 style='color:purple'>403 Acesso Negado</h1>" | sudo tee /var/www/html/zeldani/erro_403.html<
    $ echo "<h1 style='color:purple'> Ooops! Alguma coisa deu errado... :-(</h1>" | sudo tee /var/www/html/zeldani/erro_50x.html
    Para fazer as alterações, precisamos editar o arquivo de configuração do site, no nosso exemplo ele se chama zeldani.conf.:
    $ sudo vim /etc/apache2/sites-enabled/zeldani/zeldani.conf

    Adicionar o diretivo ErrorDocument para associar os erros com as páginas de erro e o bloco Files para o Apache responder com as páginas de erro:
    <VirtualHost *:80>
        . . .
        ErrorDocument 404 /erro_404.html
        ErrorDocument 403 /erro_403.html
        ErrorDocument 500 /erro_50x.html
        ErrorDocument 502 /erro_50x.html
        ErrorDocument 503 /erro_50x.html
        ErrorDocument 504 /erro_50x.html
    
        <Files "erro_404.html">
            <If "-z %{ENV:REDIRECT_STATUS}">
                RedirectMatch 404 ^/erro_404.html$
            </If>
        </Files>
        <Files "erro_403.html">
            <If "-z %{ENV:REDIRECT_STATUS}">
                RedirectMatch 404 ^/erro_403.html$
            </If>
        </Files>
        <Files "erro_50x.html">
            <If "-z %{ENV:REDIRECT_STATUS}">
                RedirectMatch 404 ^/erro_50x.html$
            </If>
        </Files>
    </VirtualHost>
    
    Testando a sintaxe: $ sudo apache2ctl configtest
    Não encontrando erro, reinicie o apache.
    • Limitando Requisições:
    Por padrão o tamanho das requisições http do Apache são ilimitados, facilitando os ataques DDoS. No arquivo /etc/apache2/apache2.conf,vamos definir um limite de 100k para os uploads: 
    <Directory /var/www/zeldani/>
            Options -Indexes
            AllowOverride None
            LimitRequestBody 1048576
            Require all granted
    </Directory>
    Depois, reinicie o apache.
    • Desabilitando Módulos:
    Para melhor segurança e perfomance de memória, é recomendado desabilitar os módulos que não estão sendo usados. Para listar os módulos usados:
    $ sudo ls /etc/apache2/mods-enabled/  
    ou 
    $ sudo apache2ctl -M

    Para desabilitar: $ sudo a2dismod nome-modulo
    Os módulos:  mpm_prefork, autoindex, env, negotiation, reqtimeout podem ser removidos na maioria dos ambientes. Depois de fazer as alterações, é so reiniciar o apache.
    • Habilitando o ModSecurity:
    O Mod security é um IDS (sistema de proteção contra intrusões) baseado em regras, que funciona com o Apache, Nginx e IIS. Usado para monitorar o trafico http em tempo real, logging e controle de acesso, prevenindo ataques como sqli, xss, bots, etc.
    Instalando o Mod Security: $ sudo apt-get install libapache2-modsecurity
    Para habilitar o modulo: $ sudo a2enmod security2
    Para desabilitar: $ sudo a2dismod security2
    Para ver se está rodando: $ sudo apachectl -M | grep --color security
    O retorno security2_module (shared) mostra que o módulo está carregado.
    Renomeie o arquivo de configuração: 
    $ sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
    Depois reinicie o Apache.

    Edite o arquivo modsecurity.conf
    $ sudo vim /etc/modsecurity/modsecurity.conf 
    Vamos configurar o mecanismo de regras para processar e interceptar as transações mudando  a linha SecRuleEngine DetectionOnly  para SecRuleEngine On, e a diretiva ResponseBodyAccess On para SecResponseBodyAccess Off, para desativar as respostas armazenadas em buffer, diminuindo o arquivo de log.

    Regras personalizadas podem ser adicionadas a qualquer arquivo de configuração ou colocados nos diretorios do modsecurity. Vamos criar um novo arquivo:
    $ sudo vim /etc/modsecurity/modsecurity_zeldani_rules.conf

    Exemplos de Regras:
    A regra a seguir verifica se existe o parâmetro <script> na requisição e header:
    SecRule ARGS|REQUEST_HEADERS "@rx <script>" \ 
    "id:9990101,msg: 'Ataque XSS',severity:ERROR,deny,status:404"
    ARGS – parâmetros requisitados, REQUEST_HEADERS – todos os headers, “@rx <script>” – expressão regular para encontrar o <script>, ID - pode ser qualquer número desde que seja único, msg - mensagem a ser exibida nos logs, severity - gravidades da regra: EMERGENCY (0), ALERT (1), CRITICAL (2), ERROR (3),WARNING (4), NOTICE (5), INFO (6) e DEBUG (7), deny - intercepta a transação, status - especifica o status da resposta.

    Para bloquear uma url especifica:
    SecRule REQUEST_URI "login.php" \
     "id:'9990102',severity:'3',deny,msg:'Pagina proibida - login.php',status:403"
    
    Verifica se o parâmetro usuario é admin, redirecionando a página:
    SecRule ARGS_GET:usuario "@contains admin" \
    "id:9990103,phase:1,t:lowercase,deny,redirect:https://www.facebook.com"
    O ModSecurity analiza os dados http(s) por 5 fases - REQUEST_HEADERS, REQUEST_BODY, RESPONSE_HEADERS, RESPONSE_BODY e LOGGING. No phase:1 ele faz uma requisição do header. As variáveis ARGS_GET é uma coleção que age como {"chave":"valor"}, quando requisitamos uma variável o ModSecurity vai iterar em cada valor verificando e transformando cada operador. 

    Para bloquear spams, podemos usar o operador @pmFromFile para ler um arquivo com uma lista de palavras a serem bloqueadas:
    SecRule ARGS "@pmFromFile /usr/local/lista_spam.txt" \ 
    "id:9990104,t:lowercase,deny,msg:'Lovely Spam! Wonderful Spam!'"
    Para permitir um IP:
    SecRule REMOTE_ADDR "@ipMatch 74.125.226.180" \
    id:999105,phase:1,t:none,nolog,pass,ctl:ruleEngine=off
    Para desabilitar uma regra:
    SecRuleRemoveById 999105
    • Logs de Erro:
    Os logs de erro do Modsecurity ficam junto com os logs do Apache: 
    $ sudo tail -f /var/log/apache2/error.log | grep ModSec

    Para facilitar a visualização das regras usadas:
    $ sudo grep ModSecurity /var/log/apache2/error.log | sed -e 's#^.*\[id "\([0-9]*\).*hostname "\([a-z0-9\-\_\.]*\)"\].*uri "#\1 \2 #' | cut -d\" -f1 | sort -n | uniq -c | sort -n
    • Instalando o mod_evasive:
    O mod_evasive é um add-on do Apache para proteger dos ataques DDoS. 
    Para instalar: $ sudo apt-get install libapache2-mod-evasive
    Para habilitar: $ sudo a2enmod evasive
    Para desabilitar: $ sudo a2dismod evasive
    Depois reinicie o apache.
    Para configurar, adicione as seguintes linhas no arquivo /etc/apache2/apache.conf:
    <IfModule evasive_module>
     DOSHashTableSize    2048
     DOSPageCount        5
     DOSSiteCount        100
     DOSPageInterval     1
     DOSSiteInterval     2
     DOSBlockingPeriod   10
    
     DOSEmailNotify      zeldani@zeldani.com
     #DOSSystemCommand   "su - zeldani -c '/sbin/... %s ...'"
     DOSLogDir           "/var/log/mod_evasive"
    </IfModule>
    
    O mod_evasive não cria o diretorio de log, então temos que criar ele:
    $ sudo mkdir /var/log/mod_evasive
    $ sudo chown :www-data /var/log/mod_evasive
    $ sudo chmod 771 /var/log/mod_evasive

    Para testar vamos usar o ApacheBench, enviando 100 requisições em 10 requisições simultâneas, causando um DoS:
    $ sudo ab -n 100 -c 10 http://74.125.226.180/
    Podemos ver nos logs de acesso que as conexões do ApacheBench foram negadas com o 403: $ sudo tail /var/log/apache2/access.log
    74.125.226.180 - - [26/Dec/2018:09:44:21 -0500] "GET / HTTP/1.0" 403 346 "-" "ApacheBench/2.3"

    * Fontes:
    https://www.digitalocean.com/community/tutorials/how-to-configure-apache-to-use-custom-error-pages-on-ubuntu-14-04
    https://www.techrepublic.com/article/how-to-secure-your-apache-2-server-in-four-steps/
    https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_security-with-apache-on-debian-ubuntu
    https://haydenjames.io/strip-apache-improve-performance-memory-efficiency/
    https://nature.berkeley.edu/~casterln/modsecurity/html-multipage/03-configuration-directives.html
    https://www.success.grownupgeek.com/index.php/2013/04/07/use-mod_security-to-block-ip-addresses/
    https://www.nuharborsecurity.com/securing-apache-ubuntudebian/
    https://www.unixmen.com/protecting-apache-server-denial-service-dos-attack/
    https://support.kemptechnologies.com/hc/en-us/articles/209635223-How-to-write-a-WAF-rule-Modsecurity-Rule-Writing
    https://hub.packtpub.com/blocking-common-attacks-using-modsecurity-25-part-3/
    https://www.modsecurity.org/CRS/Documentation/making.html
    https://malware.expert/modsecurity/processing-phases-modsecurity/

    0 comentários:

    Postar um comentário