força o WordPress / PHP a respeitar o bit setgid ao criar novos arquivos e diretórios

1

Estou hospedando vários sites WordPress em um LEMP VPS.

  • Cada site tem sua própria instalação do Wordpress (localizada em /srv/http/domain/wordpress ), sua própria conta de usuário ( site-user ) e seu próprio conjunto php-fpm executando como usuário do site .
  • O Nginx está sendo executado na conta link e todos os arquivos em /srv/http/domain/wordpress têm propriedade site-user: http com permissões 0640 (arquivos) e 2750 (diretórios).

Assim, cada usuário tem acesso completo RW a seus próprios arquivos / diretórios, mas não tem acesso a arquivos / diretórios de outros sites. O Nginx tem acesso R-only aos arquivos / diretórios de todos os sites.

Estou usando o bit setgid para forçar a criação de novos diretórios sob /srv/http/domain/wordpress para herdar o grupo link para que o Nginx tenha acesso de leitura a eles. Isso funciona como esperado quando os arquivos são criados via SFTP.

Isso parece sensato para mim e eu posso atualizar plugins, temas e WordPress com sucesso através da interface wp-admin . No entanto, sempre que executo uma tarefa que requer o WordPress para criar novos arquivos / diretórios - basicamente sempre que eu instalar ou atualizar um plugin / tema ou atualizar o próprio Wordpress - a propriedade do arquivo resultante é site-user: site-user O que eu gostaria é que os arquivos / diretórios recém-criados respeitem o bit setgid e criem arquivos / diretórios com propriedade site-user: http para que o Nginx possa ler esses arquivos sem minha intervenção.

Eu defino o seguinte no arquivo wp-config.php de cada site:

  • define( 'FS_CHMOD_DIR', ( 02750 & ~ umask() ) );
  • define( 'FS_CHMOD_FILE', ( 0640 & ~ umask() ) );

Isso força as permissões para o que eu quero, mas não afeta a propriedade.

Eu li este e this mas a "solução" requer a modificação do PHP código para evitar usar move_uploaded_file() , o que é bom se você está escrevendo seu próprio código PHP, mas eu não vou começar a modificar arquivos PHP do WordPress. Eu nem tenho certeza de que esta é a fonte do meu problema.

Além disso, eu entendo que eu poderia afrouxar as permissões e defini-las para 755 (diretórios) e 644 (arquivos) para que o Nginx pudesse ler arquivos independentemente de ter propriedade de grupo sobre eles, mas por razões de segurança estou tentando evitar arquivos legíveis pelo mundo em um servidor compartilhado.

Como posso controlar a propriedade de arquivos criados pelo WordPress / PHP?

    
por chr0mag 24.11.2017 / 20:51

1 resposta

1

Encontrei algumas soluções para isso:

  1. Novos arquivos criados pelo Wordpress (na verdade, PHP) são dicados pelo usuário, uma diretiva de grupo no arquivo de configuração do conjunto php-fpm no qual o PHP é executado. Então, para forçar os arquivos recém-criados a usuário do site: http propriedade, como esperava originalmente, você poderia definir usuário = site-usuário e grupo = http no seu arquivo de configuração do pool php-fpm específico do site. Isso funciona porque os arquivos recém-criados têm a propriedade de grupo que eu estava procurando. No entanto, do ponto de vista da segurança, isso em parte inviabiliza a finalidade de criar pools php-fpm separados para cada site, já que qualquer site-user poderia criar arquivos PHP que teriam acesso de leitura aos arquivos / diretórios de outro site.

  2. Mais simples e mais seguro que o número 1 acima é ter todos os arquivos / diretórios de um site de propriedade do site-user: site-user (em vez de site-user : http como planejei originalmente) e, em seguida, adicionar o link usuário ao grupo site-user . Com 640 (arquivos) e 750 (pastas) permissões em todos os sites, isso efetivamente dá nginx acesso somente leitura a todos os arquivos do site conforme necessário, e ainda não permite que qualquer usuário leia os arquivos de qualquer outro site, exceto seus próprio.

A opção # 2 acima não requer nenhum uso do bit setgid que simplifica as coisas, mas requer adicionar o seguinte no seu arquivo wp-config.php :

  • define( 'FS_CHMOD_DIR', ( 0750 & ~ umask() ) );
  • define( 'FS_CHMOD_FILE', ( 0640 & ~ umask() ) );

Sem as linhas acima, o WordPress / PHP criará arquivos legíveis (644) e pastas (755).

    
por 25.11.2017 / 16:28