Autorisation SFTP refusée sur les fichiers appartenant à www-data

23

J'ai un serveur assez standard configuré avec Apache et PHP. Une application que j'exécute crée des fichiers qui appartiennent à l'utilisateur Apache www-data. Les fichiers que je télécharge via SFTP appartiennent à mon propre utilisateur charlesr. Tous les fichiers font partie du www-datagroupe. Mon problème est que je ne peux pas modifier ou écraser les fichiers via SFTP qui appartiennent à www-data, même s'il charlesrfait partie du www-datagroupe. Je peux modifier les fichiers sans problème via une session SSH.

Je ne sais donc pas quoi faire. Comment donner à ma session SFTP les autorisations pour modifier les www-datafichiers possédés?

Pour un peu de contexte, voici les notes que j'ai écrites moi-même lors de la configuration du serveur:

Now set up permissions on `/var/www` where your files are served from by
default:

$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www

Now log out and log in again to make the changes take hold.

The previous set of commands does the following:

1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.

Et puis je continue à m'expliquer ce que signifie le réglage du bit SGID (c'est-à-dire que tous les fichiers créés dans font automatiquement /var/wwwpartie du www-datagroupe).


MISE À JOUR

Il semble que le problème soit dû à l'application elle-même ou, plus précisément, au cadre d'application ( Kohana ) définissant certains fichiers qu'elle écrit sur 0644 (rw-r - r--); c'est-à-dire non inscriptible en groupe. Ceci, couplé au fait que les fichiers appartiennent également à, www-datasignifiait que je ne pouvais pas modifier les fichiers via SFTP lors de la connexion en tant que charlesr. Je ne sais pas pourquoi j'ai pu éditer les fichiers via SSH. Je suppose que j'ai dû utiliser sudo.

Voici la stratégie d'autorisations que j'utilise maintenant grâce à l' aide infatigable de Marty Fried , qui a souligné les failles de ma stratégie précédente et m'a également aidé à naviguer dans le monde des autorisations Linux jusqu'à ce que je le trouve enfin. Merci Marty!

Présentation

  • Les fichiers et répertoires /var/wwwdoivent appartenir àroot:webmasters
  • Tous les développeurs doivent être membres du webmastersgroupe
  • Tous les répertoires dans /var/wwwdoivent être définis sur: 2775ou u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Tous les fichiers /var/wwwdoivent être définis sur: 0664ou ug=rw,o=r(rw-rw-r--)

