SFTP-Berechtigung für Dateien verweigert, deren Eigentümer www-data ist

23

Ich habe einen ziemlich normalen Server eingerichtet, auf dem Apache und PHP laufen. Eine von mir ausgeführte App erstellt Dateien, die dem Apache-Benutzer gehören www-data. Dateien, die ich über SFTP hochlade, gehören meinem eigenen Benutzer charlesr. Alle Dateien sind Teil der www-dataGruppe. Mein Problem ist, dass ich keine der Dateien über SFTP ändern oder überschreiben kann, die Eigentum von sind www-data, obwohl sie charlesrTeil der www-dataGruppe sind. Ich kann die Dateien problemlos über eine SSH-Sitzung ändern.

Ich bin mir also nicht sicher, was ich tun soll. Wie erteile ich meiner SFTP-Sitzung die Berechtigung, www-dataeigene Dateien zu ändern ?

Für ein bisschen Hintergrundinformationen sind dies die Notizen, die ich beim Einrichten des Servers für mich selbst geschrieben habe:

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.

Und dann erkläre ich mir selbst, was das Setzen des SGID-Bits bedeutet (dh alle Dateien, die in erstellt wurden, /var/wwwwerden www-dataautomatisch Teil der Gruppe).


AKTUALISIEREN

Es scheint, dass das Problem durch die App selbst oder genauer durch das Anwendungsframework ( Kohana ) verursacht wurde, das bestimmte Dateien, die es schreibt, auf 0644 (rw-r - r-- ) einstellt. dh nicht gruppenbeschreibbar. Dies, zusammen mit der Tatsache, dass die Dateien auch Eigentum von sind, www-databedeutete, dass ich die Dateien nicht über SFTP bearbeiten konnte, wenn ich mich als eingeloggt hatte charlesr. Ich bin nicht sicher, warum ich die Dateien über SSH bearbeiten konnte. Ich vermute, dass ich sudo verwendet haben muss.

Hier ist die Berechtigungsstrategie, die ich jetzt dank der unermüdlichen Hilfe von Marty Fried verwende , der auf die Fehler meiner vorherigen Strategie hinwies und mir half, in der Welt der Linux-Berechtigungen zu marinieren, bis ich mich endlich daran machte. Vielen Dank, Marty!

Überblick

  • Dateien und Verzeichnisse in /var/wwwsollten Eigentum von seinroot:webmasters
  • Alle Entwickler sollten Mitglieder der webmastersGruppe sein
  • Alle Verzeichnisse in /var/wwwsollten auf: 2775oder u=rwx,g=rwxs,o=rx(rwxrwx-rx) gesetzt sein
  • Alle Dateien in /var/wwwsollten auf: 0664oder ug=rw,o=r(rw-rw-r--) gesetzt sein

Folgendes sollte im Besitz von sein www-data:webmasters(dh dies sind die Verzeichnisse, in die Apache schreiben kann):

  • Anwendung / Cache
  • Anwendung / Protokolle
  • hochladen
  • client_helpers / upload

WIE MAN

So richten Sie Berechtigungen ein, von /var/wwwdenen aus Ihre Dateien standardmäßig bereitgestellt werden:

  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...]

Melden Sie sich jetzt ab und wieder an, damit die Änderungen übernommen werden.

Der vorherige Befehlssatz bewirkt Folgendes:

  1. Erstellen Sie eine neue Gruppe mit dem Namen webmasters; Alle Benutzer, die Schreibzugriff auf die App-Dateien benötigen, werden dieser Gruppe hinzugefügt.
  2. Fügt den aktuellen Benutzer ( $USER) der webmastersGruppe hinzu.
  3. ändert den Besitzer von /var/wwwzu rootund die Gruppe zu webmastersGruppe.
  4. fügt 664 Berechtigungen (rw-rw-r--) auf alle Dateien in /var/www.
  5. Fügt allen Verzeichnissen in 775 Berechtigungen (drwxrwxr-x) hinzu /var/www.
  6. setzt das SGID-Bit /var/wwwund alle darin enthaltenen Verzeichnisse; Dieser letzte Punkt muss erklärt werden. Beachten Sie auch, dass Sie auch eine 2 vor Ihr chmod-Oktal setzen können (z. B. 2644), um dasselbe zu tun.
  7. Setzt den Eigentümer auf www-data(Apaches Benutzer) und die Gruppe des angegebenen Verzeichnisses auf webmaster. Dadurch wird sichergestellt, dass das Verzeichnis von Apache und allen Mitgliedern der webmastersGruppe beschreibbar ist. Machen Sie dasselbe für alle anderen Verzeichnisse, die beschreibbar sein müssen.
