Como permitir que www-data crie uma pasta sem dar acesso de leitura à pasta pai

3

Não sei exatamente qual é a pergunta certa a ser feita, então tentarei explicar o que estou tentando fazer.

Eu tenho uma aplicação web interna (em PHP) que eu quero poder criar uma pasta. O problema é que o usuário do Apache, www-data, não tem nenhum acesso à pasta pai na qual eu quero que minha pasta seja criada.

Eu não acho apropriado dar acesso a www-data para a pasta pai, então estou pensando se posso criar um script em algum lugar que www-data possa executar e que tenha mais privilégios do que www-data. O script simplesmente faria algo assim (psuedocode):

FOLDER_NAME = sanitise(<arg-val-1>)
mkdir /some-path/$FOLDER_NAME

Onde seria apropriado criar esse script e como ele seria executado pelo www-data como root? (Ou, alternativamente, existe uma maneira melhor de resolver o problema?)

Estou usando o Debian Linux.

    
por Highly Irregular 13.12.2012 / 02:09

2 respostas

2

Você não pode fazer o que afirma de uma maneira útil, mas há, sem dúvida, algo próximo o suficiente e que fará o que você realmente quer.

Mesmo que você tenha organizado a criação do diretório, o usuário www-data ainda não conseguirá acessar /some-path/subdirectory , porque o subdiretório só pode ser acessado por meio do diretório pai. (Há maneiras de contornar isso, mas nenhuma que eu recomende. Você pode ter um processo que pode acessar /some-path e /some-path/subdirectory alterar para /some-path/subdirectory e, em seguida, descartar privilégios; o processo resultante ainda poderá acessar sua atual diretório (mas não através de seu caminho absoluto) .Você pode montar o diretório em outro local, mas se você for fazer isso, você pode também criar o diretório em outro lugar.)

Organize para que esses diretórios estejam localizados em um diretório que www-data possa pelo menos acessar ( x permission bit). Se o problema é que o diretório deve pertencer a outro usuário e outro grupo, defina uma lista de controle de acesso no diretório ( setfacl -m user:www-data:x /some-path ) - consulte Como restringir a execução de comandos em um diretório específico através do SUDOERS? para obter mais informações.

Se o usuário www-data não puder gravar em /some-path , você ainda precisará de privilégios elevados para criar o diretório. Você precisará fazer pelo menos duas coisas, talvez três:

  1. crie o subdiretório como um usuário com privilégios suficientes;
  2. se necessário, altere a propriedade do subdiretório;
  3. se necessário, altere as permissões do subdiretório.

Se o subdiretório deve pertencer ao usuário www-data , você pode criá-lo como um grupo que pode gravar em /some-path . Se necessário, defina uma ACL que permita que some-group grave em /some-path : setfacl -m group:some-group:rwx /some-path . Então, dê a www-data o direito de executar o comando mkdir com sudo . Execute visudo e adicione a seguinte regra:

 www-data ALL = ( : some-group) /bin/mkdir /some-path/[0-9A-Z_a-z]*, !/bin/mkdir /some/path/[!-0-9A-Z_a-z]

Isso permite que www-data execute sudo -g some-group mkdir /some-path/foo-bar para criar subdiretórios em /some-path .

Se o subdiretório precisar pertencer a outro usuário que possa gravar em some-path , execute o comando mkdir como esse usuário. Você pode conseguir que o diretório tenha as permissões e a propriedade corretas no momento da criação. Para o arquivo sudoers :

www-data ALL = (some-user : some-group) /bin/mkdir -m 775 /some-path/[0-9A-Z_a-z]*, !/bin/mkdir /some/path/[!-0-9A-Z_a-z]

Execute sudo -u some-user -g some-group mkdir -m 775 /some-path/foo-bar para criar um diretório gravável em grupo pertencente a some-user:some-group em /some-path .

    
por 14.12.2012 / 01:59
2

Não tenho certeza se a seguinte maneira é a sua situação ou não:

Vamos supor seguir

  • Um diretório gravável em www-data: / var / www / data
  • Diretório paretn pretendido original: / home / parent

Faça isso:

ln -s /var/www/data /home/parent/data

Então, em vez de www-data escrever diretamente em / home / parent, data pode ser acessado por parent através do link virtual.

Também pode ser feito com uma montagem local como segue

mount -o bind /var/www/data /home/parent/data

Ou monte para pai diretamente

mount -o bind /var/www/data /home/parent

Com o método de montagem local, o diretório de destino se comporta como um sistema de arquivos normal.

    
por 13.12.2012 / 03:52