La semana pasada encontré que había cometido un error de seguridad bastante grave y dejé visible a todo el mundo mi archivo wp-config.php. Esto es malo, porque contiene las credenciales del base de datos y algunas claves secretas generadas en la configuración inicial (que he cambiado después de arreglar lo de la seguridad). Decidí que sería una buena idea escribir una guía pequeña para una configuración mejor, que aunque no sea una guía completa, puede que te haga capaz de evitar los errores que he cometido y posiblemente de informarme de otra error que no he notado en esta configuración. Exploré algunas otras configuraciones, pero esta me parece bien.
Mientras probando esta configuración encontré la utilidad UNIX “find” que me parece algo muy útil. En esta ocasión lo usé para cambiar las permisiones de algunos grupos de archivos y directorios, y he dado algunos ejemplos por debajo. Creo que es algo que voy a utilizar con frecuencia en el futuro y que tendrá usos que ya no he descubierto.
Antes de empezar voy a dar unos avisos:
- Tu distribución (si lo estás sirviendo desde una máquina Linux) podría tener un paquete de WordPress que hace más fácil la instalación, y (al menos con Debian) que recibe actualizaciones rápidas y convenientes desde el sistema de gestión.
- Debes conocer algunas partes del sistema Linux, incluyendo Permisiones de Archivos, el Servidor Web Apache, y varias otras herramientas.
- Se te equivocas con las permisiones, como hice yo, puede que dejes visible a todo el mundo tus archivos de configuración, que contienen las credenciales del base de datos y las claves secretos que generas durante la configuración inicial.
Aparte de esos asuntos el proceso es bastante sencillo. Como estoy usando Debian (estable, que fue Lenny a la hora de escribirse) refiero a algunas cosas especificas de Debian, como el sistema de gestión apt. Bueno, allá vamos.
Primero, tendrás que instalar los módulos necesarios (ejecutar este como root):
apt-get install apache2 php5 mysql-server libapache2-mod-suphp
Con aquellos paquetes instalados, puedes instalar y completar la configuración inicial de WordPress. No voy a duplicar la guía oficial porque explique todo lo necesario:
Que yo sepa, las instrucciones detalladas solo están disponibles en inglés, pero aquí están (ojalá que que algún día las traduzcan a castellano):
http://codex.wordpress.org/Installing_WordPress#Detailed_Instructions
Una vez que hayas extraído WordPress (personalmente, yo lo extraje en el directorio home ~/wordpress/ y añadí una configuración VirtualHost en el directorio sites-available de Apache con el directorio apropiado como el DocumentRoot, hay muchas guías para esto si haces una búsqueda rápida) debes tratar de arreglar las permisiones. Para esto, yo elegí usar la utilidad Linux find. No garantizo que esta es la secuencia de comandos completa y probablemente sería una buena idea peinar la instalación a fondo por si acaso he olvidado un comando (inicialmente lo hice incorrectamente y me costó bastante tiempo arreglar el caos que había creado).
find ~/wordpress/ -type d -exec chmod 755 {} \;
find ~/wordpress/ -type f -exec chmod 644 {} \;
find ~/wordpress/ -type f -name "*.php" -exec chmod 600 {} \;
Después de haber seguido la guía de instalación WordPress tendrás un base de datos que funciona (yo recomiendo que uses phpmyadmin, especialmente si prefieres usar un GUI) y un archivo de configuración. Ahora lo importante. Tienes que configurar suPHP, y esto es verdaderamente trivial. Primero, habilita el modulo:
a2enmod suphp
Luego, edita el archivo de configuración /etc/suphp/suphp.conf para que contenga o la línea:
check_vhost_docroot=true
o la línea:
docroot=/path/to/your/docroot/
El primero permitirá que suPHP se usa en cualquier DocumentRoot definido en el VirtualHost, el segundo hará que suPHP solo funciona en el DocumentRoot especificado.
Finalmente, hay que editar el archivo /etc/apache2/apache2.conf para deshabilitar el mod_php estandarte. Personalmente yo uso la configuración por debajo porque no me sirve el uso de mod_php dentro de/home (pero si quieres usarlo, puedes usar php_flag en lugar de php_admin_flag para que puedas habilitarlo para los otros sitios en tu servidor):
<Directory /home> php_admin_flag engine off </Directory> <Directory /home> AddHandler application/x-httpd-php .php .php3 .php4 .php5 .phtml suPHP_AddHandler application/x-httpd-php suPHP_Engine on </Directory>
¡Y ya está! Si he omitido algún punto crucial, por favor dímelo en un comentario para que lo pueda añadir.
Una ocurrencia tardía: Debería haber explicado lo que hace suPHP. Cuando se ejecuta un archivo PHP, se ejecuta como el usuario a que pertenece. Para mí, la ventaja principal es que el archivo de configuración no tiene que ser legible para cualquiera persona salvo yo. Posiblemente algo más importante para el entorno de un servidor compartido es que los archivos PHP solo se ejecutan con las permisiones del usuario a que pertenecen. Esto significa, con tal que tengas limitaciones razonables establecidos para el usuario, que no podrá causar más daño que podría desde su consola (y quizás por esto puedas ver la ventaja de php_admin_flag, que no puede invalidar).