Charles Roper
quelle

Antworten:

10

Ubuntu.com hat ziemlich gute Server-Guides, wie zum Beispiel den Apache-Guide . Woher haben Sie Ihre Prozeduren, die Sie so sorgfältig aufgeschrieben haben? Ich musste mich bei keinem der von mir eingerichteten Server so viel Mühe geben, obwohl ich offen bin für die Möglichkeit, dass ich es nicht richtig gemacht habe - auch, dass ich Server für nicht wirklich installiert habe Alles, was sehr öffentlich oder sehr groß ist, sodass es Sicherheitslücken geben kann, von denen ich nichts weiß.

Ich musste jedoch nie Mitglied der Gruppe www-data sein, und keine Quelldateien in www gehören www-data. Ich verstehe, dass dies von Apache nur für seine eigenen Dateien verwendet wird und keine Schreibrechte für die anderen Dateien selbst besitzt, da theoretisch keine wichtigen Dateien erlauben, dass WWW-Daten Schreibrechte besitzen. Ich würde vermuten, dass Dateien, die zu www-data gehören, allen anderen schreibgeschützt sind, und niemand sollte Schreibrechte für seine Dateien haben. Ich könnte mich natürlich völlig irren, und wenn doch, hoffe ich, dass jemand es mir sagt und mich auf eine Dokumentation hinweist, die es anders erklärt (nicht auf ein Forum, in dem ein zufälliger Internetnutzer wie ich Anweisungen herausgegeben hat, die für ihn funktionierten).

Vielleicht fehlt mir etwas, aber dein Problem sollte ziemlich einfach sein. Der Benutzer, der mit sftp angemeldet ist, muss Mitglied der Gruppe www-data sein, und die Dateien, die Sie ändern möchten, müssen über Schreibberechtigungen für die Gruppe www-data verfügen. Es macht für mich keinen Sinn, dass Sie die Dateien mit ssh ändern können, aber nicht mit sftp. Sind Sie sicher, dass Sie sich für beide bei demselben Konto anmelden? In sftp können Sie Befehle eingeben, um beispielsweise !groupsIhre Gruppen aufzulisten oder um !whoamizu überprüfen, welchen Anmeldenamen Sie verwenden. Die Ergebnisse sollten mit dem übereinstimmen, was Sie mit ssh sehen (mit denselben Befehlen abzüglich des Ausrufezeichens).

Sie sollten auch in der Lage sein, chmod, chown, chgrp von sftp zu verwenden, wenn Sie die Erlaubnis dazu haben.

Übrigens, ich denke deine Liste hat mindestens einen ziemlich schlechten Befehl:

sudo chmod -R g+rw /var/www

Dies gibt der Welt Schreibberechtigung für jede Datei und jeden Ordner in / var / www. Das klingt nach einer schlechten Idee. Normalerweise hat nur root Schreibzugriff auf diese Verzeichnisse, es sei denn, bestimmte Verzeichnisse benötigen weitere Berechtigungen, normalerweise nur einzelne Verzeichnisse.

Hinweis: Dies war meinerseits ein Fehler. Vielen Dank an DonalLafferty für den Hinweis, dass hier "g" und nicht "a" angegeben wird, sodass nur die Gruppenberechtigungen geändert werden. Meine müden alten Augen (oder eine schlechte Schrift) müssen es als "a" gelesen haben.

Änderungen zur Verdeutlichung

