nginx - nega todas as solicitações * .php, exceto index.php por razões de segurança

3

os: CentOS 7
nginx: 1.6.2
http: apache 2.4.6
cms: Drupal 7

Depois que meu servidor foi comprometido, removi todos do servidor, instalei o SO e os soft, e restaurei os dados do backup. Agora eu configuro todos os serviços no estilo de segurança máxima.

Após detalhar os logs de acesso - decidi negar qualquer solicitação de arquivos php, exceto index.php , que está na raiz dos documentos do site, para melhorar a segurança.

Nginx log de acesso do conteúdo de um monte de registros como:

azenv2.php
az.php

e

/*/wp-login.php
/administrator/index.php
/MyAdmin/index.php

Primeira categoria - backdoors (e uma delas hackeada em meus sites, alguém envia uma grande parte do spam do meu servidor).

Segundo - alguém quer encontrar utilitários e cms populares e tentar usar login @ password, como admin @ 123456

Minhas razões para bloquear ambas as categorias por nginx através de solicitações de negação para arquivos php são:

  1. Mesmo que alguém faça upload do php-shell - será impossível usá-lo .

  2. Todas estas solicitações são 'não boas' como um priorado - e recusá-las pelo nginx irá proteger o drupal (httpd + php + mysql) para trabalhar e gastar energia.

Minha configuração atual para um host virtual:

server {

  listen <server-ip>;
  server_name <site-name>;

  location ~* /sites/default/files/styles/ {
    try_files $uri @imagestyles;
  }

  location @imagestyles {
    proxy_pass http://127.0.0.1:<port>;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    access_log off;
  }

  location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|pdf|zip|rar|mp3|flv|doc|xls)$ {
    root <site-documents-root>;
    access_log off;
  }

  location ~ (^|/)\. {
    deny  all;
  }

  location / {
    proxy_pass http://127.0.0.1:<port>;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    access_log <path-to-log-folder>/nginx_access.log main;
  }

}

nginx.conf - não foi alterado após a instalação.

UPDATE
Finalmente eu crio esta configuração para negar:

location ~ \.php$ {
  access_log /path/to/log/nginx_deny.log name_log;
  deny all;
}

e esta configuração para proxy:

location =/index.php {
  proxy_pass http://127.0.0.1:<port>;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
}

location =/cron.php {
  proxy_pass http://127.0.0.1:<port>;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
}

location / {
  proxy_pass http://127.0.0.1:<port>;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
}

1). Portanto, informações completas sobre tentativas de ataques são coletadas no log.
2). Servidor não faz trabalho adicional para pedidos incorretos.
3). O cron do Drupal pode funcionar.

    
por Sergey Serov 08.12.2014 / 15:17

1 resposta

4

Você pode conseguir isso de várias maneiras.

Integrando bastante diretamente com o que você tem no seu arquivo de configuração, você pode simplesmente incluir uma seção como a seguinte;

location ~ \.php$ {
try_files index.php @error;

fastcgi_pass ...;

fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;

...
}

location @error {
[config of however you want to handle errors]
}

O qual verificará a existência do arquivo solicitado antes de permitir seu acesso / execução.

Além disso, no entanto, eu pessoalmente recomendo usar o fail2ban , que fornecerá informações mais abrangentes segurança se configurado corretamente; você pode configurá-lo para monitorar seus logs de acesso em tempo real e proibir IPs de acessar seus servidores criando automaticamente novas regras de iptables on-the-fly, com tempos de proibição que você especificar.

Pessoalmente, tenho meus servidores configurados para usar o fail2ban com nginx, conforme este artigo (ou pelo menos baseado nisso - você pode alterá-lo como desejar).

    
por 08.12.2014 / 16:25