Especifique todos los archivos php en la configuración de Nginx para que dicha aplicación php sea más segura (nginx)

Especifique todos los archivos php en la configuración de Nginx para que dicha aplicación php sea más segura (nginx)

Se me ocurrió la idea de escribir un script simple para crear un archivo de configuración de Nginx basado en un conjunto de archivos que se permitiría ejecutar. En mi caso serían archivos .php de una aplicación. El script simplemente crearía una entrada de configuración de Nginx para cada archivo .php en un directorio, donde estarían los archivos .php.

En mi opinión, especificar cada archivo de aplicación prohibiría la ejecución no autorizada, y cuando la aplicación en cuestión se ejecuta de manera muy simple desde dichos archivos php, debería ser fácil de implementar en una configuración de Nginx. Quizás el script también podría entender cómo establecer límites de velocidad generales para archivos php accesibles para el usuario y archivos que el usuario nunca necesitaría ver.

Por lo tanto, veo que un script ideal crearía una configuración basada en al menos estas propiedades:

  • nombre del ejecutable, .php, .py, .pl, etc.
  • No es necesario que las carpetas sean accesibles directamente (pero aún así cree configuraciones basadas en cada archivo en estas carpetas)
  • límites de velocidad por carpeta, o al menos para los archivos que enfrenta el usuario

Hago la pregunta para reunir evidencia para ir más allá, y también porque no pude encontrar fácilmente un script que estuviera dirigido a dicha creación de configuración para nginx. (Tal vez sólo porque es muy fácil de escribir...). En última instancia, el objetivo es seguridad adicional y, por lo tanto, también estoy buscando opiniones sobre cómo dicha configuración de Nginx lo afectaría y si es una buena idea.

Respuesta1

Un servicio web suele ser un servicio público. Todo (cada archivo) que almacenas en tucarpeta raíz webo cualquier subcarpeta de sucarpeta raíz webes público. Puede definir excepciones de este comportamiento en la configuración de su servidor web.

Para proteger archivos, scripts y carpetas del acceso público, recomiendo no almacenarlos en o debajo de su carpeta raíz web.

Seguir estas reglas genéricas es un buen enfoque para conseguir un servidor web o un servidor de aplicaciones web seguro.

Para ser más específico con respecto a su caso, recomendaría almacenar (como ya mencionó Michael Hampton) solo su index.php (y todas las imágenes requeridas y JavaScripts públicos) en su carpeta raíz web.

Todas las clases de PHP que necesitará para proporcionar su API o aplicación deben almacenarse aparte de su carpeta raíz web, así como de sus archivos de Composer (generalmente almacenados en la carpeta "proveedor").

Estructura de ejemplo:

/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

Para el ejemplo anterior, la siguiente configuración de Nginx proporcionaría su aplicación:

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

información relacionada