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

Ser*_*rov 5 security php configuration nginx drupal

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

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

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

Nginx 访问日志内容很多,比如:

azenv2.php
az.php
Run Code Online (Sandbox Code Playgroud)

/*/wp-login.php
/administrator/index.php
/MyAdmin/index.php
Run Code Online (Sandbox Code Playgroud)

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

第二 - 有人想找到流行的 cms 和实用程序并尝试使用 login@password,例如 admin@123456

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

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

}
Run Code Online (Sandbox Code Playgroud)

nginx.conf - 安装后未更改。


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

location ~ \.php$ {
  access_log /path/to/log/nginx_deny.log name_log;
  deny all;
}
Run Code Online (Sandbox Code Playgroud)

和这个代理配置:

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;
}
Run Code Online (Sandbox Code Playgroud)

1)。因此,有关攻击尝试的完整信息收集在日志中。
2)。服务器不会为错误的请求做额外的工作。
3)。Drupal cron 可能会工作。

BE7*_*77Y 4

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

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

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]
}
Run Code Online (Sandbox Code Playgroud)

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

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

就我个人而言,我将我的服务器配置为根据本文将fail2ban与nginx一起使用(或者至少基于此 - 您可以根据需要更改它)。