Benutzer kann -t nicht berühren

10

Beim SCP auf meinem Fedora-Server wird immer wieder ein Fehler angezeigt, dass Dateizeitstempel nicht geändert werden können ("Zeit einstellen: Vorgang nicht zulässig"). Der Benutzer ist nicht der Eigentümer der Datei, aber wir können chownaus Sicherheitsgründen keine Dateien an diesen Benutzer senden. Der Benutzer kann dies sudo, aber da dies über einen SCP / FTP-Client geschieht, gibt es auch keine Möglichkeit, dies zu tun. Und schließlich möchten wir diesem Benutzer keinen Root-Zugriff gewähren müssen, nur um ihm die Verwendung einer Synchronisation wie rsync oder WinSCP zu ermöglichen, mit der Zeitstempel festgelegt werden müssen.

Der Benutzer ist Teil einer Gruppe mit vollständigen rwBerechtigungen für alle relevanten Dateien und Verzeichnisse. Irgendwelche Gedanken darüber, wie man dem Benutzer die Erlaubnis für touch -tdiese spezifischen Dateien erteilt, ohne chownsie ihm zu geben?

Weitere Informationen Dies alles hat mit der Aktivierung der PHP-Entwicklung in einem Szenario mit nur einem Entwickler zu tun (dh ohne SCM). Ich versuche, mit Eclipse oder NetBeans an einer lokalen Kopie der PHP-basierten (WordPress) Site zu arbeiten, während der Benutzer "sofort" eine Vorschau seiner Änderungen auf dem Entwicklungsserver anzeigen kann. Der Benutzer arbeitet remote. Bisher sind alle Versuche zur automatischen Synchronisierung fehlgeschlagen - selbst wenn WinSCP im Modus "Ordner überwachen" verwendet wird, in dem ein lokaler Ordner überwacht und versucht wird, Änderungen bis zum Remote-Verzeichnisfehler hochzuladen, da immer versucht wird, Datum und Zeitstempel festzulegen .

Der Benutzer hat zwar Sudo-Zugriff, aber mir wurde gesagt, dass es wirklich keine gute Idee ist, unter "root" zu arbeiten. Daher wollte ich mich nicht einfach als root anmelden, um diese Arbeit auszuführen. Außerdem sollte es nicht notwendig sein. Ich möchte, dass ein anderer Nicht-Superuser das Gleiche tun kann - mithilfe seiner Kontoinformationen eine FTP-Verbindung herstellen und per Synchronisierung remote arbeiten kann. Die Lösung muss also für jemanden ohne Root-Zugriff funktionieren.

Was mich erschüttert, ist, wie viel Schwierigkeit ich habe. Alle diese Softwareprogramme (NetBeans, Eclipse, WinSCP) ermöglichen die Synchronisierung und versuchen alle, den Zeitstempel zu schreiben. Also muss es möglich sein. WinSCP hat die Option, "Zeitstempel setzen" zu deaktivieren, aber diese Option ist nicht mehr verfügbar (immer "Ein"), wenn Sie Ordner überwachen / synchronisieren auswählen. So ist es bekommt etwas sein , das ist ziemlich Standard.

Angesichts der Tatsache, dass ich ein kompletter Idiot in Bezug auf Linux bin und der Entwickler "Serveradministrator" bin, kann ich nur annehmen, dass es etwas Idiotisches ist, das ich tue oder das ich (falsch) konfiguriert habe.

Zusammenfassung Kurz gesagt, ich möchte, dass alle Benutzer, die Gruppen-R / W-Zugriff auf ein Verzeichnis haben, den Zeitstempel für Dateien in diesem Verzeichnis über SCP ändern können.

Tom Auger
quelle
1
Ist Ihr Dateisystem mit etwas Lustigem ausgestattet? Verwenden Sie ACLs? Normalerweise wäre dies mit einer Gruppenmitgliedschaft möglich.
Caleb
5
Grundsätzlich sagt Ihnen Ihr System: "Sie können -t [sein] nicht berühren."
Boehj
@Caleb: Nein, Sie können nur das aktuelle Datum festlegen, es sei denn, Sie sind der Eigentümer. @ Tom: Ist es wichtig, dass das Datum eingehalten wird? Könnten Sie die Anforderungen etwas erweitern: Wenn der Benutzer in die Datei schreiben kann, warum ist es dann wichtig, ob er sie besitzt? In diesen Situationen besitzt normalerweise jeder, der zuletzt in die Datei geschrieben hat, diese.
Gilles 'SO - hör auf böse zu sein'
@ Tom: Es gibt einen offensichtlichen Widerspruch zwischen "Wir möchten diesem Benutzer keinen Root-Zugriff gewähren müssen" und "Der Benutzer kann sudo". Können Sie diesen Teil besser erklären? In Bezug auf Ihre Verwendung der rootGruppe: Die rootGruppe hat keine besonderen Berechtigungen, nur der rootBenutzer.
Gilles 'SO - hör auf böse zu sein'
2
@ Tom: ACL = Zugriffskontrollliste
Gilles 'SO - hör auf böse zu sein'

