suPHP e Apache DBD: altere apenas o GID

2

(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
    
por John WH Smith 13.07.2014 / 23:56

1 resposta

0

Não tenho certeza se entendi sua pergunta, mas se você estiver tentando restringir a execução e o acesso entre diferentes usuários enquanto remove a permissão de leitura de outros usuários e permitir que o www-data acesse esses arquivos, tente fazer o seguinte:

  • Compile suphp com o modo paridóide setid
  • Use a configuração do host virtual e as permissões que você já tem
  • Use acls estendidos para dar permissão de leitura ao usuário www-data nas pastas especificadas (setfacL)

Suponhamos que a execução do script seja representada usando o setuid, ele será baseado nas permissões do sistema de arquivos depois de comparar com o valor suPHP_UserGroup. A utilização de acls estendidos permitiria que o usuário de www-data acessasse todos os arquivos, mas não permitiria a execução de scripts php, pois não está especificado na diretiva suPHP_UserGroup.

Você precisará adicionar a opção acl em seu sistema de arquivos / home (adicionando-o ao fstab e remontando o sistema de arquivos, tudo bem) antes de adicionar seus arquivos estendidos em arquivos e pastas.

Você pode obter mais informações sobre o setfacl em sua página de manual ( link ), é bastante completo.

    
por 23.07.2014 / 22:50