Montando o servidor web para seu site em Joomla!
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)
Some articles published on the Joomla Community Magazine represent the personal opinion or experience of the Author on the specific topic and might not be aligned to the official position of the Joomla Project
By accepting you will be accessing a service provided by a third-party external to https://magazine.joomla.org/
Comments