você está aqui: Home  → Arquivo de Mensagens Workshop Gratuito: Os Segredos do Shell, com o Prof. Julio Neves

Nginx - Implantação e hardening do nginx no Debian

Colaboração: Alexandro Silva

Data de Publicação: 07 de março de 2012

O Nginx (pronuncia-se "engine-x") é um webserver e proxy reverso para os protocolos http, smtp, pop3 e imap focado em alta performance. Sua utilização vêm crescendo bastante rapidamente, numa pesquisa realizada em janeiro deste ano pela Netcraft ele ocupa o 2o. lugar entre os servidores webs ativos na internet.

Neste post apresentarei como configurar o Nginx com suporte ao PHP e todos os ajustes de segurança necessários.

NOTA: Informações importantes encontram-se nos comentários dos arquivos de configuração.

Para obter as versões mais recente usaremos os pacotes disponíveis no repositório squeeze-backports

deb http://backports.debian.org/debian-backports squeeze-backports main
aptitude install -t squeeze-backports nginx spawn-fcgi ṕhp5-cgi

Configurando o vhost

vim /etc/nginx/sites-available/www.acme.com
#O dominio acme.com é um alias para www.acme.com

server {
  server_name www.acme.com acme.com;
  access_log /var/log/nginx/www.acme.com.access.log;
  error_log /var/log/nginx/www.acme.com.error.log;
  root /var/www/acme/;

  location / {
      index index.php;
  }

#Restrigindo o acesso ao ambiente administrativo

  location /admin {
              root   /var/www/acme/;
              index index.php;
              allow  200.222.222.222;
              deny all;
      }

#Negando o acesso a alguns arquivos

location =/*.txt {
              deny all;
              log_not_found off;
              access_log off;
      }

       location =/xmlrpc.php{
              deny all;
              log_not_found off;
              access_log off;
      }

       location =/readme.html {
              deny all;
              log_not_found off;
              access_log off;
      }

#Habilitando o suporte ao PHP

  location ~ \.php$ {
      include /etc/nginx/fastcgi_params;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /var/www/acme$fastcgi_script_name;
  }
}

Hardening do Nginx

user www-data;

#Total de threads. Configure de acordo com a quantidade de CPU existente, acima de 2 CPUs = 4.
worker_processes 4;
pid /var/run/nginx.pid;

events {
#Juntamente com o work_processes permite calcular o máx. de clientes (max clients = worker_processes * worker_connections)
      worker_connections 1024;

}

http {
  include       /etc/nginx/mime.types;
  access_log  /var/log/nginx/access.log;
  sendfile        on;

  tcp_nodelay        on;

  gzip  on;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;

# Protecao contra DoS
client_body_buffer_size  1K;
client_header_buffer_size 1k;
client_max_body_size 2M;
large_client_header_buffers 2 1k;
client_body_timeout   10;
client_header_timeout 10;
keepalive_timeout     5 5;
send_timeout          10;

# Oculta banner
server_tokens           off;
}

# Linita o maximo de conexões concorrentes por IP
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;

Script de inicialização do PHP-Fastcgi

vim /etc/init.d/php-fastcgi
RETVAL=0
case "$1" in
start)
$PHP_SCRIPT
RETVAL=$?
;;
stop)
killall php5-cgi
RETVAL=$?
;;
restart)
killall php5-cgi
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL

Adicionando nos Runlevels

update-rc.d php-fastcgi defaults

Habilitando o vhost e iniciando os serviços

cd /etc/nginx/sites-enabled

ln -s ../sites-available/www.acme.com
invoke-rc.d nginx start && invoke-rc.d php-fastcgi start

Considerações finais

As melhores práticas de segurança do PHP já foram abordadas nos posts anteriores [1] [2]

Como pudemos constatar sua implementação é aparente fácil, o site do [projeto http://nginx.org/] é bastante rico em documentação.

O Nginx é muito utilizado como proxy reverso tornando-se um frontend para balaceamento de carga suportando diversos protocolos, existe também um módulo de WAF chamado Naxsi, esta e outras soluções serão tratadas nos próximos posts.

Referências



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