Entendendo o PHPSuexec (suPHP)

Informações sobre PHPSuexec - utilizamos PHPSuexec em todos os servidores linux de hospedagem e revenda de hospedagem.

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
0400 dono pode ler
0200 dono pode escrever
0100 dono pode executar

0040 grupo pode ler
0020 grupo pode escrevera
0010 grupo pode executar

0004 todos podem ler
0002 todos podem escrever
0001 todos podem executar

Juntando as permissões, você chegará a um número que corresponde com a permissão. Por exemplo: 400+200+100+40+20+10+4+2+1=777 - usuário/grupo/todos podem ler/escrever/executar

O que é 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 diferença nas duas.
PHPSuexec is the shortened term often used to describe running PHP as a CGI with Suexec.


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óprios 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
Quando o PHP roda como um módulo do apache, você pode manipular o PHP usando .htaccess - uma vez que o .htaccess é um recurso do Apache. Quando o PHP roda como CGI, você não pode mais fazer isto pois o Apache não mais entenderá as flags do PHP e os valores. Pelo contrário , quando PHP roda como CGI, você precisa criar seu próprio arquivo de inicialização do PHP. Este arquivo é chamado php.ini -- php.ini funciona mais ou menos igual ao .htaccess -- este é 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

Existe uma diferença principal em utilizar .htaccess vs php.ini . O arquivo .htaccess pode ser colocado no diretório raiz e fazer efeito para todos os sub-diretórios com apenas um arquivo; php.ini não funciona deste jeito. O arquivo php.ini precisa ser colocado em todo diretório e subdiretório que precisa alterar as diretivas. Isto é o ponto negativo em usar PHPSuexec, todavia nós esperamos que no futuro o PHP possa ser escrito para manipular o arquivo php.ini em um cenário mais simples.

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


É 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.

Problemas comuns experienciados com PHPSuexec se seus scripts estão reportando 500 Internal Server Errors, por favor cheque o seguinte:

* Certifique-se que diretório não possuam permissões maiores que 755

* Certifique-se que as permissões dos arquivos PHP não são maiores que 755 - 644 é padrão.

* 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.