Especifique todos os arquivos php na configuração do Nginx para tornar o aplicativo php mais seguro (nginx)

Especifique todos os arquivos php na configuração do Nginx para tornar o aplicativo php mais seguro (nginx)

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

informação relacionada