Antworten:

10

Warum es nicht funktioniert

Wenn Sie versuchen, die Änderungszeit einer Datei mit touchoder allgemeiner mit dem zugrunde liegenden Systemaufruf zu ändern utime, gibt es zwei Fälle.

  • Sie versuchen, die Änderungszeit der Datei auf eine bestimmte Zeit festzulegen. Dies setzt voraus, dass Sie der Eigentümer der Datei sind. (Technisch gesehen muss die effektive Benutzer-ID des Prozesses der Eigentümer der Datei sein.²)
  • Sie versuchen, die Änderungszeit der Datei auf die aktuelle Zeit einzustellen. Dies funktioniert genau dann, wenn Sie die Berechtigung zum Schreiben in die Datei haben. Der Grund für diese Ausnahme ist, dass Sie den gleichen Effekt ohnehin erzielen können, indem Sie ein vorhandenes Byte der Datei mit demselben Wert überschreiben¹.

Warum dies normalerweise keine Rolle spielt

  • Wenn Sie Dateien mit FTP, SCP, Rsync usw. kopieren, erstellt die Kopie eine neue Datei, die demjenigen gehört, der die Kopie erstellt hat. Der Kopierer hat also die Berechtigung, die Zeiten der Datei festzulegen.
  • Mit rsync können Sie die Zeit vorhandener Verzeichnisse nicht festlegen: Sie werden auf die Zeit festgelegt, zu der eine Datei zuletzt in ihnen synchronisiert wurde. In den meisten Fällen spielt dies keine Rolle. Sie können rsync anweisen, sich nicht um Verzeichniszeiten zu kümmern, indem Sie --omit-dir-times( -O) übergeben.
  • Bei Versionskontrollsystemen werden Revisionsdaten in Dateien gespeichert. Die Metadaten in den Dateien sind größtenteils irrelevant.

Lösungen

Dies alles hat mit der Aktivierung der PHP-Entwicklung in einem Szenario mit nur einem Entwickler zu tun (dh ohne SCM).

Ok, hör genau dort auf. Nur weil es einen einzigen Entwickler gibt, heißt das nicht, dass Sie SCM nicht verwenden sollten. Sie sollten SCM verwenden. Lassen Sie den Entwickler eine Datei einchecken und geben Sie ihm die Möglichkeit, auf die Schaltfläche "Bereitstellen" zu klicken, um die Dateien von SCM in das Live-Verzeichnis auszuchecken.

Es gibt absolut keinen technischen Grund, warum Sie SCM nicht verwenden sollten, aber es kann einen menschlichen Grund geben. Wenn die Person, die an diesen Dateien arbeitet, sich selbst als "Entwickler" bezeichnet, sollte sie SCM verwenden. Wenn es sich jedoch um eine nicht technische Person handelt, die Dokumente einschiebt, ist SCM möglicherweise zu kompliziert. Schieben Sie die Dateien also weiter über FTP oder SSH. Es gibt drei Möglichkeiten, wie dies funktionieren kann.

  • Müssen Sie die Zeiten wirklich synchronisieren? Wie oben angegeben, rsyncbesteht die Möglichkeit, die Zeiten nicht zu synchronisieren. Scp tut es nicht, wenn Sie es nicht sagen. Ich kenne WinSCP nicht, aber es kann wahrscheinlich auch.
  • Machen Sie weiter, was Sie tun, ignorieren Sie einfach Nachrichten über Zeiten. Die Dateien werden noch kopiert. Dies ist keine gute Option, da das Ignorieren von Fehlern immer riskant ist. Aber es ist technisch möglich.
  • Wenn Sie Flexibilität beim Auffüllen der Dateien benötigen, deren Eigentümer der apacheBenutzer ist, besteht der übliche Ansatz darin, dem Benutzer SSH-Zugriff als zu gewähren apache. Der einfache Ansatz besteht darin, dass der Benutzer einen privaten SSH-Schlüssel erstellt und den entsprechenden öffentlichen Schlüssel hinzufügt ~apache/.ssh/authorized_keys. Dies bedeutet, dass der Benutzer beliebige Befehle als apacheBenutzer ausführen kann . Da Sie dem Benutzer ohnehin Sudo-Rechte gewähren können, spielt dies in Ihrem Fall keine Rolle. Es ist möglich, aber nicht so einfach, weitere Einschränkungen festzulegen (Sie benötigen einen separaten Benutzerdatenbankeintrag mit einem anderen Namen, derselben Benutzer-ID, einer eingeschränkten Shell und einem Chroot-Gefängnis; Details in einer separaten Frage, obwohl dies möglicherweise bereits behandelt wird auf dieser Site oder bei einem Serverfehler ).

