Comment définir umask par défaut dans Apache sur Debian?

14

J'ai besoin de fichiers créés par apache2 pour avoir umask 002, c'est-à-dire le groupe rw, par défaut.

J'ai essayé de mettre umask 002/ etc / apache2 / envvars et bien que ce script soit exécuté dans le cadre du démarrage d'apache ( apache2ctl graceful), l'umask n'a aucun effet. Vraisemblablement quelque part plus loin dans le processus de démarrage (par exemple lorsque l'utilisateur est rétrogradé de rootà www-data), il y a un meilleur endroit pour mettre cela.

J'ai lu des articles sur Fedora et un autre suggérant de mettre umask, /etc/init.d/apache2mais aucun d'eux ne s'applique / ne fonctionne dans Debian (Squeeze).

Pouvez-vous m'aider?

artfulrobot
la source
1
Vous devriez essayer de redémarrer Apache avec "/etc/init.d/apache2 restart" ou "service apache2 restart"
Jens Bradler
oui, ni travaillé.
artfulrobot
Comment créez-vous de nouveaux fichiers (WebDAV, PHP)?
Jens Bradler
Dans mon test, j'utilise file_put_contents (). mais le code que j'essaie de «corriger» avec ceci est le module Less de Drupal (qui crée des versions en cache des fichiers CSS Less traités). Mon problème spécifique est que je ne peux pas exécuter en drush cc alltant qu'utilisateur, car cela génère des erreurs sur tous ces fichiers de cache créés par www-data.
artfulrobot

Réponses:

11

Pour être sûr que le paramètre umask prend effet, veuillez utiliser un test simple et n'utilisez aucune autre application Web pour cela. Il se peut que ces applications modifient les droits indépendamment du paramètre umask d'Apache.

Script PHP de test simple:

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

Veillez à ce que l'utilisateur www-data ait un accès en écriture au dossier dans lequel vous avez installé ce fichier de test simple.

Pour faire fonctionner le nouveau umask, vérifiez si le fichier / etc / apache2 / envvars sera utilisé dans votre fichier de démarrage Apache /etc/init.d/apache2:

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

Définissez votre umask dans / etc / apache2 / envvars:

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

Redémarrez votre Apache:

service apache2 restart

Vérifiez la différence:

#> 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
la source
Je vous remercie! Même si ça me
donnait l'
Votre petit extrait PHP a sauvé ma raison, le plugin PDO Sqlite3 Wordpress définira toujours le groupe en lecture seule pour son fichier de base de données.
Daniel Sokolowski
2

Si vous exécutez plusieurs sites, vous pouvez définir l'autorisation de groupe par défaut à l'aide des listes de contrôle d'accès (ACL) par répertoire, comme suit:

Définissez l' setidindicateur pour forcer tous les nouveaux fichiers à hériter du groupe du répertoire:

# chmod g+s wordpress

Créez de nouveaux fichiers rwpour les autorisations de groupe, par ex. de sorte que www-datapeut écrire dans des fichiers SFTPed par l'utilisateur de téléchargement:

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

Confirmez que l'ACL est comme ceci:

# 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

Créez un fichier pour confirmer qu'il a fonctionné:

# ll test
-rw-rw-r-- 1 root www-data 0 Feb 17 01:09 test
Daniel Sokolowski
la source
Cela ne sera-t-il pas problématique si l'application essaie d'écrire des fichiers avec une autorisation réduite à dessein?
berbt
Pas du tout, l'application écrira simplement avec des autorisations réduites, ce qui m'a en fait un peu dérouté au départ - stackoverflow.com/questions/28454551/…
Daniel Sokolowski
1
Je pense que cette commande setfacl --default --modify group:rwx wordpressmanque un deux-points. Cela devrait êtresetfacl --default --modify group::rwx wordpress
Marcos
2

(Pour Debian Stretch qui utilise systemd - Merci womble!)

Placez UMask=0002le fichier d'unité de service Apache2 systemd, rechargez l'unité de service, puis redémarrez Apache2.

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

$ cat apache2.service
[Unité]
Description = Le serveur HTTP Apache
Après = network.target remote-fs.target nss-lookup.target

[Un service].
.
.
.
UMask = 0002

$ sudo systemctl daemon-reload
$ sudo systemctl restart apache2
duplexddaann
la source
Debian Squeeze n'a pas utilisé systemd.
womble
Ah oui, à la fin du corps de la question d'origine, ils disent Debian Squeeze. Comme la question datait d'il y a environ 8 ans à ce jour et que j'essayais de résoudre le problème posé dans le titre avec la dernière Debian à la fin de 2019, c'est ce que j'ai posté. Je pense que la plupart des gens qui recherchent une solution aujourd'hui par rapport à il y a huit ans peuvent bénéficier de ma solution, alors je vais laisser ce que j'ai mis. Merci de l'avoir signalé.
duplexddaann