L'autorisation SFTP est refusée sur les fichiers appartenant à www-data

22

J'ai un serveur assez standard configuré avec Apache et PHP. Une application que je lance crée des fichiers et ceux-ci 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 groupe www-data . Mon problème est que je ne peux pas modifier ou écraser les fichiers via SFTP qui appartiennent à www-data , même si charlesr fait partie du groupe www-data . Je peux modifier les fichiers sans problème via une session SSH.

Je ne sais pas trop quoi faire. Comment attribuer à mes autorisations de session SFTP la possibilité de modifier les fichiers appartenant à www-data ?

Pour un peu d’arrière-plan, voici les notes que j’ai écrites 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.

Puis je continue à m'expliquer comment définir le bit SGID (tous les fichiers créés dans /var/www font automatiquement partie du groupe www-data ).

MISE À JOUR

Il semble que le problème soit dû à l'application elle-même ou, plus en particulier, le cadre d’application ( Kohana ) définissant certains fichiers il écrit à 0644 (rw-r - r--); c'est-à-dire pas inscriptible en groupe. Ceci, couplé avec le fait que les fichiers sont également détenus par www-data signifie que je Impossible de modifier les fichiers via SFTP lors de la connexion en tant que charlesr . je ne suis pas pourquoi je pouvais éditer les fichiers via SSH. Je suppose que je doit avoir utilisé sudo.

Voici la stratégie d’autorisations que j’utilise maintenant grâce à la aide inlassable de Marty Fried , qui a souligné les failles de ma stratégie précédente et m'a aidé à marinade dans le monde des autorisations Linux jusqu'à ce que je finalement grokked Merci Marty!

Aperçu

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

Les éléments suivants doivent appartenir à www-data:webmasters (c’est-à-dire, ce sont les répertoires dans lesquels Apache doit pouvoir écrire):

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

HOWTO

Pour définir des autorisations sur /var/www où sont stockés 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.

Le jeu de commandes précédent fait ce qui suit:

  1. Créez un nouveau groupe appelé webmasters ; tous les utilisateurs ayant besoin d'un accès en écriture aux fichiers d'application seront ajoutés à ce groupe.
  2. ajoute l'utilisateur actuel ( $USER ) au groupe webmasters .
  3. change le propriétaire de /var/www à root et le groupe à webmasters group.
  4. ajoute 664 permissions (-rw-rw-r--) à tous les fichiers dans /var/www .
  5. ajoute 775 permissions (drwxrwxr-x) à tous les répertoires dans /var/www .
  6. définit le bit SGID sur /var/www et tous les répertoires qu'il contient; ce dernier point en dit long. 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 (utilisateur d'Apache) et le groupe du répertoire fourni sur webmaster . Cela garantit que le répertoire est accessible en écriture pour Apache et toute personne du groupe webmasters . Faites de même pour tous les autres répertoires qui doivent être accessibles en écriture.
posée Charles Roper 03.10.2012 - 21:00
la source

2 réponses

10

Ubuntu.com a de très bons serverguides, tels que Guide Apache . Où avez-vous trouvé vos procédures si soigneusement écrites? Je n'ai jamais eu à m'attarder sur les serveurs que j'ai mis en place, même si je suis ouvert à la possibilité que je ne le fasse pas correctement. tout ce qui est très public ou très grand, donc il pourrait y avoir des trous 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 de www n’est la propriété de www-data. Je crois comprendre que cela est utilisé par Apache uniquement pour ses propres fichiers, et qu’il n’aura pas d’autorisation d’écriture sur les autres fichiers, car en théorie, aucun fichier important ne permettra à www-data d’avoir une autorisation en écriture. Je suppose que les fichiers appartenant à www-data donneraient une autorisation en lecture seule à tout le monde, et que personne ne devrait avoir l'autorisation d'écrire sur ses fichiers. Je peux me tromper, bien sûr, et si je le suis, j'espère que quelqu'un me dira et me dirigera vers la documentation qui explique différemment (pas sur un forum où un internaute au hasard comme moi a produit des instructions qui fonctionnent pour lui).

