Wenn ich Ihre Frage richtig verstehe, beginnt Ihr Problem mit der Struktur des Linux-Berechtigungs-/Benutzer-Frameworks. Somit ist der Benutzer, der den Apache-Prozess besitzt, derjenige, der Verzeichnisse und Dateien erstellt, wenn er Ihr Skript ausführt.
Wenn Sie eine Benutzertrennung für Skripte benötigen, z. B.:Sie haben unterschiedliche Verzeichnisse für verschiedene (virtuelle) Hosts auf Ihrem Server und Sie möchten nicht, dass das Skript eines Hosts auf Daten eines anderen Hosts auf demselben (Apache-)Server wirkt, dann sollten Sie 'mpm_itk_module' anstelle des häufigeren 'mpm-prefork'-Apache verwenden.
Damit können Sie den Benutzer / die Gruppe definieren, den Apache verwendet, wenn er Skripte ausführt und z. erstellt Verzeichnisse nur durch diesen Befehl für jeden virtuellen Host-Eintrag in der httpd.conf:
<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>
Wenn Sie wirklich verschiedene Verzeichnisse aus EINER Skriptausführung erstellen möchten, muss der Apache-Prozess root.root gehören, und dann muss das Skript die Berechtigungen und Eigentümer für jedes Verzeichnis so festlegen, wie Sie es möchten.
Aber es ist niemals eine gute Idee, selbst die besten Skripte auf einem Webserver als root auszuführen, da Sie möglicherweise an kein Risiko denken.
Die Benutzer/Rechte-Trennung durch vhosts scheint mir ein viel sichererer Weg zu sein.
Ein weiterer Punkt - nur PHP - ist suPHP -> http://www.suphp.org
BEARBEITEN:
Ok, ich habe mir Ihre Seite angesehen und selbst wenn ich kein Spanisch spreche, sieht es so aus, als hätten Sie nur eine Webseite, die für verschiedene Benutzer agiert, die immer über diese Webseite kommen. Wo ist also die Notwendigkeit einer Benutzertrennung bei Linux-Dateisystemberechtigungen? Sie können alles durch Ihre Anwendung einschränken, ohne dass Dateisystembenutzer erforderlich sind. Auch wenn Sie z.B. zusätzlicher FTP-Zugriff - beschränken Sie ihn z.B. mit proftpd hat es einen eigenen Chroot-Mech für verschiedene Benutzer.
Sie sollten sich nur dann um Dateisystemrechte kümmern müssen, wenn Sie nicht kontrollieren können, wer was ausführt. Das ist ein häufiges Problem auf einem Multidomain-Host, das Sie mit dem von mir erwähnten mpm_itk_module lösen könnten.
Vielleicht solltest du deine Situation etwas genauer beschreiben?
BEARBEITEN 2:
Wie im Kommentar vorgeschlagen, wenn Sie Apache NUR verwenden, um den Benutzern Zugriff auf die Dateien zum Hochladen/Manipulieren zu geben, dann legen Sie die Dateien einfach außerhalb (!) des Dokumentstammbaums von Apache und erstellen Sie eine einfache Datenbank, um zu wissen, welche Datei wem gehört Benutzer:
user a | file parentdir/filename
Dies könnte eine einfache Tabelle sein und Ihr PHP-Code gibt dem Benutzer aus der Datenbank eine Liste, welche Datei er sehen/manipulieren kann, und Ihr Code erledigt die Arbeit wie von der Benutzeraktion vorgesehen.
Solange Sie dem Benutzer keinen Zugriff auf die Dateien durch andere Dienste (ftp, ssh usw.) gewähren, müssen Sie überhaupt nicht mit Linux-Benutzerrechten arbeiten. Achten Sie nur darauf, die Dateien außerhalb des Dokumentenstammverzeichnisses des Servers zu platzieren, sodass nur Ihr PHP-Code Zugriff auf die Dateien mit den Rechten des Apache-Benutzers Ihres Servers hat.
BEARBEITEN 3:
Haha, jetzt endlich habe ich Ihr Problem verstanden, nachdem ich einen ähnlichen Beitrag von Ihnen gelesen habe:(Wie kann ein Apache-Benutzer Dateien schreiben, wenn er Berechtigungen dazu hat?) In diesem Fall (mit WIRKLICH anonymen Benutzern auf Ihrer Webseite) haben Sie KEINE Chance dazu das überhaupt lösen. Jeder Besucher wird ohne Authentifizierung als derselbe behandelt. Und wie ich in meinem letzten EDIT angenommen und in dem ähnlichen Beitrag kommentiert habe:überhaupt keine Notwendigkeit, mit Linux-Dateiberechtigungen umzugehen.
IHRE LÖSUNG;) :Sie müssen die Dateimanipulation in einer Sitzung mit Sitzungs-IDs durchführen, während der Benutzer Ihre Seite besucht. Ihr Code muss also die Beziehung zwischen dem Besucher (der Sitzungs-ID) und der Datei, die er mit dieser Sitzungs-ID hochgeladen hat, handhaben. Die Verwendung einer Sitzungs-ID, die gültig ist, solange der Besucher online ist, ist der beste Weg, dies zu tun. Und wieder - keine Notwendigkeit für Dateisystemberechtigungen....;)
Der zweite Weg ist mit authentifizierten Benutzern, wie zuvor vorgeschlagen:Erstellen Sie eine db-Tabelle mit Benutzern/Passwörtern, um sich bei der Webseite (nicht beim Server) anzumelden, und einer weiteren Tabelle, die die Benutzer-/Dateibeziehungen enthält. Arbeiten Sie dann, nachdem er sich bei der Webseite angemeldet hat, wieder mit Sitzungen, um dem Benutzer den Zugriff auf bereits hochgeladene Dateien zu ermöglichen/manipulieren.
Ich kann, dass Sie Apache mit mod_php ausführen. Dann bedeutet dies, dass Ihre PHP-Instanz unter einer Apache-Instanz arbeitet und Apache USER und GROUP hat. Sie können Ordner erstellen und den Besitzer dieses Ordners ändern, aber der Besitzer muss ein Benutzer in Ihrem System sein (nicht Apache oder derselbe virtuelle Benutzer).
Aber Sie können in jedem Verzeichnis eine Datei zum Beispiel ".permitions" speichern und in diese Datei den virtuellen Eigentümer einfügen. Als nächstes müssen Sie jeden Schreibversuch (Löschen, Umbenennen usw.) in dieses Verzeichnis filtern und Ihren virtuellen Benutzer und den Benutzer vergleichen, der in der .permitions-Datei gespeichert ist.
Beispielklasse (nicht vollständig, aber mehr als genug, um die Idee zu verstehen):
class UserDirs {
private $path='/home/vusers';
public function mkdir($user){
$d = $this->path.'/'.md5($user);
mkdir($d);
file_put_contents($d."/.owner",$user);
}
public function checkOwner($user, $dirname){
$f = $dirname."/.owner";
$virtual_owner = file_get_contents($f);
return $user === $virtual_owner;
}
}
$d = new UserDirs()
$d->mkdir("foo","bar");
echo $d->checkOwner("foo1","bar") === true ? "OK":"FAIL";
echo $d->checkOwner("foo","bar") === true ? "OK":"FAIL";
Sie können alles, was Sie in dieser Klasse benötigen, um mit UserDirs zu arbeiten, kapseln und die Klasse je nach Ihren Anforderungen erweitern.
Ihre Benutzer haben keine Systemkonten. Es ist wahrscheinlich auch nicht möglich, diese Konten zu erstellen. Daher würde ich empfehlen, all dies über die Web-Benutzeroberfläche zu verwalten.
Fahren Sie fort, Ihre Verzeichnisse so zu erstellen, wie Sie es gewohnt sind. Die Berechtigungen sind in Ordnung. Ihre Benutzeroberfläche muss sich jedoch ändern, um nur das Verzeichnis oder die Dateien dieses Benutzers anzuzeigen. Ich nehme an, Sie haben eine Datenbank, die mit dieser Seite verknüpft ist. Ordnen Sie dem Benutzer die Benutzernamen und den zufällig generierten Verzeichnisnamen zu. Wenn jemand versucht, zum direkten Pfad zu wechseln, und er NICHT der Benutzer ist, der mit diesem Verzeichnis verknüpft ist, werfen Sie ihn zurück zum Anmeldebildschirm.
Zur Veranschaulichung habe ich ein Konto mit dem Namen test
erstellt und erhielt vermutlich ein eindeutiges Verzeichnis. Wenn ich mich abmelde, sollte ich nicht in der Lage sein, dieses Verzeichnis zu besuchen, weil Ihr Code das sehen würde
- Ich bin nicht angemeldet und habe daher keinen Zugriff auf dieses Verzeichnis
Wenn ich mich als test2
anmelden würde und besuchen Sie das Verzeichnis von test
, Ihr Code sollte das erkennen
- Ich bin nicht der Eigentümer des besuchten Verzeichnisses und sollte daher entsprechend weitergeleitet werden.
Sie müssen eine Funktion hinzufügen, die das Verzeichnis überprüft, das der Benutzer besucht, und es mit dem Verzeichnis vergleicht, das dem Benutzer zugeordnet ist. Wenn beide übereinstimmen, erlauben Sie ihnen, fortzufahren. Wenn sie nicht übereinstimmen, leiten Sie den Benutzer um.