Sessions php – est-il possible de déclencher un script de serveur exécuté par un utilisateur DIFFERENT que www-data?

Je gère un site php + mysql sur un serveur de cloud computing ubuntu (amazon ec2). J'utilise les sessions php. L'utilisateur apache php s'appelle www-data.

Pour chaque session (SID), je dois créer un dossier temporaire qui est un sous-répertoire de www et que l'ID de session est son nom (imprévisible, ne peut donc pas être pré-créé). Par exemple: / var / www / fileStore / s35S10nT3Mp /.

Je vais accéder plus tard aux fichiers dans ces dossiers à partir d'une fonction javascript (côté client).

Je travaille selon les hypothèses selon lesquelles:

  1. Tout ce qui a été exécuté (ou appelé) par le code php sera exécuté sous l'utilisateur www-data
  2. Javascript côté client ne peut pas accéder à un sous-répertoire OUTSIDE www (par exemple: / var / outsideFileStore / s35S10nT3Mp /, où webroot = public_html = / var / www)

J'aimerais avoir tort sur l'un ou l'autre des éléments ci-dessus, car cela résoudrait mon problème sans plus tarder. Dans le cas où je ne me trompe pas sur l'une de mes hypothèses:

J'ai un problème de sécurité en donnant aux utilisateurs des autorisations d'écriture www-data (nécessaire pour php to mkdir le nouveau dossier) dans un sous-répertoire de www, car cela laisse le serveur et les données dans ces dossiers trop exposés.

Je voudrais savoir si une session php peut déclencher (ou appeler) un script / processus de serveur qui s'exécute sous un autre utilisateur (qui recevrait une autorisation d'écriture dans / var / www / fileStore /), et non www-data. Ce processus créerait (et ramasserait) ces dossiers temporaires.

Corollaire: dans le cas où cela ne peut pas être fait sous apache, Tomcat aiderait-il (si je corrigeait php sous java par opposition à http_server)?

Corollaire 2: que faire si je dirige une connexion socket (de l'intérieur de php) vers un serveur socket (ce que j'ai en c ++) et que le serveur socket (un autre utilisateur, évidemment) fait-il la création du fichier? Cette overkill?

Vous pouvez utiliser la fonctionnalité setuid() pour exécuter des scripts et d'autres choses comme un autre utilisateur.

J'utilise le script wrapper ci-dessous pour exécuter un autre script en tant qu'utilisateur différent que www-data pour un but spécifique sur un serveur web Apache.

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; } 

Il suffit d'appeler make_stats.cgi partir d'Apache et le script donné dans le fichier ci-dessus doit être exécuté comme l'utilisateur spécifié dans le fichier ci-dessus.