PHP SuExec

De Wiki ArgoHost.net

Tabela de conteúdo

Php SuExec


Introdução

Esta página vai explicar permissões de arquivo/diretório, diferença de rodar PHP como um módulo do apache e rodando o PHP como CGI com Suexec. Mostraremos também alguns problemas comuns quando roda o PHP como CGI com Suexec.


Permissões de arquivos

  • DONO
-400------ dono pode ler = r
-020------ dono pode escrever = w
-001------ dono pode executar = x
  • GRUPO
----400--- grupo pode ler = r
----020--- grupo pode escrever = w
----001--- grupo pode executar = x
  • TODOS
-------400 todos podem ler = r
-------020 todos podem escrever = w
-------001 todos podem executar = x


Juntando as permissões, você chegará a um número que corresponde com a permissão, veja os exemplos abaixo:


  • exemplo¹: Permissão total (usuário/grupo/todos)
-rwxrwxrwx "arquivo" ou 777 "arquivo"
  • exemplo²: Permissão total (usuário) e somente leitura (grupo e todos)
-rwxr-xr-x "arquivo" ou 755 "arquivo"


PHPSuexec ?

PHPSuexec é o termo abreviado usado para descrever o PHP como CGI com Suexec. Rodar o PHP como CGI com Suexec cria um ambiente muito mais seguro comparado com rodar o PHP como módulo do apache. Abaixo vamos descrever as diferenças de rodar ambas as formas de PHP. com exemplos de como a segurança difere nas duas.


PHP como um módulo do Apache

Quando o PHP roda como um módulo do apache, os processos do php serão rodados pelo usuário/grupo conhecido como "nobody". Por exemplo, quando um arquivo PHP precisa ser escrito/removido por outro arquivo PHP, isso será feito sob o usuário "nobody". Para que isso seja possível, você precisa especificar permissões do arquivo/diretório para 777 - que significa que ele pode ser escrito/executado/lido pelo usuário/grupo/todos. Isto é inseguro pois você não apenas liberou o servidor de ler/escrever/executar seu arquivo, mas todas as pessoas que compartilham o servidor também.

Devido as condições acima, quando um arquivo PHP cria ou faz upload de um novo arquivo em sua conta, o novo arquivo terá como dono o usuário "nobody". Se você logar por FTP na sua conta, todos os arquivos que possuem o "nobody" como dono não poderão ser reescritos/apagados. Você teria que contatar o suporte para mudar o dono para seu usuário.


PHP como CGI com Suexec

Quando o PHP roda como CGI com Suexec, os arquivos PHP trabalham sob seu usuário/grupo. Os arquivos PHP não mais precisarão perder permissões para funcionar. Agora eles necessitarão de permissões. Setar seu diretório ou arquivo para permissão 777 vai causar o erro 500 Internal Server Error. Isto acontece para proteger seus arquivos PHP de serem alvos de abuso por fontes externas.

Sob PHPSuexec seus diretórios e arquivos PHP não podem ter permissões maiores que 755 (ler/escrever/executar pelo seu usuário, ler/executar pelo grupo.todos). Uma vez que você é dono dos seus prórios arquivos, seus scripts podem funcionar em qualquer diretório que você criar e não podem ser manipulados por outros usuários, inclusive o "nobody". Isto é possível pois todo o processo do apache com PHP será utilizado o usuário do cliente, e não nobody. Isso ajuda também para detectar spammers no servidor.

Agora, quando um arquivo PHP cria ou faz upload de um novo arquivo na sua conta, o novo arquivo terá seu usuário como dono. Você não mais precisa se preocupar com estranhos lendo/escrevendo seus arqiuvos.

.Htaccess x Php.ini

PHP com módulo do Apache: pode-se manipular o PHP usando .htaccess - uma vez que este é um recurso do Apache.

PHP com SuExec: não pode mais usar .htaccess, pois o Apache não mais entenderá as flags do PHP e os valores. Ao contrário, quando PHP roda com SuExec, você precisa criar seu próprio arquivo de inicialização do PHP, um arquivo chamado php.ini que funciona mais ou menos igual ao .htaccess, é um arquivo simples que será usado para manipular valores diferentes dos padrões do servidor.

Para que entenda melhor como ambos funcionam em relação ao PHP, vamos exemplificar o .htaccess e php.ini abaixo:

  • .htaccess
php_value magic_quotes_gpc on
  • php.ini
magic_quotes_gpc = on
Observação: Existe uma diferença principal em utilizar .htaccess ou php.ini.
  • O .htaccess pode ser colocado no diretório raiz e fazer efeito para todos os subdiretórios com apenas um arquivo
  • O php.ini não funciona deste jeito, precisa ser colocado em todo diretório e subdiretório que precise alterar as diretivas


Por último, existe uma diretiva usada no .htaccess que precisa ser alterada para que funcione sob PHPSuexec. A diretiva ForceType precisa ser mudada para SetHandler. Por exemplo:


  • PHP como Módulo do Apache - .htaccess
ForceType application/x-httpd-php
  • PHP como CGI com Suexec - . htaccess
SetHandler application/x-httpd-php


Problemas Comuns

É importante que entenda que você ainda pode usar .htaccess para uma varidade de funções do apache, como diretivas do mod_rewrite. proteção de diretórios, etc. A única diferença é que você não mais pode manipular diretivas do PHP.

PHPSuexec - se seus scripts estão reportando 500 Internal Server Errors, por favor verifique:

  • Certifique-se que diretórios não possuam permissões maiores que 755
  • Certifique-se que as permissões dos arquivos PHP não são maiores que 755 (padrão é 644).
  • Certifique-se que você não tem nenhum arquivo .htaccess que contém flags/valores PHP ou diretivas ForceType. Estas diretivas precisam ser manipuladas de forma diferente, como explicado acima.

php, phpsuexec, .htaccess, php.ini

Ferramentas pessoais