Tuesday, November 27, 2012

SSL en IP compartida y suPHP en WHM

Otro poste seguidito para gestionar servidores virtuales (VPS) con WHM. Este post está relacionado con:

  • SSL en VPS con WHM
  • SSL con suPHP
  • Error 500 Internal Server Error despues de instalar certificado SSL al correr scripts PHP
  • Error "Mismatch between target UID (99) and UID (xxx) of file"
  • Error al correr scripts PHP en un servidor SSL con IP compartida (shared IP)

En este post voy a compartir como hacer que un dominio corra SSL con una IP compartida mientras se usa suPHP.

Actualmente tengo un servidor VPS corriendo suPHP por razones de seguridad. Para los que no saben, suPHP ejecuta cada script como su propietario en vez de como el usuario "nobody" (que se usa cuando PHP corre como móduilo DSO de Apache), previniendo que un script tenga acceso a los archivos de otros usuarios en el sistema.

Las versiones recientes de cPanel/WHM previenen mas o menos configurar un dominio con SSL (https) en una dirección IP compartida. Si quieres correr SSL en un dominio sobre una IP compartida, el certificado y la llave (key) deben ser configuradas como el usuario "nobody". El dominio funcionará bien, pero si corres un script PHP en ese dominio, no funcionará porque intenta correr como el usuario "nobody" y suPHP lo bloquea, mandando un error "500 Internal Server Error".

Así que lo que hay que hacer es lo siguiente (recuerda que necesitas acceso a WHM y vía SSH como root):

1) Ve a WHM y da click en "Install an SSL Certificate and Setup the Domain". Ahí puedes seleccionar a cargar tus archivos de cerificado (.crt y .key). Hay muchos tutoriales que muestran cómo generar certificados autofirmados (self-signed) inclusive desde WHM, o puedes obtener un certificado desde un CA.

2) En el campo "Domain" escribe el nombre de dominio que quieres configurar con SSL. Como ejemplo, usaremos el dominio "seguro.domino.net", que es propiedad del usuario de cPanel "usuariochido".

3) En el campo "User", escribe "nobody" (sí, nobody - sin comillas)

4) En el campo "IP Address" escribe tu dirección IP compartida (si no se autollenó el campo)

5) Pega o carga tus archivos .CRT y .KEY

6) Da click en Submit

Ya tienes tu dominio listo. Ahora te puedes conectar a https://seguro.dominio.net y va a funcionar, excepto por los scripts PHP. Para hacer correr los scripts PHP con suPHP en ese dominio con SSL, hay que hacer lo siguiente:

1) Conéctate vía SSH a tu servidor como root (u otro usuario con los permisos adecuados)

2) Cámbiate al directorio /var/cpanel/userdata/nobody, y escribe "ls" para obtener el listado del directorio

3) Debes de ver un archivo llamado "seguro.dominio.net_SSL" (con el dominio real, por supuesto)

4) Mueve ese archivo a /var/cpanel/userdata/usuariochido. Para eso puedes hacer:

mv ./seguro.dominio.net_SSL /var/cpanel/userdata/usuariochido/seguro.dominio.net_SSL

(Recuerda que estamos usando seguro.dominio.net y usuariochido como ejemplos; debes reemplazarlos con el dominio y nombre de usuario verdaderos)

5) Edita el archivo /var/cpanel/userdata/usuariochido/seguro.dominio.net_SSL usando un editor como nano o vi. Debes cambiar estas líneas:

documentroot: /home/usuariochido/public_html/seguro
homedir: /home/usuariochido
user: usuariochido
group: usuariochido

6) Ejecuta los siguientes comando para reconfigurar apache y reiniciarlo:

/scripts/rebuildhttpdconf
service httpd restart

O puedes saltarte "service httpd restart" y reiniciar Apache desde WHM, si prefieres.

7) Pruébalo.

Espero que esta info sea de ayuda =)

Reloj de sistema en VPS con WHM/cPanel no está sincronizado

Este post va relacionado con:


  • NTP (Network Time Protocol) y su demonio NTPD
  • WHM y cPanel Time
  • Dovecot error "time just moved backwards"
  • Tiempo del servidor fuera de sincronización
  • Servidor VPS Linux (CentOS, WHM) con error de tiempo
  • Problema Time Drift, Time Skew, Clock Drift o Clock Skew


