sesiones php: ¿es posible activar un script de servidor ejecutado por un usuario DIFERENTE que www-data?

sesiones php: ¿es posible activar un script de servidor ejecutado por un usuario DIFERENTE que www-data?

Estoy ejecutando un sitio php+mysql en un servidor en la nube lámpara ubuntu (amazon ec2). Yo uso sesiones de php. el usuario de apache php se llama www-data.

para cada sesión (SID), necesito crear una carpeta temporal que sea un subdirectorio de www y que tenga el ID de la sesión como nombre (impredecible, por lo tanto, no se puede crear previamente). por ejemplo: /var/www/fileStore/s35S10nT3Mp/.

Más adelante accederé a los archivos de estas carpetas desde una función de JavaScript (del lado del cliente).

Estoy trabajando bajo los supuestos de que:

  1. cualquier cosa ejecutada (o llamada) por el código php se ejecutará bajo el usuario www-data
  2. JavaScript del lado del cliente no puede acceder a un subdirectorio FUERA de www (por ejemplo: /var/outsideFileStore/s35S10nT3Mp/, donde webroot = public_html = /var/www)

Me encantaría equivocarme en uno o ambos de los puntos anteriores, ya que resolvería mi problema sin más preámbulos. en caso de que no me equivoque en ninguna de mis suposiciones:

Tengo un problema de seguridad al otorgar al usuario permisos de escritura www-data (necesarios para que php mkdir la nueva carpeta) en un subdirectorio de www, porque eso deja el servidor y los datos en estas carpetas demasiado expuestos.

Me gustaría saber si una sesión de PHP puede activar (o llamar) un script/proceso de servidor que se ejecuta bajo otro usuario (que recibiría permiso de escritura en /var/www/fileStore/), no en www-data. este proceso luego crearía (y recolectaría basura) estas carpetas temporales.

Corolario: en caso de que esto no se pueda hacer en Apache, ¿sería útil Tomcat (si ejecutara php en Java en lugar de http_server)?

Corolario 2: ¿Qué pasa si ejecuto una conexión de socket (desde php) a un servidor de socket (que tengo en C++) y el servidor de socket (otro usuario, obviamente) hace la creación del archivo? ¿Es esto excesivo?

Respuesta1

Puedes usarsetuid()funcionalidad para ejecutar scripts y otras cosas como otro usuario.

Utilizo el siguiente script contenedor para ejecutar otro script como un usuario diferente al www-datade un propósito específico en un servidor 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;
}

Simplemente llame make_stats.cgidesde Apache y el script proporcionado en el archivo anterior debe ejecutarse como el usuario especificado en el archivo anterior.

información relacionada