The Joomla! Community Magazine™

Montando o servidor web para seu site em Joomla!

Written by | Saturday, 01 September 2012 00:00 | Published in 2012 September
Muitas pessoas questionam a segurança do CMS Joomla, por desconhecerem que a maioria dos ataques bem sucedidos, ocorrem a nível de servidor.

Obviamente algumas ações são necessárias para potencializar a segurança do CMS e destaco:

1) utilizar sempre a última versão stable;
2) encapsular o diretório de administração (/administrator);
3) diretórios devem ter permissão 755; 
4) arquivos dever possuir permissão 644;e
5) nunca use templates comerciais, pirateados.

Abaixo listo as boas práticas para montagem de um servidor web seguro, voltado a aplicações PHP, particularmente Joomla, baseado em tecnologia Linux-Apache-MySQL-PHP.

Instalação dos pacotes

aptitude install apache2 apache2-mpm-prefork apache2-utils apache2.2-commonbinutils build-essential ca-certificates curl dbconfig-common defoma
dpkg-dev fontconfig-config gawk javascript-common libapache2-mod-php5libapr1 libaprutil1 libc6-dev libcurl3 libdbd-mysql-perl libdbi-perl libexpat1
libfontconfig1 libfreetype6 libgd2-xpm libgmp3c2 libgomp1 libhtml-templateperl libio-multiplex-perl libjpeg62 libjs-jquery libmpfr1ldbl libmysqlclient15off
libnet-cidr-perl libnet-daemon-perl libnet-server-perl libnet-snmp-perl libplrpc-perl libpng12-0 libpq5 libssh2-1 libstdc++6-4.3-dev libt1-5
libtalloc1 libterm-readkey-perl libtimedate-perl libwbclient0 libxpm4 munin-node mysql-server mysql-common openssl openssl-blacklist php5 php5-
common php5-gd php5-mysql php5-suhosin psmisc ssl-cert ttf-dejavu ttf-dejavu-core ttf-dejavu-extra wwwconfig-common libwww-perl htop sudo

Hardening e Tunning do Apache

Edite os seguintes parâmetros do arquivo |/etc/apache2/conf.d/security|

  • Server Tokens
    De
    ServerTokens Full
    Para
    ServerTokens Prod
  • ServerSignature
    De
    ServerSignature On
    Para
    ServerSignature Off
  • TraceEnable
    De
    TraceEnable On
    Para
    TraceEnable Off

(*) Nos arquivos de configuração em |/etc/apache2/sites-available/| edite a diretiva <Document />* deixando da seguinte forma:

<Document />
Order Deny,Allow
Deny from All
Options FollowSymLinks
AllowOverride None
</Document>

Habilite o *server-status* para adquirir estatísticas do Apache2

Crie o arquivo *server-status* em |/etc/apache2/conf.d/| com o seguinte conteúdo:
SetHandler server-status
Deny from all
Allow from localhost

Adicione a seguinte linha no final do arquivo |/etc/apache2/apache2.conf|

ExtendedStatus On
Habilite o módulo *info*
a2enmod info

Habilite o SSL

Para habilitar o SSL acesse http://blog.alexos.com.br/?p=371

Tunning do Apache

As configurações de tunning do Apache2 estão totalmente ligadas a quantidade de recursos (CPU, memória e banda) disponíveis:
Por exemplo para um servidor QuadCore com 8 GB e um link de 5Mb é recomendado a seguinte configuração:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 1000
MaxClients 1000
MaxRequestsPerChild 0

Descrição de cada diretiva

* StartServers (Recomendado deixar o valor padrão)
Configura o número de processos filhos criados na inicialização - http://httpd.apache.org/docs/2.0/mod/mpm_common.html#startservers

* MinSpareServers (Recomendado deixar o valor padrão)
Número minimo de processos que não manipulam requisições - http://httpd.apache.org/docs/2.0/mod/prefork.html#minspareservers

* MaxSpareServers (Recomendado deixar o valor padrão)
Número máximo de processos que não manipulam requisições - http://httpd.apache.org/docs/2.0/mod/prefork.html#maxspareservers

* ServerLimit (Deve ser igual ou superior ao MaxClients)
Valor máximo da diretiva MaxClients - http://httpd.apache.org/docs/2.0/mod/mpm_common.html#serverlimit

* MaxClients (Varia de acordo com os recursos disponíveis)
Número máximo de conexões simultâneas - http://httpd.apache.org/docs/2.0/mod/mpm_common.html#maxclients

* MaxRequestsPerChild (0 siginifica ilmitado)
Limite de requesições que um processo filho poderá manipular - http://httpd.apache.org/docs/2.0/mod/mpm_common.html#maxrequestsperchild

(*) Dica Importante: Para testes de benchmark do Apache2 é recomendado o uso do AB (Apache Benchmark)

Hardening e Tuninng do MySQL

Execute o seguinte comando e siga os passos recomendados:

/usr/bin/mysql_secure_installation

  • Enter current password for root (enter for none):
    Informe a senha do root do mysql ou pressione ENTER se a senha ainda não foi configurada
  • Change the root password? [Y/n]
    Pressione ENTER para criar uma nova senha
  • Remove anonymous users? [Y/n]
    Pressione ENTER
  • Disallow root login remotely? [Y/n]
    Pressione ENTER
  • Remove test database and access to it? [Y/n]
    Pressione ENTER
  • Reload privilege tables now? [Y/n]
    Pressione ENTER

MySQL Tunning

