Diretório chroot e chdir do PHP-FPM

10

Estou configurando o php-fpm com o chrooting ativado. Agora vejo que existem duas opções e quero saber qual é a diferença exata.

A configuração possui:

chroot = /var/www/domains/domain.tld/
; Chdir to this directory at the start. This value must be an absolute path.
; Default Value: current directory or / when chroot
chdir = /docroot/

Por que existem dois locais diferentes aqui e qual caminho o php tem permissão para acessar. O site php pode acessar /var/www/domains/domain.tld/ou apenas acessar arquivos dentro do docrootdiretório?

===

Talvez haja algum conselho concreto para mim. Eu quero ter uma configuração como esta:

localização da raiz da web: /var/www/

domain.com/
 |---conf/
 |    |--nginx.conf
 |    |--php-fpm.conf
 |
 |---ssl/
 |---logs/
 |---session/
 |---domains/
       |---www/
       |---app/
       |---dev/

Agora, aqui as configurações do php-fpm seriam:

chroot = /var/www/domain.com/
chdir  = /domains/www

Agora, a principal questão aqui é: o aplicativo localizado no wwwsubdomínio poderá acessar os arquivos em devou app. Ou mesmo os arquivos localizados na sessão, que é o caminho para salvar a sessão, ou as outras pastas, como ssl e logs.

Saif Bechan
fonte

Respostas:

12
  • Chroot define o diretório 'root' - você não pode navegar acima do diretório raiz.
  • O Chdir simplesmente altera o diretório inicial - ainda é possível navegar para outros diretórios (incluindo os acima).
    • Se você não especificar um caminho chroot, a raiz 'real' será aplicada - e você especificará um chdir absoluto.
    • Se você especificar um caminho chroot, poderá especificar um caminho relativo ao caminho chroot (que redefine o diretório raiz).

As configurações que você propôs parecem bem.

  • O caminho inicial seria o caminho chroot + o caminho chdir
  • O aplicativo poderá acessar todos os arquivos no caminho chroot (a menos que haja outras restrições - por exemplo, php_openbasedir, permissões, etc.).

Como uma observação lateral - seu aplicativo php também terá acesso ao seu nginx.conf e php-fpm.conf com base na estrutura do documento que você mostrou - que parece algo que você pode querer mudar (pelo menos, tornando os arquivos lidos) somente para esse usuário).

cyberx86
fonte
Vou garantir que esses arquivos estejam seguros. A propósito, existe uma diferença entre esse método de chrooting e apenas definir o php_openbasedir?
Saif Bechan
1
Sim - o chroot se aplica no nível do sistema operacional e é muito mais difícil de ignorar. O open_basedir é específico do PHP e precisa ser verificado em todas as funções para que explorações sejam mais comuns (por exemplo, executando scripts externos com shell_exec). Há uma nota de segurança interessante no site do PHP sobre esse assunto. Isso não quer dizer que o open_basedir seja inútil se você estiver usando chroot - em qualquer circunstância em que algo ocorra fora do seu script, pode ser útil definir um open_basedir diferente do caminho do chroot. Chroot também pode oferecer melhor desempenho.
cyberx86