Problema del open_basedir en servidores con Plesk

  • Por
Solución a un problema en dominios alojados en servidores con el panel de control Plesk, relativo a la directiva de PHP open_basedir.
Estamos utilizando un nuevo servidor que tiene soporte para PHP 5. (Hasta el momento estábamos trabajando con PHP 4, pero ya era hora de cambiar). Como siempre, migrar a un nuevo servidor trae sus problemillas, pero afortunadamente con la ayuda del soporte técnico y con la documentación que se encuentra por Internet, se van arreglando.

En este artículo quiero explicar un error que hemos encontrado a la hora de configurar el dominio, que luego he visto que es común a muchas personas que tienen el panel de control Plesk como gestor de los recursos del servidor. Así pues voy a intentar expresar el problema y la solución que hemos encontrado.

El problema con open_basedir

Plesk tiene una configuración propia de la directiva de PHP open_basedir (que se define en el php.ini). Por la configuración de Plesk de open_basedir, sólo se pueden incluir archivos que cuelguen del directorio de publicación del dominio, es decir el directorio httpdocs del dominio.

El estado de open_basedir configurado por Plesk de manera predeterminada es el siguiente:

open_basedir = "/var/www/vhosts/eldominiotuyo.com/httpdocs:/tmp"

Por esa directiva no se pueden incluir archivos (con la función include o require de PHP) que estén en otras carpetas o subcarpetas que cuelguen de las marcadas en el open_basedir.

Nosotros tenemos algunas carpetas que contienen códigos fuera del directorio de publicación y no se estaban pudiendo incluir. Por eso nos estaba saliendo un error PHP como este:

open_basedir restriction in effect. File(./../directorio-fuera-httpdocs/archivo.php) is not within the allowed path(s): (/var/www/vhosts/midominio.com/httpdocs:/tmp)

Luego he visto que este problema lo tienen también usuarios que tengan códigos incluidos en frameworks para PHP como PEAR.

Solución al problema: configurar Plesk

La primera aproximación a la solución fue, como se pensará, modificar el archivo PHP.ini. De hecho, es lo que pensaba que lo arreglaría. Para cambiar la directiva open_basedir del php.ini. Pero los cambios, no surtieron efecto. También probé cambiando la directiva include_path, pero tampoco arregló nada.

Una vez consultado con el servicio técnico de nuestro proveedor, nos aconsejaron mover todas las carpetas al directorio de publicación, pero eso no es posible, por diversas razones. Pero nos dieron la pista que el problema estaba relacionado con Plesk.

Finalmente buscando por Pear y Pesk en Google apareció un artículo muy interesante en una página en ingles: HOWTO: Enable PEAR/Set open_basedir

En ese artículo está expresado paso a paso lo que se tiene que hacer, que voy a resumir en español, para los lectores de desarrolloweb.com a los que les pase lo mismo.

Existe un archivo que Plesk utiliza para configurar cada dominio, de modo que no conviene tocar el php.ini, porque eso afectaría a todo el servidor (y no siempre, porque algunas directivas, como open_basedir, luego las sobreescribe Plesk en otros archivos aparte y por mucho que se toquen en el php.ini no tendrá ningún efecto).

Hay un sitio donde se deben configurar los cambios del php.ini, específicos para cada dominio alojado. En mi caso ese archivo de configuración no estaba creado, por lo que he tenido que crearlo. El archivo de configuración específico para cada dominio está en el directorio

/var/www/vhosts/midominio.com/conf

Y el archivo que hay que crear allí, o modificar si es que ya existe es:

vhost.conf

Para que funcione, el contenido del archivo que he colocado es el siguiente:

<Directory "/var/www/vhosts/midominio.com/httpdocs">
php_admin_value open_basedir "/var/www/vhosts/midominio.com/httpdocs:/tmp:/var/www/vhosts/midominio.com/directorio_includes
php_admin_value display_errors On
</Directory>


Se trata simplemente de definir el open_basedir marcando todos los directorios donde hay archivos que se pretenden incluir desde PHP. (Con incluir un directorio te permite incluir archivos de todos los subdirectorios que haya dentro)

En el código anterior puedes ver que hemos modificado otro parámetro del PHP:

display_errors On (Esto es para poder ver los errores directamente en la página, en vez del log de errores, que es más cómodo por lo menos durante las pruebas y hasta migrar definitivamente el dominio)

Ahora bien, ya sabemos donde tocar para configurar directivas PHP del php.ini específicas para un dominio alojado. Podremos definir todas las directivas que se necesiten. Por ejemplo, otra cosa que se puede necesitar cambiar es anular el safe_mode para un dominio en concreto y eso se puede hacer desde este mismo archivo con la línea:

php_admin_value safe_mode Off

Para que los cambios tengan efecto aun tenemos que realizar un par de pasos.

Se trata primero de decirle a Plesk que actualice la configuración de un dominio. Esto se hace con el comando:

/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=midominio.com

Ahora también tendremos que reiniciar el apache, que se puede hacer con el comando:

/etc/init.d/httpd restart

O bien con el comando:

service httpd restart

