você está aqui: Home  → Arquivo de Mensagens

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


Veja a relação completa dos artigos de Alexandro Silva

 

 

Opinião dos Leitores

Alexos
24 Jan 2011, 23:59
Olá Daniel,

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
Daniel Gusmão
24 Jan 2011, 18:50
Olá Alexos,

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 ?
Alexos
24 Jan 2011, 12:55
Olá Daniel,

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
Daniel Gusmão
24 Jan 2011, 10:39
Sobre o monitoramento, o que vocês tem a dizer sobre o uso do Webmin ????
Nelson
23 Jan 2011, 16:34
Só não liga muito para o tom em que eu falo as coisas, porque eu sou meio chato mesmo ;-)

Abraços!
Alexandro Silva
23 Jan 2011, 16:00
Olá Nelson,

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
Nelson
23 Jan 2011, 15:38
Não, sua regra não distingue hosts diferentes. Ela apenas conta pacotes com a flag SYN, independente da origem.

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.
Alexandro Silva
23 Jan 2011, 15:18
Olá Nelson,

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
Nelson
23 Jan 2011, 01:39
Cuidado para não seguir as coisas cegamente.

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?
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script