nginx-出于安全原因,拒绝除 index.php 之外的所有 *.php 请求

nginx-出于安全原因,拒绝除 index.php 之外的所有 *.php 请求

操作系统:CentOS 7
nginx:1.6.2
httpd:apache 2.4.6
cms:Drupal 7

我的服务器被入侵后,我删除了服务器上的所有内容,重新安装了操作系统和软件,并从备份中恢复了数据。现在我以最高安全级别配置所有服务。

在详细研究了访问日志后,我决定拒绝除 index.php 之外的任何 php 文件的请求它位于站点文档根目录中,用于提高安全性。

Nginx 访问日志包含很多记录,例如:

azenv2.php
az.php

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

第一类 - 后门(其中一个入侵了我的网站,有人从我的服务器发送大量垃圾邮件)。

第二 - 有人想找到流行的 cms 和实用程序并尝试一些登录@密码,例如 admin@123456

我通过拒绝对 php 文件的请求来阻止 nginx 这两个类别的原因是:

  1. 即使有人上传 php-shell -将无法使用它

  2. 所有这些请求都优先于“不好” - 并且通过 nginx 拒绝它们将保护 drupal(httpd+php+mysql)正常工作并消耗电量。

我当前针对一个虚拟主机的配置:

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-安装后未改变。


更新
最后我创建了这个拒绝的配置:

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

以及此代理配置:

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). 因此,有关攻击尝试的完整信息都收集在日志中。2
). 服务器不会对不良请求进行额外工作。3
). Drupal cron 可能会起作用。

答案1

您可以通过多种方式实现这一点。

直接与您的配置文件中的内容集成,您可能希望简单地包含如下部分;

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]
}

在允许访问/执行之前,它将检查所请求的文件是否存在。

除此之外,我个人建议使用失败2ban如果配置正确,它将为您提供更全面的安全性;您可以将其配置为实时监控您的访问日志,并通过自动动态创建新的 iptables 规则来禁止 IP 访问您的服务器,并指定禁止时间。

我个人已将我的服务器配置为使用 fail2ban 和 nginx,如下所示本文(或者至少基于此 - 您可以根据需要进行更改)。

相关内容