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