PHP アプリをより安全にするために、Nginx 構成ですべての PHP ファイルを指定します (nginx)

PHP アプリをより安全にするために、Nginx 構成ですべての PHP ファイルを指定します (nginx)

実行が許可されるファイルのセットに基づいて 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;
  }
}

関連情報