Trabajo con la administración de sistemas en una universidad y me topé con algo que probablemente es común, pero que me sorprendió bastante.
Todos los directorios public_html y las áreas web se almacenan en afs, con permisos de lectura para los servidores web. Dado que los usuarios pueden tener scripts php en su public_html, esto significa que pueden acceder a los archivos de los demás desde php (¡y los archivos web principales!).
Esto no solo hace que cualquier protección de contraseña .htaccess sea completamente inútil, sino que también permite a los usuarios leer archivos fuente php que contienen contraseñas de bases de datos mysql e información confidencial similar. O si encuentran que otras personas tienen directorios en los que los servidores web tienen acceso de escritura (por ejemplo, para registros personales o para guardar datos de formularios enviados) pueden almacenar archivos en esas cuentas.
Un simple ejemplo:
<?
header("Content-type: text/plain");
print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd");
?>
¿Es este un problema común? ¿Y cómo lo resuelves normalmente?
ACTUALIZAR:
Gracias por el aporte. Desafortunadamente, parece que no hay una respuesta simple. En un gran entorno compartido como este, los usuarios probablemente no deberían tener esta opción. El mejor enfoque que puedo pensar es establecer "open_basedir" en la configuración principal para todos los directorios "public_html", ejecutar suphp y solo permitir php limpio (sin scripts cgi, ejecutando comandos externos con backticks, etc.).
Sin embargo, cambiar la política de esta manera rompería muchas cosas y posiblemente haría que los usuarios agarren sus horcas y nos persigan ... Lo discutiré con mis colegas y lo actualizaré aquí si tomamos una decisión sobre cómo cambiar la configuración.
fuente
open_basedir
solución por debajo de la producción compartida sistemas de alojamiento, pero dividido cada uno en su propio host virtual - No estoy seguro de si funciona para directorios individuales ...Respuestas:
Uno puede usar suphp que ejecuta el script php con el uid de su propietario.
http://www.suphp.org
fuente
check_vhost_docroot
, pero que yo sepa que sólo se aplica a la secuencia de comandos se ejecuta (puedo estar equivocado en eso?)Mi sugerencia sería limitar el acceso de PHP a los archivos (a través de
open_basedir
directivas similares, por host virtual): desea que los usuarios puedan abrir / leer / escribir archivos debajo de su raíz web, y tal vez un nivel por encima (por cero espacio), pero no un directorio donde almacenarían, por ejemplo,htpasswd
archivos.Una estructura de directorios como:
Cumpliría con este requisito:
open_basedir
podría señalarse de/Client/site
forma segura y loshtpasswd
archivos almacenados/Client/auth
(con.htaccess
archivos ohttpd.conf
modificados para apuntar a la ubicación adecuada).Esto evita que sus clientes abran los archivos de otra persona, Y como beneficio, los usuarios malintencionados no pueden leer el contenido
/Client/auth
(o cualquier otra cosa en su sistema, como/etc/passwd
:-)Consulte http://php.net/manual/en/ini.core.php para obtener más detalles sobre la implementación de open_basedir y per-vhost.
fuente
suphp
como lo señala cstamas también es una muy buena idea en un entorno de alojamiento compartido: hay un poco de sobrecarga para configurarlo, pero diría que la ganancia de seguridad vale totalmente la pena. A falta de sandboxing todos sus sitios PHP en algo como una cárcel de FreeBSD o una máquina virtual dedicada que es una de las mayores victorias de seguridad.open_basedir
dentro de una directiva <Directory>, pero creo que debería ser permisible ("pruébalo y mira" - lo peor que puede hacer es no funcionar :)No, no es un problema común porque la mayoría de los hosts compartidos definirían una configuración open_basedir en el archivo htaccess en el directorio public_html de cada usuario (o en el vhost si cada usuario tiene su propio vhost).
por ejemplo, archivo .htaccess:
Pero asegúrese de establecer los permisos correctos en el archivo .htaccess para evitar que el usuario cambie open_basedir (si intenta anularlo en subdir / .htaccess, no debería funcionar, pero probablemente debería probar esto para asegurarse) .
HTH
C.
fuente
AFS ignora los permisos simples de usuario de Unix. suPHP ejecuta un setuid antes de ejecutar el programa php, pero eso no le da al proceso los tokens kerberos necesarios para acceder a AFS y estar restringido a sus permisos. SuPHP tendría que modificarse de alguna manera para obtener esos tokens antes de que pudiera presentarse al sistema AFS como ese usuario. Que yo sepa, eso no se ha hecho. (De hecho, encontré esta pregunta al ver si alguien más lo había hecho).
fuente