実行が許可されるファイルのセットに基づいて Nginx 構成ファイルを作成するための簡単なスクリプトを書くというアイデアを思いつきました。私の場合、それらはアプリケーションの .php ファイルです。スクリプトは、.php ファイルが存在するディレクトリ内の .php ファイルごとに Nginx 構成エントリを作成するだけです。
私の見解では、すべてのアプリケーション ファイルを指定すると、不正な実行が禁止されます。また、問題のアプリケーションが前述の PHP ファイルから非常に簡単に実行される場合、Nginx 構成で簡単に実装できるはずです。おそらく、スクリプトは、ユーザーがアクセスできる PHP ファイルと、ユーザーが見る必要のないファイルに対して、一般的なレート制限を設定することも理解できるでしょう。
したがって、私が考える理想的なスクリプトは、少なくとも次のプロパティに基づいて構成を作成します。
- 実行可能ファイル名、.php、.py、.pl など
- フォルダーは直接アクセス可能である必要はありません (ただし、これらのフォルダー内のすべてのファイルに基づいて構成が作成されます)
- フォルダごとのレート制限、または少なくともユーザー向けのファイルに対して
私がこの質問をしているのは、さらに先に進むための証拠を集めるためであり、また、nginx のこのような構成の作成を目的としたスクリプトを簡単に見つけることができなかったためです。(書くのがとても簡単だからかもしれません...) 最終的な目標はセキュリティの強化であるため、このような Nginx の構成がセキュリティにどのような影響を与えるか、そしてそれが良いアイデアであるかどうかについても意見を求めています。
答え1
ウェブサービスは通常、パブリックサービスです。ウェブルートフォルダまたはあなたのサブフォルダウェブルートフォルダ公開されています。Web サーバーの構成でこの動作の例外を定義できます。
ファイル、スクリプト、フォルダーをパブリック アクセスから保護するには、Web ルート フォルダー内またはその下に保存しないことをお勧めします。
これらの一般的なルールに従うことは、安全な Web サーバーまたは Web アプリケーション サーバーを取得するための良い方法です。
あなたのケースに関してより具体的に言うと、(Michael Hampton がすでに述べたように)index.php(および必要なすべての画像とパブリック JavaScript)のみを Web ルート フォルダーに保存することをお勧めします。
API またはアプリケーションを提供するために必要なすべての PHP クラスは、Web ルート フォルダーおよび Composer ファイル (通常は「vendor」フォルダーに保存されます) とは別に保存する必要があります。
構造例:
/project_root
/htdocs (web root folder)
index.php
favicon.ico
robots.txt
/images
logo.png
background.png
/javascript
script.js
/src
/php
/api
/controller
/overview
get.php
/login
get.php
put.php
delete.php
post.php
/javascript
base.js
/reload
plugin.js
/vendor
autoload.php
上記の例では、次の Nginx 設定がアプリケーションに提供されます。
server {
...
# take care to deliver public static content if file exists
# or execute /index.php if not
location / {
try_files $uri /index.php;
}
...
# do not execute /index.php if requested image or JavaScript does not exists
location ~ ^/(images|javascript)/ {
try_files $uri =404;
}
...
# execute PHP files
location ~ \.php$ {
try_files $uri /index.php;
include fastcgi_params;
fastcgi_keep_conn on;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}