L'utilisateur ne peut pas toucher -t

10

Lors de la SCP sur mon serveur Fedora, un utilisateur continue de recevoir des erreurs de ne pas pouvoir modifier les horodatages des fichiers ("définir l'heure: opération non autorisée"). L'utilisateur n'est pas le propriétaire du fichier, mais nous ne pouvons pas chowndéposer de fichiers vers cet utilisateur pour des raisons de sécurité. L'utilisateur peut sudo, mais comme cela se produit via un client SCP / FTP, il n'y a aucun moyen de le faire non plus. Et enfin, nous ne voulons pas avoir à donner à cet utilisateur un accès root, juste pour lui permettre d'utiliser une synchronisation comme rsync ou WinSCP qui doit définir des horodatages.

L'utilisateur fait partie d'un groupe avec des rwautorisations complètes sur tous les fichiers et répertoires pertinents. Avez-vous des idées sur la façon d'accorder la permission de l'utilisateur à touch -tces fichiers spécifiques sans chownles lui communiquer?

Informations supplémentaires Tout cela a à voir avec l'activation du développement PHP dans un scénario à développeur unique (c'est-à-dire sans SCM). J'essaie de travailler avec Eclipse ou NetBeans pour travailler sur une copie locale du site basé sur PHP (WordPress), tout en permettant à l'utilisateur de prévisualiser "instantanément" ses modifications sur le serveur de développement. L'utilisateur travaillera à distance. Jusqu'à présent, toutes les tentatives de synchronisation automatique ont échoué - même en utilisant WinSCP en mode "dossier de surveillance", où il surveille un dossier local et tente de télécharger toutes les modifications jusqu'à l'erreur du répertoire distant car il essaie toujours de définir la date / l'horodatage .

L'utilisateur a un accès sudo, mais on m'a dit que ce n'était vraiment pas une bonne idée de travailler sous 'root', donc je n'ai pas voulu me connecter en tant que root pour faire ce travail. En outre, cela ne devrait pas être nécessaire. Je souhaiterais qu'un autre non-superutilisateur puisse faire la même chose - en utilisant les informations de son compte, établir une connexion FTP et pouvoir travailler à distance via la synchronisation. La solution doit donc fonctionner pour quelqu'un sans accès root.

Ce qui me stupéfie, c'est la difficulté que j'ai. Tous ces logiciels (NetBeans, Eclipse, WinSCP) sont conçus pour permettre la synchronisation, et ils essaient tous d'écrire l'horodatage. Cela doit donc être possible. WinSCP a la possibilité de désactiver "set timestamp", mais cette option devient indisponible (toujours "on") lorsque vous sélectionnez surveiller / synchroniser le dossier. Donc , il est obtenu d'être quelque chose qui est assez standard.

Étant donné que je suis un idiot complet en ce qui concerne Linux, et que je suis le "administrateur du serveur", je ne peux que supposer que c'est quelque chose d'idiot que je fais ou que j'ai (mal) configuré.

Résumé En un mot, je veux que tous les utilisateurs qui ont un accès de groupe r / w à un répertoire, puissent changer l'horodatage des fichiers dans ce répertoire via SCP.

Tom Auger
la source
1
Votre système de fichiers est-il monté avec quelque chose de drôle? Utilisez-vous des ACL? Normalement, cela serait possible avec l'appartenance à un groupe.
Caleb
5
Fondamentalement, votre système vous dit: «Vous ne pouvez pas toucher à [son]».
boehj
@Caleb: Non, vous ne pouvez définir la date actuelle que si vous en êtes le propriétaire. @Tom: Est-il important que la date soit respectée? Pourriez-vous développer un peu les exigences: si l'utilisateur peut écrire dans le fichier, pourquoi est-il important qu'il en soit le propriétaire? Habituellement, dans ces situations, la dernière personne qui a écrit dans le fichier en est propriétaire.
Gilles 'SO- arrête d'être méchant'
@Tom: Il y a une contradiction apparente entre «nous ne voulons pas donner à cet utilisateur un accès root» et «L'utilisateur peut sudo», pourriez-vous mieux expliquer cette partie? Concernant votre utilisation du rootgroupe: le rootgroupe n'a pas d'autorisations spéciales, seul l' rootutilisateur en a.
Gilles 'SO- arrête d'être méchant'
2
@Tom: ACL = liste de contrôle d'accès
Gilles 'SO- arrête d'être méchant'

