web-dev-qa-db-ja.com

nginx-セキュリティ上の理由から、index.phpを除くすべての* .phpリクエストを拒否します

os:CentOS 7
nginx:1.6.2
httpd:Apache 2.4.6
cms:Drupal 7

サーバーが危険にさらされた後、サーバーからすべてを削除し、OSとソフトを再インストールし、バックアップからデータを復元しました。次に、すべてのサービスを最大のセキュリティスタイルで構成します。

アクセスログを詳細に調査した後、私はセキュリティを向上させるためにサイトドキュメントルートにあるindex.phpを除くすべてのphpファイルへのリクエストを拒否することを決定しました。

Nginxのアクセスログの内容には、次のような多くのレコードがあります。

azenv2.php
az.php

そして

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

最初のカテゴリ-バックドア(およびその1つが私のサイトをハッキングし、誰かが私のサーバーから大量のスパムを送信しました)。

次に、人気のcmsとユーティリティを見つけて、admin @ 123456のようなlogin @ passwordを試したい人がいます。

PHPファイルへの拒否リクエストを通じてnginxで両方のカテゴリをブロックする理由は次のとおりです。

  1. 誰かがphp-Shellをアップロードする場合でも、使用することはできません

  2. これらすべての要求は先験的に「良くない」-そしてnginxによってそれらを拒否することはdrupal(httpd + php + mysql)が動作するのを保護し、電力を消費します。

1つの仮想ホストの現在の構成:

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が機能する場合があります。

4
Sergey Serov

これはさまざまな方法で実現できます。

設定ファイルの内容と直接統合する場合は、次のようなセクションを含めるだけで済みます。

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

これは、アクセス/実行を許可する前に、要求されたファイルの存在を確認します。

しかし、上記に加えて、私は実際に個人的に fail2ban を使用することをお勧めします。リアルタイムでアクセスログを監視し、IPがサーバーへのアクセスを禁止するように構成できます。指定した禁止時間で新しいiptablesルールをオンザフライで自動的に作成できます。

個人的には、nginxでfail2banを使用するようにサーバーを構成しています この記事 (または少なくともそれに基づいて-必要に応じて変更できます)。

4
BE77Y