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で両方のカテゴリをブロックする理由は次のとおりです。
誰かがphp-Shellをアップロードする場合でも、使用することはできません。
これらすべての要求は先験的に「良くない」-そして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が機能する場合があります。
これはさまざまな方法で実現できます。
設定ファイルの内容と直接統合する場合は、次のようなセクションを含めるだけで済みます。
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を使用するようにサーバーを構成しています この記事 (または少なくともそれに基づいて-必要に応じて変更できます)。