(Nota: se você estiver familiarizado com as configurações do suPHP e quiser pular os detalhes da pergunta, você encontrará uma rápida explicação do que eu estou tentando alcançar no final)
Atualmente, estou configurando uma máquina para hospedar vários sites, pertencentes a vários usuários. Por conveniência, esses usuários são armazenados em um banco de dados MySQL. libnss-mysql
e pam-mysql
são usados para conectar este backend e o Linux, permitindo que esses usuários façam login e usem os serviços da máquina. Todo usuário armazenado no banco de dados MySQL pertence ao grupo users
.
Cada um desses usuários recebe um diretório inicial em /home/users
. Por exemplo, os arquivos do usuário test
podem ser encontrados em /home/users/test
. Este diretório tem as seguintes propriedades / permissões:
drwx--x--- test www-data /home/users/test
Da mesma forma, o índice do site (e outros arquivos) exibe as seguintes permissões:
-rw-r----- test www-data /home/users/test/index.php
-rw-r----- test www-data /home/users/test/robots.txt
Para permitir o acesso a esses sites, o VirtualHost a seguir é configurado no Apache, usando o DBD e confiando no backend do MySQL.
<VirtualHost *:80>
ServerName *
DBDriver mysql
DBDParams host=localhost,user=user,pass=pass,dbname=db
DBDocRoot "SELECT document_root FROM users WHERE domain=%s" HOSTNAME
</VirtualHost>
Se o domínio associado a test
for example.com, o Apache usará o DBD para corresponder a esse domínio com /home/users/test
e fornecer seu conteúdo. Por exemplo, example.com/index.php passará o índice para o interpretador PHP, enquanto example.com/robots.txt fará com que o Apache entregue o arquivo como conteúdo estático .
Agora, para proteger meus usuários uns dos outros, gostaria de restringir as permissões de seus scripts PHP. Com a configuração acima, os scripts PHP passam pelo Apache e são interpretados por mod_php
. A coisa é: o processo do Apache é executado por www-data:www-data
, que dá acesso a todas as casas a qualquer script.
Para evitar isso, eu decidi instalar o suPHP, mas eis o meu problema: o suPHP e a consulta DBD MySQL não cooperam bem:
- Se eu compilar o suPHP no modo paranóico , devo definir um usuário e um grupo estáticos para todas as solicitações . No entanto, os scripts em
/home/users/test
devem ser executados como test:users
, enquanto aqueles em /home/users/othertest
devem ser executados como othertest:users
.
Aqui é onde o problema acontece na configuração:
<VirtualHost *:80>
ServerName *
suPHP_Engine on
# The user is stored in the database, it can't be set statically.
suPHP_UserGroup ??user?? users
DBDriver mysql
DBDParams host=localhost,user=user,pass=pass,dbname=db
DBDocRoot "SELECT document_root FROM users WHERE domain=%s" HOSTNAME
</VirtualHost>
-
Se eu compilar o suPHP no modo proprietário , todos os scripts PHP serão executados como test:www-data
em vez de test:users
. Isso também fornecerá privilégios em todos os diretórios base.
-
Se eu definir todos os arquivos como test:users
em /home/users/test
(e usar modo proprietário ), o servidor da web não poderá mais acessá-lo, mesmo para fornecer conteúdo estático .
Em suma
Existe alguma maneira de combinar DBD MySQL e suPHP e conseguir algo entre modo paranoico e modo proprietário ? Eu preciso alterar o grupo de execução de www-data
para users
( modo paranoico ), mas o usuário em execução deve ser o proprietário do script ( modo proprietário ). De uma maneira simples:
# The following script must be interpreted as test:users.
-rw-r----- test www-data /home/users/test/index.php
# The following script must be interpreted as othertest:users.
-rw-r----- othertest www-data /home/users/test/index.php