해당 PHP 앱을 더 안전하게 만들기 위해 Nginx 구성에 모든 PHP 파일을 지정하세요(nginx)

해당 PHP 앱을 더 안전하게 만들기 위해 Nginx 구성에 모든 PHP 파일을 지정하세요(nginx)

실행이 허용되는 파일 세트를 기반으로 Nginx 구성 파일을 생성하는 간단한 스크립트를 작성하는 아이디어가 생겼습니다. 내 경우에는 응용 프로그램의 .php 파일입니다. 스크립트는 .php 파일이 있는 디렉토리의 모든 단일 .php 파일에 대해 Nginx 구성 항목을 생성합니다.

내 생각에는 모든 단일 응용 프로그램 파일을 지정하면 무단 실행이 금지되며 문제의 응용 프로그램이 해당 PHP 파일에서 매우 간단하게 실행될 때 Nginx 구성에서 구현하기가 쉬워야 합니다. 아마도 스크립트는 사용자가 액세스할 수 있는 PHP 파일과 사용자가 볼 필요가 없는 파일에 대한 일반적인 속도 제한을 설정하는 것을 이해할 수도 있습니다.

따라서 이상적인 스크립트를 보는 방법은 최소한 다음 속성을 기반으로 구성을 생성합니다.

  • 실행 파일 이름, .php, .py, .pl 등
  • 폴더에 직접 액세스할 필요는 없습니다(그러나 여전히 이 폴더의 모든 파일을 기반으로 구성을 생성합니다).
  • 폴더당 또는 적어도 사용자가 직면하는 파일에 대한 속도 제한

나는 더 나아가기 위한 증거를 수집하기 위해 질문을 하고 있으며 또한 nginx에 대한 이러한 구성 생성을 지시할 스크립트를 쉽게 찾을 수 없었기 때문에 질문하고 있습니다. (아마도 쓰기가 너무 쉽기 때문일지도..) 궁극적으로 목표는 추가 보안이므로 Nginx의 이러한 구성이 어떻게 영향을 미칠지, 그리고 그것이 좋은 아이디어인지에 대한 의견도 구하고 있습니다.

답변1

웹 서비스는 일반적으로 공공 서비스입니다. 귀하가 귀하의 컴퓨터에 저장하는 모든 것(모든 파일)웹 루트 폴더또는 귀하의 하위 폴더웹 루트 폴더공개입니다. 웹 서버 구성에서 이 동작의 예외를 정의할 수 있습니다.

파일, 스크립트 및 폴더를 공개 액세스로부터 보호하려면 웹 루트 폴더 안이나 그 아래에 저장하지 않는 것이 좋습니다.

이러한 일반적인 규칙을 따르는 것은 안전한 웹 서버 또는 웹 애플리케이션 서버를 확보하는 좋은 접근 방식입니다.

귀하의 사례에 대해 좀 더 구체적으로 설명하자면 (Michael Hampton이 이미 언급했듯이) 웹 루트 폴더에 index.php(및 필요한 모든 이미지와 공개 JavaScript)만 저장하는 것이 좋습니다.

API 또는 애플리케이션을 제공하는 데 필요한 모든 PHP 클래스는 웹 루트 폴더 및 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;
  }
}

관련 정보