O arquivo com o mesmo proprietário, grupo e permissões menos estritas não pode ser aberto pelo nginx

3

Estou recebendo um erro de permissão negada em um arquivo index.php de um site em execução no Nginx. O erro está abaixo:

2018/01/19 05:50:01 [error] 9664#9664: *17 FastCGI sent in stderr: "PHP message:
PHP Warning:  Unknown: failed to open stream: Permission denied in Unknown on line 0
Unable to open primary script: /var/www/the-site/index.php (Permission denied)" while
reading response header from upstream, client: xxx.xxx.xxx.xxx,
server: www.the-site.com, request: "GET /index.php HTTP/1.1",
upstream: "fastcgi://unix:/var/run/php5-fpm-the-site.sock:", host: "www.the-site.com"

As permissões no arquivo são

-rw-rw-r--. 1 root root 418 Aug  2 17:49 index.php

Alterar as permissões de arquivo para 777 (temporariamente) não ajuda:

-rwxrwxrwx.  1 root root   418 Aug  2 17:49 index.php

No entanto, se eu mover o arquivo:

mv index.php index-old.php

e substitua-o por um novo index.php com o seguinte conteúdo:

<?php phpinfo(); ?>

então isso funciona bem. O usuário e o grupo são os mesmos e as permissões agora são mais fracas:

$ ls -l index*
-rwxrwxrwx. 1 root root 418 Aug  2 17:49 index-old.php
-rw-r--r--. 1 root root  20 Jan 19 05:56 index.php

Veja o resultado de ls -Z :

$ ls -Z index*
-rwxrwxrwx. root root unconfined_u:object_r:user_tmp_t:s0 index-old.php
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.php
    
por Michael 19.01.2018 / 12:05

1 resposta

5
-rw-r--r--. 1 root root  20 Jan 19 05:56 index.php
          ^ this one

O ponto após os bits de permissão indica um contexto de segurança do SELinux. Se você estiver executando um sistema SELinux, ele precisaria corresponder para que nginx possa ler o arquivo. Você pode usar ls -Z para visualizar o contexto de segurança e restorecon para restaurar o contexto de segurança padrão (com base no local do arquivo, eu acho) ou chcon para alterá-lo.

Algo parecido com isto

$ restorecon /var/www/the-site/index.php

ou isto para o diretório completo.

$ restorecon -r /var/www/the-site

(Eu não posso testar isso em lugar algum agora, verifique a sintaxe)

Veja, por exemplo os documentação da Red Hat nos rótulos do SELinux .

    
por 19.01.2018 / 12:21