Tive a ideia de escrever um script simples para criar um arquivo de configuração Nginx baseado em um conjunto de arquivos que poderiam ser executados. No meu caso, seriam arquivos .php de um aplicativo. O script simplesmente criaria uma entrada de configuração Nginx para cada arquivo .php em um diretório, onde estariam os arquivos .php.
Na minha opinião, especificar cada arquivo de aplicativo proibiria a execução não autorizada e, quando o aplicativo em questão é executado de maneira muito simples a partir dos arquivos php, deve ser fácil de implementar em uma configuração Nginx. Talvez o script também possa definir limites de taxa gerais para arquivos php acessíveis ao usuário e arquivos que nunca precisariam ser vistos pelo usuário.
Assim, como vejo um script ideal, ele criaria uma configuração baseada em pelo menos estas propriedades:
- nome do executável, .php, .py, .pl etc.
- pastas não precisam ser diretamente acessíveis (mas ainda assim criam configurações com base em cada arquivo nessas pastas)
- limites de taxa por pasta, ou pelo menos para os arquivos voltados para o usuário
Estou fazendo a pergunta para reunir evidências para ir mais longe e também porque não consegui encontrar facilmente um script que fosse direcionado a essa criação de configuração para o nginx. (Talvez só porque é tão fácil de escrever..). Em última análise, o objetivo é segurança extra e, portanto, também estou buscando opiniões sobre como essa configuração do Nginx afetaria isso e se é uma boa ideia.
Responder1
Um serviço web geralmente é um serviço público. Tudo (cada arquivo) que você armazena em seupasta raiz da webou qualquer subpasta do seupasta raiz da webé público. Você pode definir exceções desse comportamento na configuração do seu servidor web.
Para proteger arquivos, scripts e pastas do acesso público, recomendo armazená-los fora ou abaixo da pasta raiz da web.
Seguir essas regras genéricas é uma boa abordagem para obter um servidor web ou servidor de aplicativos web seguro.
Para ser mais específico em relação ao seu caso, eu recomendaria armazenar (como Michael Hampton já mencionou) apenas o seu index.php (e todas as imagens necessárias e JavaScripts públicos) na pasta raiz da web.
Todas as classes PHP que você precisará para fornecer sua API ou aplicativo devem ser armazenadas separadamente da pasta raiz da web, bem como dos arquivos do Composer (geralmente armazenados na pasta "vendor").
Estrutura de exemplo:
/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 o exemplo acima, seguir a configuração do Nginx forneceria seu aplicativo:
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;
}
}