ich betreibe eine PHP+MySQL-Site auf einem LAMP-Ubuntu-Cloud-Server (Amazon EC2). Ich verwende PHP-Sitzungen. Der Apache-PHP-Benutzer heißt www-data.
Für jede Sitzung (SID) muss ich einen temporären Ordner erstellen, der ein Unterverzeichnis von www ist und die Sitzungs-ID als Namen hat (unvorhersehbar, kann daher nicht vorab erstellt werden). Beispiel: /var/www/fileStore/s35S10nT3Mp/.
Ich werde später über eine JavaScript-Funktion (clientseitig) auf Dateien in diesen Ordnern zugreifen.
Ich gehe davon aus, dass:
- alles, was vom PHP-Code ausgeführt (oder aufgerufen) wird, wird unter dem Benutzer www-data ausgeführt
- Clientseitiges JavaScript kann nicht auf ein Unterverzeichnis AUSSERHALB VON www zugreifen (zum Beispiel: /var/outsideFileStore/s35S10nT3Mp/, wobei webroot = public_html = /var/www)
ich würde mich freuen, wenn ich bei einem oder beiden der oben genannten Punkte falsch liege, denn dann wäre mein Problem ohne weiteres gelöst. Falls ich mit keiner meiner Annahmen falsch liege:
ich habe ein Sicherheitsproblem, wenn ich dem Benutzer Schreibberechtigungen für WWW-Daten in einem Unterverzeichnis von WWW gebe (erforderlich, damit PHP den neuen Ordner mit MKDIR verwenden kann), weil dadurch der Server und die Daten in diesen Ordnern zu sehr gefährdet sind.
ich würde gerne wissen, ob eine PHP-Sitzung ein Serverskript/einen Serverprozess auslösen (oder aufrufen) kann, der unter einem anderen Benutzer ausgeführt wird (der Schreibberechtigung für /var/www/fileStore/ erhalten würde), nicht für www-data. Dieser Prozess würde dann diese temporären Ordner erstellen (und den Garbage Collect durchführen).
Schlussfolgerung: Falls dies unter Apache nicht möglich ist, würde Tomcat helfen (wenn ich PHP unter Java statt unter http_server ausführe)?
Folgerung 2: Was wäre, wenn ich eine Socket-Verbindung (innerhalb von PHP) zu einem Socket-Server (den ich in C++ habe) ausführe und die Dateierstellung vom Socket-Server (offensichtlich einem anderen Benutzer) durchführen lasse? Ist das übertrieben?
Antwort1
Sie könnensetuid()
Funktionalität zum Ausführen von Skripten und anderen Dingen als ein anderer Benutzer.
Ich verwende das folgende Wrapper-Skript, um ein anderes Skript als anderer Benutzer als www-data
für einen bestimmten Zweck auf einem Apache-Webserver auszuführen.
suid_wrapper.c
:
#include <stdlib.h>
/*
* C wrapper to run script as other user from Apache.
*
* Instructions:
* Run as root:
* gcc suid_wrapper.c -o make_stats.cgi
* chmod a+s make_stats.cgi
*/
// User ID and Group ID for wanted user.
int uid = 503;
int gid = 506;
// Path to script to be executed as above user.
const char* scriptpath = "/home/user/public/stats/make_stats.sh";
int main()
{
// setgid() must be before setuid(); otherwise one has forsaken the privilege to change group.
setgid(gid);
setuid(uid);
system(scriptpath);
return 0;
}
Rufen Sie einfach make_stats.cgi
von Apache auf und das in der obigen Datei angegebene Skript sollte als der in der obigen Datei angegebene Benutzer ausgeführt werden.