Peut-être que je manque 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 disposer d'autorisations en écriture pour le groupe www-data. Cela n'a aucun sens pour moi de pouvoir modifier les fichiers en utilisant ssh, mais sans utiliser sftp; êtes-vous sûr de vous connecter au même compte pour les deux? Dans sftp, vous pouvez entrer des commandes telles que !groups pour répertorier vos groupes ou !whoami pour vérifier quel nom de connexion 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 aussi pouvoir utiliser chmod, chown, chgrp à partir de sftp si vous en avez l'autorisation.

Au fait, je pense que votre liste a au moins une commande assez mauvaise:

sudo chmod -R g+rw /var/www

Cela donne la permission d'écriture mondiale à chaque fichier et dossier dans / var / www. Cela semble être une mauvaise idée. Normalement, seul root dispose des droits d'écriture sur ces répertoires, à moins que certains ne requièrent plus de droits, généralement des répertoires uniques.

Note: C'était une erreur de ma part. Merci à DonalLafferty de l'avoir signalé, qu'il spécifie "g", pas "a", donc il ne modifie que les permissions du groupe. Mes vieux yeux fatigués (ou une mauvaise police) doivent l'avoir lu comme "un".

Modifications pour clarification

Normalement, les fichiers créés par Apache sont en lecture seule pour le groupe www-data et tous les autres utilisateurs, tout comme les fichiers appartenant à la racine dans / var / www. Donc, 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 créant des répertoires spécifiques sur votre site, en utilisant simplement chmod, soit avec sudo, car il appartient probablement à root, soit en créant le propriétaire vous-même 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 à ce moment que vous voulez créer un groupe d’utilisateurs tel que "webmasters", en faire le propriétaire du site, tous les membres devs de ce groupe. Donc, la liste des répertoires du site serait quelque chose comme:

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

Autres éditions

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 être la propriété de 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 écrits par Apache seront la propriété de www-data et du groupe www-data. Ces fichiers ne sont normalement pas quelque chose sur lequel vous écrivez, donc les non-membres de www-data peuvent avoir un accès en lecture seule - je pense que cela dépend des autorisations de répertoire. Si vous avez besoin de plus qu'un accès en écriture occasionnel, il peut être utile de vous ajouter au groupe. Généralement, vous créez des répertoires spécifiques 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 au monde, mais ne sont pas accessibles en écriture. Donc, à moins que vous ne vouliez changer cela, Apache n'a pas besoin d'être dans le groupe webmasters.

Il s’agit d’une configuration Linux de base, pas vraiment d’Apache. Apache se soucie uniquement de l'accès depuis le serveur Web, et cela est défini par les fichiers de configuration. Pour cette raison, le lien de documentation d'Ubuntu que j'ai inclus dans mon post devrait être considéré comme une meilleure source qu'un wiki public.

En passant, le livre de recettes O'Reilly Apache dit: "Les répertoires de documents, tels que htdocs, cgi-bin et les icônes, devront avoir des autorisations définies Ce qui est le plus logique pour le modèle de développement de votre site Web, mais aucun des répertoires ou fichiers qu’ils contiennent ne doit en aucun cas être accessible en écriture par l’utilisateur du serveur Web. "

Enfin, l’utilisation des ACL est un bon moyen de définir des autorisations de fichiers si vous avez besoin de davantage de contrôle. C'est peut-être même un bon moyen de les définir tout le temps et c'est quelque chose que je devrais étudier.

    
réponse donnée Marty Fried 06.10.2012 - 02:16
la source
6

J'ai remarqué que vous n'aviez pas utilisé chown .

Pour définir correctement la propriété des fichiers / dossiers, vous pouvez définir le répertoire entier de la manière suivante: chown -R www-data:www-data

Définit la propriété du groupe www-data et de l'utilisateur www-data

Vous pouvez également le faire comme solution 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>

Faites attention au commutateur "-R", car il modifie également les permissions 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 ça aide:)

Star

    
réponse donnée StarBlessed 03.10.2012 - 22:02
la source

Lire d'autres questions sur les étiquettes