Normalerweise sind von Apache erstellte Dateien sowohl für die WWW-Datengruppe als auch für alle anderen Benutzer schreibgeschützt, genau wie die Dateien im Stammverzeichnis von / var / www. Es sollte also keinen Grund geben, jemanden zu einem Mitglied von www-data zu machen. Das Problem besteht darin, jedem Schreibzugriff zu gewähren, was ein anderer Fall ist. Dies sollte geschehen, indem bestimmte Verzeichnisse auf Ihrer Site verfügbar gemacht werden. Dazu wird einfach chmod verwendet, entweder mit sudo, da es wahrscheinlich im Besitz von root ist, oder indem Sie den Eigentümer selbst bestimmen und nicht sudo verwenden.

Wenn Sie mehr Entwickler haben, die Zugriff auf die gesamte Site benötigen, dh wenn Sie eine Benutzer- + Gruppe wie "Webmaster" erstellen möchten, machen Sie sie zum Eigentümer der Site, geben Sie dieser Gruppe Schreibberechtigungen und machen Sie alle Entwickler zu Mitgliedern dieser Gruppe. Die Auflistung für die Site-Verzeichnisse würde also ungefähr so ​​aussehen:

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

Weitere Bearbeitungen

Ich habe seitdem festgestellt, dass Sie nicht wirklich einen Benutzer "Webmaster" erstellen müssen, sondern nur eine Gruppe. Die Dateien können dann root gehören: webmasters, dh root ist der Eigentümer, webmasters ist die Gruppe.

Bei der Beantwortung der folgenden Fragen gehören die Dateien, die Apache schreibt, www-data und gruppieren www-data. Diese Dateien sind normalerweise nichts, in das Sie schreiben. Nicht-Mitglieder von www-data haben möglicherweise nur Lesezugriff. Ich denke, dies hängt von den Verzeichnisberechtigungen ab. Wenn Sie mehr als nur gelegentlichen Schreibzugriff benötigen, kann es hilfreich sein, sich der Gruppe hinzuzufügen. Normalerweise machen Sie bestimmte Verzeichnisse für von Apache gespeicherte Inhalte weltweit beschreibbar. Bedenken Sie auch, dass die meisten gemeinsam genutzten Webhosts, auf denen Apache ohne Shell-Zugriff ausgeführt wird, nicht einmal die Möglichkeit haben, Gruppen einzurichten.

Apache kann jedoch auch Dateien lesen, die root gehören. Fast alle Dateien sind für die ganze Welt lesbar, nur nicht beschreibbar. Wenn Sie dies nicht ändern möchten, muss Apache nicht zur Gruppe der Webmaster gehören.

Dies ist alles grundlegende Linux-Setup, nicht wirklich Apache. Apache kümmert sich nur um den Zugriff vom Webserver aus, und das wird durch die Konfigurationsdateien festgelegt. Aus diesem Grund sollte der in meinem Beitrag enthaltene Ubuntu-Dokumentationslink als bessere Quelle angesehen werden als ein öffentliches Wiki.

Im O'Reilly Apache Cookbook heißt es übrigens: "Für Dokumentverzeichnisse wie htdocs, cgi-bin und Symbole müssen die Berechtigungen so festgelegt werden, dass sie für das Entwicklungsmodell Ihrer Website am sinnvollsten sind. Der Benutzer des Webservers sollte jedoch keinesfalls in eines dieser Verzeichnisse oder darin enthaltenen Dateien schreiben können. "

Schließlich ist die Verwendung von ACLs eine gute Möglichkeit, Dateiberechtigungen festzulegen, wenn Sie mehr Kontrolle benötigen. Es kann sogar eine gute Möglichkeit sein, sie die ganze Zeit einzustellen, und ich sollte dies untersuchen.