Esto es todo, ahora debería funcionar. Esperamos que los lectores de DesarrolloWeb.com tengan la misma suerte. A nosotros nos ha ido bien!

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Alejandro Hdz.

23/1/2009
hola que tal... estoy siguiendo este link y yo tambien tengo un problema similar sin embargo mi problema radica en que no puedo accesar a la carpeta conf para poder realizar cambios en el php.ini del servidor remoto... la carpeta esta con privilegios de root y no de mi dominio...ingreso via FTP y el acceso es denegado, espero puedan decirme que onda un salu2

Alejandro hdz.

02/2/2009
BUENO al final pude resolver mi problema... encontre que PHP brinda una instruccion para cambiar la mayoria de las directivas del PHP.INI desde el mismo script, los cambios duran solo mientras el script se ejecuta y se restablecen... yo queria cambiar la directiva de send_mail para enviar el correo contactanos y me funciono hasta cambiando 3 veces el destinatario dentro del mismo scrpti :D.... bueno esta solucion fue la mejor por que es un servidor compartido... sin embargo hay directivas que no pueden ser accesadas por el mismo PHP... los de mi servicio hosting me ofrecieron cambiar la directiva siempre y cuando no afecte a terceros por que es un servidor compartido pero no hubo necesidad... sin embargo si noto esa carpeta conf que mencionan y no tengo el acceso... al parecer estoy suponiendo que los de mi servidor no lo tienen bien configurado... por que como se dice o entiendo dicha carpeta solo configura PHP con un archivo .conf y que solo surte efecto sobre mi dominio sin alterar a terceros... entonces ¿por que no la tengo accesible y tiene privilegios root en vez de propios... ? en deinitiva creo esta mal configurado por los proveedores de mi hosting... SALU2

Eloy Ruiz

29/4/2009
Otra posible solución
Yo también he tenido el mismo problema recientemente con el open_basedir en un Plesk pero resultaba únicamente en un warning.

Lo grave venía cuando el resto de includes/requires fallaban y acababan en un fatal error. En este caso ya no es problema del open_basedir sino del include_path, cosa que podemos solucionar con la función set_include_path(), pasándole los parámetros que sean necesarios, o con la alternativa del ini_set('include_path', $include_path).

Si a alguien le sirve de ayuda, la siguiente sentencia me sirvió de mucho:

ini_set('include_path', $_SERVER['DOCUMENT_ROOT'].":.");

Un saludo.

Lluis

08/7/2009
Muchas gracias
Ha sido de gran ayuda!!!

David Torres venzuela

05/12/2009
Me interesa tu escript o como hicistes???
Saludos amigo! me interesa tu comentario y mucho por que tengo el mismo problema en mi web y estoy en un hosting compartido, necesito enviar email y no puedo como hago por que me dice el administrador que es mi script que lo tengo que adaptar a el ini.php de ellos ya que tienen el open_basedir activado ya que deshabilitar el mismo seria una vulnerabilidad al servicio. Este es mi correo por favor revista.mirame@hotmail.com

BUENO al final pude resolver mi problema... encontre que PHP brinda una instruccion para cambiar la mayoria de las directivas del PHP.INI desde el mismo script, los cambios duran solo mientras el script se ejecuta y se restablecen... yo queria cambiar la directiva de send_mail para enviar el correo contactanos y me funciono hasta cambiando 3 veces el destinatario dentro del mismo scrpti :D.... bueno esta solucion fue la mejor por que es un servidor compartido... sin embargo hay directivas que no pueden ser accesadas por el mismo PHP... los de mi servicio hosting me ofrecieron cambiar la directiva siempre y cuando no afecte a terceros por que es un servidor compartido pero no hubo necesidad... sin embargo si noto esa carpeta conf que mencionan y no tengo el acceso... al parecer estoy suponiendo que los de mi servidor no lo tienen bien configurado... por que como se dice o entiendo dicha carpeta solo configura PHP con un archivo .conf y que solo surte efecto sobre mi dominio sin alterar a terceros... entonces ¿por que no la tengo accesible y tiene privilegios root en vez de propios... ? en deinitiva creo esta mal configurado por los proveedores de mi hosting... SALU2

uno

24/10/2012
cuidado...
Ojo con esto que yo me he cargado el panel, siguiendo estrictamente las instrucciones:

012-10-24 21:45:00: (mod_fastcgi.c.2746) FastCGI-stderr: PHP Warning: Unknown: apc failed to locate auth.php3 - bailing in Unknown on line 0
PHP Fatal error: Unknown: open_basedir restriction in effect. File(/usr/local/psa/admin/auto_prepend/auth.php3) is not within the allowed path(s): (/usr/bin) in Unknown on line 0
PHP Fatal error: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
PHP Fatal error: Unknown: Failed opening required 'auth.php3' (include_path='/usr/local/psa/admin/plib:/usr/local/psa/admin/javascripts:/usr/local/psa/admin/plib/locales:/usr/local/psa/admin/auto_prepend:/usr/local/psa/admin/htdocs/domains/databases/phpMyAdmin:/usr/local/psa/admin/htdocs/domains/databases/phpPgAdmin') in Unknown on line 0