Réponses:

10

Pourquoi ça ne marche pas

Lorsque vous essayez de changer l'heure de modification d'un fichier avec touch, ou plus généralement avec l'appel système sous-jacent utime, il y a deux cas.

  • Vous essayez de définir l'heure de modification du fichier à une heure spécifique. Cela nécessite que vous soyez le propriétaire du fichier. (Techniquement, l'ID utilisateur effectif du processus doit être le propriétaire du fichier.²)
  • Vous essayez de définir l'heure de modification du fichier à l'heure actuelle. Cela fonctionne si et seulement si vous avez la permission d'écrire dans le fichier. La raison de cette exception est que vous pouvez de toute façon obtenir le même effet en écrasant un octet existant du fichier avec la même valeur¹.

Pourquoi cela n'a généralement pas d'importance

  • Lorsque vous copiez des fichiers avec ftp, scp, rsync, etc., la copie crée un nouveau fichier qui appartient à la personne qui a effectué la copie. Le copieur a donc la permission de régler les heures du fichier.
  • Avec rsync, vous ne pourrez pas définir l'heure des répertoires existants: ils seront définis à l'heure à laquelle un fichier a été synchronisé pour la dernière fois. Dans la plupart des cas, cela n'a pas d'importance. Vous pouvez dire à rsync de ne pas se soucier des heures de répertoire en passant --omit-dir-times( -O).
  • Avec les systèmes de contrôle de version, les dates de révision sont stockées dans des fichiers; les métadonnées sur les fichiers ne sont généralement pas pertinentes.

Solutions

Tout cela a à voir avec l'activation du développement PHP dans un scénario à développeur unique (c'est-à-dire sans SCM).

Ok, arrête là. Ce n'est pas parce qu'il n'y a qu'un seul développeur que vous ne devez pas utiliser SCM. Vous devez utiliser SCM. Demandez au développeur d'archiver un fichier et donnez-lui un moyen d'appuyer sur un bouton «déployer» pour extraire les fichiers de SCM dans le répertoire en direct.

Il n'y a absolument aucune raison technique pour laquelle vous ne devriez pas utiliser SCM, mais il peut y avoir une raison humaine. Si la personne qui travaille sur ces fichiers se dit «développeur», elle devrait utiliser SCM. Mais s'il s'agit d'une personne non technique insérant des documents, SCM peut être trop compliqué. Continuez donc à pousser les fichiers via FTP ou SSH. Cela peut fonctionner de trois manières.

  • Avez-vous vraiment besoin de synchroniser les heures? Comme indiqué ci-dessus, rsynca une option pour ne pas synchroniser les heures. Scp ne le fait pas sauf si vous le lui dites. Je ne connais pas WinSCP mais il le peut probablement aussi.
  • Continuez à faire ce que vous faites, ignorez simplement les messages sur les temps. Les fichiers sont toujours en cours de copie. Ce n'est pas une bonne option, car ignorer les erreurs est toujours risqué. Mais c'est techniquement possible.
  • Si vous avez besoin de souplesse pour remplir les fichiers appartenant à l' apacheutilisateur, alors l'approche habituelle serait d'autoriser l'utilisateur SSH à accéder en tant que apache. L' approche la plus simple consiste à demander à l'utilisateur de créer une clé privée SSH et d'ajouter la clé publique correspondante à ~apache/.ssh/authorized_keys. Cela signifie que l'utilisateur pourra exécuter des commandes arbitraires en tant apachequ'utilisateur. Puisque vous êtes d'accord pour donner à l'utilisateur des droits sudo de toute façon, cela n'a pas d'importance dans votre cas. Il est possible, mais pas si facile, de mettre plus de restrictions (vous avez besoin d'une entrée de base de données utilisateur distincte avec un nom différent, le même ID utilisateur, un shell restreint et une prison chroot; détails dans une question distincte, bien que cela puisse déjà être couvert sur ce site ou sur Server Fault ).