Les éléments suivants devraient appartenir à www-data:webmasters(c'est-à-dire que ce sont les répertoires sur lesquels Apache doit pouvoir écrire):

  • application / cache
  • application / journaux
  • télécharger
  • client_helpers / upload

COMMENT

Pour configurer des autorisations sur /var/wwwla provenance de vos fichiers par défaut:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [etc...]

Maintenant, déconnectez-vous et reconnectez-vous pour que les modifications prennent effet.

L'ensemble de commandes précédent effectue les opérations suivantes:

  1. Créez un nouveau groupe appelé webmasters; tous les utilisateurs qui ont besoin d'un accès en écriture aux fichiers de l'application seront ajoutés à ce groupe.
  2. ajoute l'utilisateur actuel ( $USER) au webmastersgroupe.
  3. change le propriétaire de /var/wwwen rootet le groupe en webmastersgroupe.
  4. ajoute 664 autorisations (-rw-rw-r--) à tous les fichiers de /var/www.
  5. ajoute 775 autorisations (drwxrwxr-x) à tous les répertoires de /var/www.
  6. active le bit SGID /var/wwwet tous les répertoires qu'il contient; ce dernier point mérite d'être expliqué. Notez également que vous pouvez également mettre un 2 à l'avant de votre octal chmod (par exemple 2644) pour faire la même chose.
  7. définit le propriétaire sur www-data(l'utilisateur d'Apache) et le groupe du répertoire fourni sur webmaster. Cela garantit que le répertoire est accessible en écriture par Apache et toute personne du webmastersgroupe. Faites de même pour tous les autres répertoires qui doivent être accessibles en écriture.
Charles Roper
la source

Réponses:

10

Ubuntu.com a de très bons serverguides, comme le guide Apache . Où avez-vous obtenu vos procédures si soigneusement écrites? Je n'ai jamais eu à me soucier autant des serveurs que j'ai configurés, même si je suis ouvert à la possibilité que je ne l'ai pas fait correctement - aussi, je n'ai pas réellement installé de serveurs pour tout ce qui est très public ou très grand, il pourrait donc y avoir des failles de sécurité que je ne connais pas.

Cependant, je n'ai jamais eu besoin d'être membre du groupe www-data, et aucun fichier source dans www n'appartient à www-data. D'après ce que je comprends, Apache n'est utilisé que pour ses propres fichiers et il n'aura pas d'autorisations d'écriture sur les autres fichiers lui-même, car en théorie, aucun fichier important ne permettra à www-data d'avoir une autorisation d'écriture. Je suppose que les fichiers appartenant à www-data donneraient une permission de lecture seule à tout le monde, et personne ne devrait avoir la permission d'écrire sur ses fichiers. Bien sûr, je peux me tromper, et si je le suis, j'espère que quelqu'un me le dira et me dirigera vers une documentation réelle qui explique différemment (pas vers un forum où un internaute aléatoire comme moi a produit des instructions qui ont fonctionné pour lui).

Il me manque peut-être quelque chose, mais votre problème devrait être assez simple. L'utilisateur connecté à l'aide de sftp doit être membre du groupe www-data et les fichiers que vous essayez de modifier doivent avoir des autorisations d'écriture pour le groupe www-data. Cela n'a pas de sens pour moi que vous puissiez modifier les fichiers en utilisant ssh, mais pas en utilisant sftp; êtes-vous sûr que vous vous connectez au même compte pour les deux? Dans sftp, vous pouvez saisir des commandes telles que !groupsrépertorier vos groupes ou !whoamivérifier le nom de connexion que vous utilisez. Les résultats doivent correspondre à ce que vous voyez en utilisant ssh (avec les mêmes commandes moins le point d'exclamation).

Vous devriez également pouvoir utiliser chmod, chown, chgrp de sftp si vous en avez l'autorisation.

Soit dit en passant, je pense que votre liste contient au moins une très mauvaise commande:

sudo chmod -R g+rw /var/www

Cela donne au monde la permission d'écrire pour chaque fichier et dossier dans / var / www. Cela ressemble à une mauvaise idée. Normalement, seul root a la permission d'écrire sur ces répertoires, à moins que certains spécifiques n'aient besoin de plus de permission, généralement seulement des répertoires uniques.

Remarque: c'était une erreur de ma part. Merci à DonalLafferty d'avoir signalé cela, qu'il spécifie "g", pas "a", donc il ne change que les permissions de groupe. Mes vieux yeux fatigués (ou une mauvaise police) ont dû le lire comme "a".

Modifications pour clarification

Normalement, les fichiers créés par Apache sont en lecture seule pour le groupe www-data et tous les autres utilisateurs, de la même manière que les fichiers appartenant à root dans / var / www. Ainsi, il ne devrait y avoir aucune raison de faire de quiconque un membre de www-data. Le problème est de donner à tout le monde un accès en écriture, ce qui est un cas différent. Cela devrait être fait en rendant des répertoires spécifiques disponibles sur votre site, et cela se fait simplement en utilisant chmod, soit avec sudo, car il appartient probablement à root, soit en faisant vous-même le propriétaire et en n'utilisant pas sudo.

Si vous avez plus de développeurs qui ont besoin d'accéder à l'ensemble du site, c'est quand vous voulez créer un utilisateur + un groupe tel que "webmasters", en faire le propriétaire du site, donner des autorisations d'écriture à ce groupe et faire de tous les membres des développeurs de ce groupe. Ainsi, la liste des répertoires du site ressemblerait à:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Plus de modifications

J'ai depuis réalisé que vous n'avez pas vraiment besoin de créer un utilisateur "webmasters", juste un groupe. Ensuite, les fichiers peuvent appartenir à root: webmasters, c'est-à-dire que root est le propriétaire, mais les webmasters sont le groupe.

En réponse aux questions ci-dessous, les fichiers qu'Apache écrit appartiendront à www-data et au groupe www-data. Ces fichiers ne sont normalement pas quelque chose que vous écrivez, donc les non-membres de www-data peuvent avoir un accès en lecture seule - je pense que cela dépend des permissions du répertoire. Si vous avez besoin d'un accès en écriture plus qu'occasionnel, il peut être utile de vous ajouter au groupe. Habituellement, vous rendez le monde des répertoires spécifiques accessible en écriture pour le contenu enregistré par Apache. Considérez également que la plupart des hébergements Web partagés exécutant Apache sans accès au shell n'auraient même pas de moyen de configurer des groupes.

Mais, Apache peut lire des fichiers appartenant même à root. Presque tous les fichiers ont un accès lisible dans le monde, mais pas inscriptibles. Donc, à moins que vous ne vouliez changer cela, Apache n'a pas besoin d'être dans le groupe des webmasters.

C'est toute la configuration de base de Linux, pas vraiment Apache. Apache ne se soucie que de l'accès à partir du serveur Web, et cela est défini par les fichiers de configuration. Pour cette raison, le lien de documentation Ubuntu que j'ai inclus dans mon article devrait être considéré comme une meilleure source qu'un wiki public.

Soit dit en passant, le livre de recettes O'Reilly Apache indique que "les répertoires de documents, tels que htdocs, cgi-bin et icônes, devront avoir des autorisations définies de la manière qui convient le mieux au modèle de développement de votre site Web particulier, mais en aucun cas aucun de ces répertoires ou fichiers qu'ils contiennent ne doit être accessible en écriture par l'utilisateur du serveur Web. "

Enfin, l'utilisation des listes de contrôle d'accès est un bon moyen de définir des autorisations de fichier si vous avez besoin de plus de contrôle. C'est peut-être même un bon moyen de les régler tout le temps, et c'est quelque chose que je devrais étudier.

Marty Fried
la source
Salut @ marty-fried, merci pour la réponse, cela me donne beaucoup à essayer. Ré. vos questions. J'ai rassemblé les informations à partir de diverses sources (d'où la raison pour laquelle je les ai écrites dans mon guide d'utilisation personnelle) et je ne me souviens pas de la source exacte. Bien que je n'aie pas utilisé cette source particulière (solution 1) (je viens juste de la trouver), cela donne une bonne justification de ma décision. Dans le guide Apache que vous mentionnez, il recommande de créer un groupe appelé «webmasters», mais si je le faisais, comment Apache écrirait-il dans le /var/wwwsans l'ajouter également à ce groupe?
Charles Roper
Et je ne dois donner d' autres utilisateurs l' accès à /var/wwwdonc je pensais que donne un accès groupe www-dataet de faire à chacun un membre de ce groupe serait une bonne solution. Je peux maintenant voir le problème d'Apache d'être capable d'écraser n'importe quel fichier là-dedans, cependant. Étant donné que seulement 2 développeurs (dont moi-même) ont accès au code, il est relativement sûr à court terme.
Charles Roper
1
Merci Marty. Cette partie du livre de recettes Apache m'a fait rire: "Vous devez savoir que si vous demandez à 12 personnes les bonnes façons de définir les autorisations de fichiers sur votre serveur Apache, vous obtiendrez une douzaine de réponses différentes." Vous m'avez donné presque tout ce dont j'ai besoin pour progresser maintenant. Merci beaucoup pour votre temps. :-)
Charles Roper
1
J'ai aussi appris un peu, c'est pourquoi j'apprécie les discussions approfondies - cela aide généralement à clarifier certaines des parties floues. Je suis principalement un programmeur qui est invité à résoudre des problèmes et à créer des sites Web, donc j'apprends toujours de meilleures façons de faire les choses. N'hésitez pas à demander s'il y a d'autres questions.
Marty Fried
1
AFAIK, sudo chmod -R g + rw / var / www donne un accès 'groupe'. Utilisez «a + rw» pour accéder au monde.
Donal Lafferty
7

J'ai remarqué que tu n'avais pas utilisé chown.

Pour définir correctement la propriété des fichiers / dossiers, vous pouvez définir l'ensemble du répertoire de cette façon: chown -R www-data:www-data

Cela définit la propriété du groupe www-dataet de l'utilisateurwww-data

En outre, vous pouvez le faire comme solution de contournement temporaire:

chmod 777 /var/data/<filename> ou chmod 777 /var/data/<foldername>

modifiez le ou les fichiers selon vos besoins, puis

chmod 644 /var/data/<filename> ou chmod 755 /var/data/<foldername>

Soyez prudent d'utiliser le commutateur "-R", car il modifie également les autorisations de tous les sous-fichiers et dossiers.

664 correspond aux autorisations de fichier standard Apache et 755 aux autorisations de dossier standard.

J'espère que cela t'aides :)

Étoile

StarBlessed
la source
Bonjour, merci d'avoir pris le temps de répondre, c'est très apprécié. Cependant, cela n'aide pas vraiment. Chowning les fichiers les rend tous non modifiables lors de l'utilisation de SFTP (donc à peu près le contraire de ce que je recherche!). Je ne peux pas vraiment utiliser la solution de contournement chmod parce que a) je n'ai pas les autorisations de chmod dans SFTP; b) Je ne veux pas vraiment me connecter via SSH, changer les autorisations, faire mon SFTPing, revenir en arrière, etc. et c) certains fichiers ont des autorisations différentes pour des raisons de sécurité, donc je ne peux pas chmod en masse de toute façon.
Charles Roper
Qu'est-ce que c'est /var/data? De plus, quel répertoire suggérez-vous d'utiliser la commande chown -R www-data:www-data? Espérons que non /var/www.
Marty Fried