Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
LAMP++ - Implementando um servidor LAMP seguro
Colaboração: Alexandro Silva
Data de Publicação: 24 de janeiro de 2011
Vocês devem estar achando que fiquei maluco, porque postar um assunto tão batido?
Calma!
O objetivo deste post é apresentar todo o processo de implantação de um servidor LAMP seguro de forma rápida e prática. Veremos quais são os pacotes necessários, como fazer o hardening, tunning, monitoramento e segurança.
Não irei detalhar cada fase do processo, quando necessário irei adicionar links com maiores informações.
Instalação dos pacotes
aptitude install apache2 apache2-mpm-prefork apache2-utils apache2.2-common binutils build-essential ca-certificates curl dbconfig-common defoma dpkg-dev fontconfig-config gawk javascript-common libapache2-mod-php5 libapr1 libaprutil1 libc6-dev libcurl3 libdbd-mysql-perl libdbi-perl libexpat1 libfontconfig1 libfreetype6 libgd2-xpm libgmp3c2 libgomp1 libhtml-template-perl 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 eu recomendo a seguinte configuração:
StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 1000 MaxClients 1000 MaxRequestsPerChild 0
Descrição de cada diretiva
- StartServers - Configura o número de processos filhos criados na inicialização (Recomendado deixar o valor padrão)
- MinSpareServers - Número minimo de processos que não manipulam requisições. (Recomendado deixar o valor padrão)
- MaxSpareServers - Número máximo de processos que não manipulam requisições. (Recomendado deixar o valor padrão)
- ServerLimit - Valor máximo da diretiva MaxClients. (Deve ser igual ou superior ao MaxClients)
- MaxClients - Número máximo de conexões simultâneas. (Varia de acordo com os recursos disponíveis)
- MaxRequestsPerChild - Limite de requesições que um processo filho poderá manipular. (0 siginifica ilmitado)
Dica Importante: Para testes de benchmark do Apache2 recomendo 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 recomendo 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 recomendo 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
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 alexos 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 , você encontra como instalar e configurar o Munin em http://blog.alexos.com.br/?p=950.
Agora vou apresentar como configurar o 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 www-data.
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.
A instalação e configuração do Ossec Hids você encontrará em http://blog.alexos.com.br/?p=869.
OBS Importante: 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
Se desejar faça o download do script (Cópia Local).
Adcione esse script na inicialização do sistema
update-rc.d firewall.sh defaults
Testando 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
Conclusão
No que tange a segurança dos servidores LAMP venho tendo bastante sucesso seguindo estes passos. Sei que existem outras implementações tão melhores quanto essa, porém aqui sigo boas práticas e faço uso de poucas ferramentas tornando sua aplicabilidade rápida, simples e de fácil gerência.
Fonte: http://blog.alexos.com.br/?p=2200&lang=pt-br
Blog do autor: http://www.alexos.org
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
24 Jan 2011, 23:59
Não sou fã de ferramentas tipo Webmin e companhia, acredito que a linha de comando é o melhor amigo de um Sysadmin.
Nunca usei o ispconfig mas existe um documentação rica sobre ele no Howtoforge[1]
[1] http://www.howtoforge.com
Sds,
Alexos
24 Jan 2011, 18:50
Mas é seguro e confiavel ?
E se quiser gerar cotas de Hospedagem e criação de dominios o http://www.ispconfig.org/ é um bom gerenciador e existe algum passo-a-passo bom para configurar ?
24 Jan 2011, 12:55
O Webmin é uma ferramenta que facilita a configuração e gerência do serviços e do sistema. Ele não é uma ferramenta de monitoramento.
Sds,
Alexos
24 Jan 2011, 10:39
23 Jan 2011, 16:34
Abraços!
23 Jan 2011, 16:00
Muito obrigado por essas preciosas informações. Quero esclarecer que as informações contidas neste post são exemplos e não regras.
Qualquer pessoa poderá melhorá-la ou adequá-la a sua necessidade.
Se quiser pode melhorar o script e encaminhar suas melhorias, que com certeza publicarei.
Como informei na conclusão estas implementações vem dando certo para mim a algum tempo, mas estou super interessado em novas sugestões de melhorias.
Forte abraço e muito obrigado,
Alexos
23 Jan 2011, 15:38
Em todo caso, como você utiliza o alvo RETURN o pacote vai ser sempre aceito e não vai proteger em nada contra SYN floods.
Um RETURN na cadeia INPUT apenas executa a política padrão (que no caso é ACCEPT (iptables -P INPUT ACCEPT)).
Se estivesse implementado com REJECT com tcp-reset, por exemplo, mesmo assim 10 clientes não acessariam o seu servidor ao mesmo tempo.
23 Jan 2011, 15:18
Para que é necessário instalar, por exemplo, os pacotes build-essential e libc6-dev?
Os pacotes build-essential e libc6-dev são necessários para a instalação do Ossec Hids.
Do mesmo jeito que você limita pacotes com a flag SYN em 1/s, com burst de 3/s. Se tiver 10 clientes querendo conectar ao servidor ao mesmo tempo, o que acontece?
Essa limitação é para bloquear ataques de Syn Flood, que significa várias sessões Syn de uma mesma origem.
Quando eu tenho 10 hosts distintos tentando conectar no meu server as requesições Syn são de origens diferentes.
Esse tipo de implementação é básica em qualquer firewall.
Abs,
Alexos
23 Jan 2011, 01:39
Para que é necessário instalar, por exemplo, os pacotes build-essential e libc6-dev?
Do mesmo jeito que você limita pacotes com a flag SYN em 1/s, com burst de 3/s. Se tiver 10 clientes querendo conectar ao servidor ao mesmo tempo, o que acontece?