Para o tunning é recomendado o uso do MySQL Performance Tuning Primer Script.
(*) Dica Importante: O uso desta ferrramenta é recomendado após 48 horas de uso do banco permitindo que o script detecte os valores corretos para o tunning do banco. Este script validará os parâmetros do arquivo *my.cnf* e criará um novo arquivo com as alterações recomendadas.

Hardening do PHP

Para ampliar a segurança do PHP é recomendado o uso do Suhosin. O Debian o implementa por padrão.

Além do suhosin é necessário desabilitar os seguintes parâmetros do arquivo |/etc/php5/apache2/php.ini|:

allow_url_fopen = Off (*)
display_errors = Off
magic_quotes_gpc = Off (**)

(*)   é obrigatória a sua habilitação para a atualização automática do Joomla, porém é potencialmente perigosa.
(**) é obrigatória a sua habiltação para o funcionamento do Joomla! 3.0 Alpha

Segurança e Manutenção do S.O.

  • Desabilite o exim4
    invoke-rc.d exim4 stop
    update-rc.d exim4 remove
  • Hardening do SSH
    Modifique as seguintes linhas do arquivo |/etc/ssh/sshd_config|:
    Port 22 para, por exemplo Port 3000
    PermitRootLogin yes para PermitRootLogin no
  • Limite o uso do sudo somente para o grupo admin
    Crie o grupo admin - addgroup admin
    Adicione seu usuário nesse grupo adduser seuuser admin
    Configure o sudo adicionando a seguinte linha: %admin ALL=(ALL) ALL
    Desabilite o usuário root - usermod -L root

Para manter o sistema operacional e os aplicativos atualizados recomendo o uso do Cron-apt.

Monitoramento de performance

Para monitorar a performance do servidor e dos serviços recomendo o uso do Munin  , aqui você encontra como instalar e configurar o Munin.

Agora vamos apresentar a configuração do Munin para monitorar o Apache.

Com o`` server-status`` funcionando habilite os plugins do Apache:

  • cd /etc/munin/plugins
  • ln -s /usr/share/munin/plugins/apache_processes apache_processes
  • ln -s /usr/share/munin/plugins/apache_accesses apache_accesses

Feito isso é necessário editar o arquivo |/etc/munin/plugin-conf.d/munin-node| e informar o usuário com permissão de acesso as informações do apache. No caso do Debian este usuário é o *wwwdata*.

vim /etc/munin/plugin-conf.d/munin-node

[apache2]

user www-data

E para finalizar implemente uma camada a mais de segurança. Recomendo fortemente o uso do Ossec Hids e de um pequeno script de firewall.
Aprenda a instalar e configurar o Ossec Hids.

(*) Durante a instalação do Ossec opte pela instalação *local* ao invés do *server*, assim a instalação será standalone.

Script de Firewall

Crie um arquivo |/etc/init.d/firewall.sh| com o seguinte conteúdo:

  • #!/bin/bash
  • # Server firewall
  • # Alexandro Silva
  • # April 27th '2010
  • PATH=/bin:/usr/bin:/sbin:/usr/sbin
  • TCPOK="123 80 443"
  • UDPOK="53"
  • iptables -F INPUT
  • iptables -F OUTPUT
  • iptables -F FORWARD
  • iptables -P INPUT ACCEPT
  • iptables -P OUTPUT ACCEPT
  • iptables -P FORWARD DROP
  • #Drop incoming malformed NULL packets
  • iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
  • #Drop incoming malformed XMAS packets
  • iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
  • #Syn flood protection
  • iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
  • #Drop incoming ping request
  • iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
  • iptables -A INPUT -j ACCEPT -i lo
  • iptables -A INPUT -j LOG -i ! lo -s 127.0.0.1/255.0.0.0
  • iptables -A INPUT -j DROP -i ! lo -s 127.0.0.1/255.0.0.0
  • iptables -A OUTPUT -j ACCEPT -o lo
  • # Permit SSH in the 3000 port
  • iptables -A INPUT -s 0.0.0.0 -p tcp --dport 3000 -j ACCEPT
  • # Permit access in some TCP ports
  • for PORTA in $TCPOK
  • do
  • iptables -A INPUT -p tcp --dport $PORTA -j ACCEPT
  • done
  • # Permit access in some UDP ports
  • for PORTA in $UDPOK
  • do
  • iptables -A INPUT -p udp --dport $PORTA -j ACCEPT
  • done
  • # Drop other entering connections checking the state
  • iptables -A INPUT -m state --state ! ESTABLISHED,RELATED -j DROP
  • iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Download do script - Adcione esse script na inicialização do sistema

  • update-rc.d firewall.sh defaultsTestando a segurança do servidor

Após a conclusão de todos estes passos use as seguintes ferramentas para scanear o servidor e validar todo o trabalho
* W3af
* Nikto  - Tutorial de utilização do Nikto
* Netsparker

Fonte:  http://blog.alexos.com.br/ (Alexandre Antonio Antunes de Almeida)
Read 13967 times

Download attachments:

Tagged under Portuguese (Brazil)
julio coutinho

julio coutinho

Autor do livro Guia de Consulta Rápida Joomla! 3.x

Formado em Webdesign e Programação, especialista em Engenharia de Sistemas, criador e mantenedor dos domínios www.joomlabrasilia.org e www.joomlabrasilia.com.br com tutoriais, dicas e cursos gratuitos, focados no CMS Joomla.

Iniciou sua caminhada com o CMS, no ano de 2003, quando o projeto respondia por Mambo.