¹ Ou, pour un fichier vide, écrivez un octet puis tronquez.
² Sauf complications supplémentaires, mais aucune que je sache ne s'applique ici.

Gilles 'SO- arrête d'être méchant'
la source
Merci Gilles pour cette explication intéressante. Cependant, je ne sais pas à quel point je peux être plus clair sur le cas d'utilisation. NetBeans continue de générer des erreurs "impossible de se déconnecter" chaque fois que je synchronise (bien que le fichier soit transféré correctement et vérifié sur le serveur); WinSCP renvoie des erreurs de «temps défini: opération non autorisée»; lorsque je décompresse un fichier, je reçois des avertissements sur l'impossibilité de définir l'horodatage à une heure ultérieure. Au-delà de cela, je ne sais pas où se situe le problème. Je veux simplement pouvoir synchroniser un local vers un répertoire distant. via SCP / FTP et le problème semble être des horodatages. est-ce que cela aide? Probablement pas.
Tom Auger
@Tom: Je ne comprends toujours pas pourquoi les utilisateurs ne peuvent pas simplement posséder les fichiers.
Gilles 'SO- arrête d'être méchant'
Certains fichiers doivent appartenir à Apache (par exemple, le répertoire de téléchargement), je ne peux donc pas changer le propriétaire, simplement parce que quelqu'un travaille sur certains des fichiers du répertoire. Ce que vous dites n'a pas de sens - lorsque j'écrase un fichier via FTP, le propriétaire ne change pas nécessairement. Je ne vois pas la nécessité de modifier ce comportement.
Tom Auger
@Tom: Le propriétaire ne change pas uniquement parce que ce sont des fichiers existants. Je ne comprends pas pourquoi vous ne laissez pas les utilisateurs télécharger des fichiers en tant que apache- alors ils pourraient définir des heures. Voir ma réponse révisée pour la bonne solution et quelques-unes des sous-optimales.
Gilles 'SO- arrête d'être méchant'
Merci d'être resté avec cette question Gilles. L'utilisation de SVN ou d'une variante n'est pas optimale du point de vue du développement. Quiconque a fait du développement Web à distance peut vous dire que le processus est généralement micro-incrémental - en particulier lors du style visuel - vous effectuez donc des validations toutes les 30 à 60 secondes. Si vous devez constamment quitter votre IDE, exécuter une validation, puis prévisualiser votre navigateur, vous ajoutez une tonne de surcharge à ce qui devrait être un processus simple. SVN n'a de sens que dans le contexte lorsque plusieurs développeurs travaillent sur la même partie d'un site. C'est différent de la programmation.
Tom Auger
2

Vous pouvez configurer rsync pour utiliser sudo sur l'extrémité distante comme ceci:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
Caleb
la source
Quelle serait la règle du sudo? Autoriser simplement rsync permettrait à l'utilisateur d'écraser des fichiers arbitraires. Il est assez difficile d'obtenir les bonnes limitations d'argument, et de toute façon ici, je pense que vous devriez mettre des restrictions sur l'entrée de rsync, ce qui est techniquement possible avec un script wrapper mais pas facile.
Gilles 'SO- arrête d'être méchant'
Vous avez raison, permettre sudo rsyncest très difficile de restreindre. Je ne l'ai suggéré que parce que l'OP a dit que l'utilisateur avait déjà un accès sudo.
Caleb
Merci - c'est intéressant, bien que le développeur soit sur une boîte Windows, donc je ne suis pas sûr que rsync soit la meilleure solution. Encore une fois, comme je l'ai mentionné dans la modification de mon message, je veux que cette solution fonctionne pour tout utilisateur moyen, pas pour certains utilisateurs privilégiés, au-delà de quelqu'un appartenant au groupe qui possède ce répertoire particulier.
Tom Auger
Je pense que la prochaine chose à examiner est la configuration des listes de contrôle d'accès (Listes d'accès), mais j'ai peu d'expérience dans ce domaine, alors peut-être qu'un gourou peut ajouter une réponse et expliquer si et comment cela peut être fait.
Caleb