Como defino umask padrão no Apache no Debian?

14

Eu preciso que os arquivos criados pelo apache2 tenham umask 002, ou seja, group rw, por padrão.

Eu tentei colocar o umask 002arquivo / etc / apache2 / envvars e, embora esse script seja executado como parte do apache start up ( apache2ctl graceful), o umask não tem efeito. Presumivelmente em algum lugar além do processo de inicialização (por exemplo, quando o usuário é rebaixado de rootpara www-data), há um lugar melhor para colocar isso.

Eu li posts sobre o Fedora e um sugerindo colocar umask, /etc/init.d/apache2mas nenhum deles se aplica / funciona no Debian (Squeeze).

Você pode ajudar?

artfulrobot
fonte
1
Você deve tentar reiniciar o Apache com "/etc/init.d/apache2 restart" ou "service apache2 restart"
Jens Bradler 28/04
sim, nem funcionou.
Artfulrobot
Como você cria novos arquivos (WebDAV, PHP)?
Jens Bradler
No meu teste, estou usando file_put_contents (). mas o código que estou tentando corrigir é o módulo Less do Drupal (que cria versões em cache dos arquivos CSS menos processados). Meu problema específico é que não consigo executar drush cc allcomo meu usuário, porque ele gera erros em todos esses arquivos de cache criados pela www-data.
Artfulrobot

Respostas:

11

Para garantir que a configuração umask entre em vigor, use um teste simples e não use nenhum outro aplicativo da Web para isso. Pode ser que esses aplicativos alterem os direitos independentemente da configuração umask do Apache.

Script PHP de teste simples:

<?php
if ($fp = fopen(time() . '.txt', 'w')) {
  fwrite($fp, 'This is a simple test.');
  fclose($fp);
  echo "done";
} else {
  echo "error - cannot create file";
}
?>

Certifique-se de que o usuário www-data tenha acesso de gravação à pasta em que você instalou esse arquivo de teste simples.

Para ter o novo umask em execução, verifique se o arquivo / etc / apache2 / envvars será usado no arquivo inicial do Apache /etc/init.d/apache2:

...
PIDFILE=$(. /etc/apache2/envvars && echo $APACHE_PID_FILE)
...

Defina seu umask em / etc / apache2 / envvars:

...
# umask 002 to create files with 0664 and folders with 0775
umask 002

Reinicie seu Apache:

service apache2 restart

Verifique a diferença:

#> ls -l *.txt
-rw-rw-r-- 1 www-data www-data  14 2012-05-01 15:56 1335880583.txt
-rw-r--r-- 1 www-data www-data  14 2012-05-01 15:55 1335880540.txt
Jens Bradler
fonte
Obrigado! Mesmo que isso me fez sentir como um idiota para lê-lo (eu tinha o octal errado para rw grupo) * corar *
artfulrobot
Seu pequeno trecho de PHP salvou minha sanidade mental, o plugin DOP Sqlite3 Wordpress sempre configurará o grupo como somente leitura para seu arquivo de banco de dados.
Daniel Sokolowski
2

Se você executar vários sites, poderá definir a permissão de grupo padrão usando as Listas de Controle de Acesso (ACL) por diretório, da seguinte maneira:

Defina o setidsinalizador para forçar todos os novos arquivos a herdar o grupo do diretório:

# chmod g+s wordpress

Crie novos arquivos rwpara as permissões de grupo, ex. para que www-datapossa gravar em arquivos SFTP pelo usuário de upload:

# setfacl --default --modify group::rwx wordpress 

Confirme se a ACL é assim:

# getfacl wordpress
# file: wordpress
# owner: carissacosgrove
# group: www-data
# flags: -s-
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::r-x

Crie um arquivo para confirmar que funcionou:

# ll test
-rw-rw-r-- 1 root www-data 0 Feb 17 01:09 test
Daniel Sokolowski
fonte
Isso não será problemático se o aplicativo estiver tentando gravar arquivos com permissão reduzida de propósito?
berbt
Nem por isso, a aplicação vai escrever apenas com permissões reduzidas, que realmente me confundiu um pouco inicialmente - stackoverflow.com/questions/28454551/...
Daniel Sokolowski
1
Eu acho que esse comando setfacl --default --modify group:rwx wordpressestá faltando dois pontos. Deveria sersetfacl --default --modify group::rwx wordpress
Marcos
2

(Para Debian Stretch que usa systemd - Obrigado womble!)

Coloque UMask=0002no arquivo da unidade de serviço do Apache2 systemd, recarregue a unidade de serviço e reinicie o Apache2.

$ pwd
/etc/systemd/system/multi-user.target.wants

$ cat apache2.service
[Unidade]
Descrição = O servidor HTTP Apache
Depois = network.target remote-fs.target nss-lookup.target

[Serviço].
.
.
.
UMask = 0002

$ sudo systemctl daemon-reload
$ sudo systemctl restart apache2
duplexddaann
fonte
O Debian Squeeze não usou o systemd.
womble
Ah, sim, no final do corpo da pergunta original, eles dizem Debian Squeeze. Como a pergunta era de ~ 8 anos atrás, a partir de hoje, e como eu estava tentando resolver o problema colocado no título com o Debian mais recente, no final de 2019, foi isso que eu postei. Acho que a maioria das pessoas que procura uma solução hoje, em oposição a oito anos atrás, pode se beneficiar da minha solução, então vou deixar o que coloco. Obrigado por apontar isso.
Duplexddaann