Hace unos días que me conseguí un VPS corriendo CentOS con WHM. Desde el principio noté que el IMAP (Dovecot) se reiniciaba con el mensaje de error "Time just moved backwards". Esto pasaba siempre después de realizar una sincronización de tiempo o cambiar la zona horaria.

Resulta que hay un efecto llamado "Time Skew" o "Time Drift" que ocurre en algunos sistemas (sobretodo VPS) que hace que el tiempo vaya más rápido de lo normal. Día tras día encontraba que el reloj del servidor VPS estaba adelantado unos 25 minutos. Esto es un problema crítico.

Después de bastante búsqueda, encontré dos posibles soluciones:

1) Instalar NTP
NTP (Network Time Protocol) es un servicio que nos permite sincronizar el reloj del sistema con internet. Al instalarlo, se instala también el demonio NTPD que ajusta  el reloj automaticamente y lo acelera o desacelera según sea necesario.

Para instalarlo basta con entrar como root vía SSH al VPS y ejecutar

yum install ntp

seguido de

/sbin/chkconfig ntpd on

(este último para que se inicie automaticamente el demonio al reiniciar el servidor).

Después tenemos que modificar el archivo /etc/ntp.conf con un editor como nano o vi. Lo que vamos a hacer es añadir la siguiente línea:

restrict default kod nomodify notrap

y comentar las siguientes (poniendo un gato # al inicio de cada una):

server 127.127.1.0
fudge 127.127.1.0 stratum 10

Guardamos el archivo de configuración. Reiniciamos NTPD y lo configuramos para que se inicie al rebootear el sistema:

service ntpd restart
/scripts/chkconfig ntpd on

Adicionalmente, si tenemos firewall hay que abrir el puerto 123 en UDP. Si tienes WHM con CSF+LDF, ingresa a WHM y ve a la opción "ConfigServer Security & Firewall", da click en el botón "Firewall configuration" y en la opción "UDP_OUT" añade el puerto 123.


2) Modificar el booteo (arranque)
Esta solución es la mejor (combinada con NTP) para un servidor VPS Linux que corre en Hyper-V sobre Windows Server 2008. Para esto, hay que entrar como root vía SSH al servidor VPS, y modificar el archivo /boot/grub/grub.conf.

En ese archivo encontraremos varios Kernels. En el Kernel predeterminado (generalmente el primero) hay que modificar la línea que inicia con "kernel /vmlinuz", agregandole al final "divider=10 clocksource=acpi_pm" (para 32 bits) o "notsc divider=10" (para 64 bits). Nuestro archivo debe quedar algo así:

#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.6.1.el5)
 root (hd0,0)
 kernel /vmlinuz-2.6.18-164.6.1.el5 ro root=/dev/VolGroup00/LogVol00 hda=noprobe db=noprobe notsc divider=10
 initrd /initrd-2.6.18-164.6.1.el5.img
title CentOS (2.6.18-164.el5)
 root (hd0,0)
 kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00
 initrd /initrd-2.6.18-164.el5.img

Después de modificar y guardar grub.conf, debemos ejecutar una sincronización manual del reloj y reiniciar el servidor usando los siguientes comandos:

service stop ntpd
ntpdate 0.pool.ntp.org
hwclock --systohc
reboot

3) Configurar el WallClock
Si NTP y la modificación de arranque no te funcionan, hay que desvincular el reloj del VPS de su nodo. Generalmente la vinculación del nodo VPS causa el Time Skew. Para hacerlo, hay que ingresar como root via SSH al VPS y ejecutar lo siguiente:

echo 1 > /proc/sys/xen/independent_wallclock

Si queremos que la configuración sea persistente después de un reinicio, debemos modificar el archivo "/etc/sysctl.conf" con un editor como nano o vi, y añadir la siguiente linea:

xen.independent_wallclock = 1

Con esto queda configurado nuestro servidor y ya no debemos de tener problemas con el tiempo. Si los problemas con la sincronización siguen, tal vez se deba a un problema de Kernel y debemos solicitar a nuestro proveedor del VPS que haga una actualización de Kernel.