Marty Fried
quelle
Hi @ marty-fried, danke für die Antwort, es gibt mir viel zu probieren. Re. deine Fragen. Ich habe die Informationen aus verschiedenen Quellen zusammengefügt (daher habe ich sie in meinen eigenen Leitfaden geschrieben) und kann mich nicht an die genaue Quelle erinnern. Obwohl ich diese bestimmte Quelle (Lösung 1) nicht verwendet habe (ich habe sie gerade erst gefunden), gibt sie eine gute Begründung für meine Entscheidung. In der von Ihnen erwähnten Apache-Anleitung wird empfohlen, eine Gruppe mit dem Namen "Webmaster" zu erstellen. Aber wenn ich das täte, wie würde Apache an die schreiben, /var/wwwohne es auch dieser Gruppe hinzuzufügen?
Charles Roper
Und ich tun müssen andere Benutzer Zugang zu geben , /var/wwwso dass ich Gruppe Zugriff auf Gedanken zu machen www-dataund damit sich jeder ein Mitglied dieser Gruppe wäre eine gute Lösung sein. Ich sehe jetzt das Problem, dass Apache in der Lage ist, jede Datei dort zu überschreiben . Angesichts der Tatsache, dass nur 2 Entwickler (darunter ich) Zugriff auf den Code haben, ist er kurzfristig relativ sicher.
Charles Roper
1
Vielen Dank, Marty. Dieser Teil aus dem Apache-Kochbuch hat mich zum Lachen gebracht: "Wenn Sie 12 Personen nach den richtigen Möglichkeiten zum Festlegen von Dateiberechtigungen auf Ihrem Apache-Server fragen, werden Sie ein Dutzend verschiedene Antworten erhalten." Sie haben mir fast alles gegeben, was ich brauche, um jetzt Fortschritte zu erzielen. Vielen Dank für Ihre Zeit. :-)
Charles Roper
1
Ich habe auch ein wenig gelernt, weshalb ich die eingehenden Diskussionen sehr genieße - es hilft normalerweise dabei, einige der verschwommenen Teile zu klären. Ich bin hauptsächlich ein Programmierer, der gebeten wird, Probleme zu beheben und Websites einzurichten, damit ich immer bessere Methoden lerne, um Dinge zu tun. Fühlen Sie sich frei zu fragen, ob es irgendwelche anderen Fragen gibt.
Marty Fried
1
AFAIK, sudo chmod -R g + rw / var / www gewährt 'Gruppen'-Zugriff. Verwenden Sie 'a + rw' für den Weltzugang.
Donal Lafferty
7

Mir ist aufgefallen, dass du es nicht benutzt hast chown.

Um den Besitz der Dateien / Ordner richtig festzulegen, können Sie das gesamte Verzeichnis folgendermaßen festlegen: chown -R www-data:www-data

Dies setzt den Besitz auf Gruppe www-dataund Benutzerwww-data

Sie können dies auch als vorübergehende Problemumgehung tun:

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

Bearbeiten Sie die Datei (en) dann nach Bedarf

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

Achten Sie darauf, den Schalter "-R" zu verwenden, da dadurch auch die Berechtigungen aller Unterdateien und Ordner geändert werden.

664 sind die Apache-Standarddateiberechtigungen und 755 die Standardordnerberechtigungen.

Hoffe das hilft :)

Star

StarBlessed
quelle
Hallo, danke, dass du dir die Zeit genommen hast zu antworten. Es wird sehr geschätzt. Es hilft jedoch nicht wirklich. Das Chowning der Dateien macht ALLE von ihnen nicht änderbar, wenn Sie SFTP verwenden (also das Gegenteil von dem, was ich will!). Ich kann die chmod-Problemumgehung nicht wirklich verwenden, da a) ich keine Berechtigungen für chmod in SFTP habe; b) Ich möchte mich nicht wirklich über SSH anmelden, Berechtigungen ändern, mein SFTP durchführen, zurückwechseln usw .; und c) einige Dateien haben aus Sicherheitsgründen unterschiedliche Berechtigungen, so dass ich ohnehin nicht massenweise chmodieren kann.
Charles Roper
Was ist /var/data? In welchem ​​Verzeichnis schlägt er den Befehl vor chown -R www-data:www-data? Hoffentlich nicht /var/www.
Marty Fried