¹ Oder schreiben Sie für eine leere Datei ein Byte und schneiden Sie es dann ab.
² Abgesehen von zusätzlichen Komplikationen, aber keine, die mir bekannt sind, gelten hier.

Gilles 'SO - hör auf böse zu sein'
quelle
Danke Gilles für die interessante Erklärung. Ich bin mir jedoch nicht sicher, wie viel klarer ich über den Anwendungsfall sein kann. NetBeans gibt bei jeder Synchronisierung weiterhin Fehler aus, bei denen die Verbindung nicht getrennt werden kann (obwohl die Datei korrekt übertragen und auf dem Server überprüft wurde). WinSCP löst 'Set Time: Operation nicht erlaubt' Fehler aus; Wenn ich eine Datei entpacke, erhalte ich Warnungen, dass der Zeitstempel nicht auf eine zukünftige Zeit festgelegt werden kann. Darüber hinaus weiß ich nicht, wo das Problem liegt. Ich möchte einfach in der Lage sein, ein lokales mit einem entfernten Verzeichnis zu synchronisieren. über SCP / FTP und das Problem scheint Zeitstempel zu sein. Hilft das? Wahrscheinlich nicht.
Tom Auger
@ Tom: Ich verstehe immer noch nicht, warum Sie nicht einfach die Benutzer die Dateien besitzen lassen können.
Gilles 'SO - hör auf böse zu sein'
Einige der Dateien müssen Apache gehören (z. B. das Upload-Verzeichnis), damit der Eigentümer nicht geändert werden kann, nur weil jemand an einigen Dateien im Verzeichnis arbeitet. Was Sie sagen, macht keinen Sinn - wenn ich eine Datei über FTP überschreibe, ändert sich der Eigentümer nicht unbedingt. Ich sehe keine Notwendigkeit, dieses Verhalten zu ändern.
Tom Auger
@ Tom: Der Eigentümer ändert sich nicht nur, weil es sich um vorhandene Dateien handelt. Ich verstehe nicht, warum Sie nicht zulassen, dass Benutzer Dateien hochladen als apache- dann könnten sie Zeiten festlegen. In meiner überarbeiteten Antwort finden Sie die richtige Lösung und einige suboptimale.
Gilles 'SO - hör auf böse zu sein'
Danke, dass du bei dieser Frage bleibst, Gilles. Die Verwendung von SVN oder einer Variante ist aus entwicklungspolitischer Sicht nicht optimal. Jeder, der die Webentwicklung aus der Ferne durchgeführt hat, kann Ihnen sagen, dass der Prozess normalerweise inkrementell ist - insbesondere beim visuellen Styling -, sodass Sie etwa alle 30-60 Sekunden Commits ausführen. Wenn Sie Ihre IDE ständig beenden, ein Commit ausführen und dann eine Vorschau Ihres Browsers anzeigen müssen, fügen Sie dem einfachen Prozess eine Menge Overhead hinzu. SVN ist nur dann im Kontext sinnvoll, wenn mehrere Entwickler an demselben Teil einer Site arbeiten. Es unterscheidet sich von der Programmierung.
Tom Auger
2

Sie können rsync so einrichten, dass sudo auf der Remote-Seite wie folgt verwendet wird:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
Caleb
quelle
Was wäre die Sudo-Regel? Durch einfaches Zulassen von rsync kann der Benutzer beliebige Dateien überschreiben. Es ist ziemlich schwierig, Argumentationsbeschränkungen richtig zu machen, und ich denke, hier müssten Sie die Eingabe von rsync einschränken, was mit einem Wrapper-Skript technisch möglich, aber nicht einfach ist.
Gilles 'SO - hör auf böse zu sein'
Sie haben Recht, das Zulassen sudo rsyncist sehr schwer einzuschränken. Ich habe es nur vorgeschlagen, weil das OP sagte, der Benutzer habe bereits Sudo-Zugriff.
Caleb
Danke - das ist interessant, obwohl sich der Entwickler auf einer Windows-Box befindet, daher bin ich mir nicht sicher, ob rsync der beste Weg ist. Wie ich bereits in der Bearbeitung meines Beitrags erwähnt habe, möchte ich, dass diese Lösung für jeden durchschnittlichen Benutzer funktioniert, nicht für einige privilegierte Benutzer, außer für jemanden, der zu der Gruppe gehört, die dieses bestimmte Verzeichnis besitzt.
Tom Auger
Ich denke, das nächste, was zu prüfen ist, ist das Einrichten von ACLs (Access Control Lists), aber ich habe wenig Erfahrung in diesem Bereich, sodass vielleicht ein Guru eine Antwort hinzufügen und erklären kann, ob und wie dies getan werden kann.
Caleb