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