Cómo instalar un servidor web seguro basado en apache, SSL, PHP y MySQL en entornos windows Los servidores Web

siempre han sido fuente de problemas para los administradores de sistemas debido a sus enormes archivos de configuración –a veces incluso crípticos–, más aún cuando son ampliados con módulos que mejoran sus capacidades como SSL, PHP o MySQL. En este artículo aprenderá a instalar y configurar un servidor Web apto para su uso en un entorno productivo incluyendo bases de datos SQL y conexiones seguras. Ha llegado la época en la que un simple servidor Web no es suficiente para casi ningún propósito que sea diferente a mostrar información estática, principalmente debido a las exigencias de los usuarios que demandan aplicaciones multimedia e interactivas con capacidades de manejo de bases de datos y, cómo no, con soporte de comunicaciones seguras al realizar transacciones. Todo esto ha hecho que el servidor Web haya pasado a ser uno de los puntos críticos en las empresas de servicios a través de Internet, pero también ha conducido a incrementar su complejidad más allá de su objetivo original. La instalación de un servidor Web como Apache es relativamente sencilla, siendo los pasos a seguir los típicos: descargar de la última versión, instalación de los archivos binarios, iniciar el servicio y listo. Pero la configuración avanzada para su perfecta adaptación a los añadidos que permiten aprovechar todas las características de un servidor de este tipo se complica bastante. El objetivo de este artículo es instalar un servidor Web que disponga además de las típicas páginas HTML, soporte para el lenguaje de programación de páginas web PHP, acceso a un servidor de bases de datos SQL (Structure Query Language) y transmisión de datos seguro a través de SSL (Secure Socket Layer). Para crear los archivos de texto necesarios para seguir el artículo deberá usar un editor de texto puro (ASCII) que no guarde códigos de control en los documentos, el Bloc de Notas (notepad.exe) servirá. Hay que tener cuidado al grabar documentos con el Bloc de Notas, ya que si no ha desactivado la opción Ocultar extensiones para tipos de archivos conocidos en Ver->Opciones de Opciones de carpeta Carpeta de las ventanas del explorador de Windows, entonces los archivos se guardarán con la extensión .txt lo que puede producir problemas al editar archivos .html o .php (desactive esta opción tal cómo se muestra en imagen). Otro requisito para poder descomprimir los archivos necesarios es un software compatible con el estándar de compresión ZIP, el más famoso para Windows es Winzip. En las siguientes secciones se presentan primero la instalación del servidor Apache, seguido de MySQL, y los añadidos PHP y SSL para Apache, para luego integrarlos eficazmente y comprobar su funcionamiento en un entorno real.

Apache El primer requisito es obviamente el servidor de páginas Web Apache. El proyecto Apache es un desarrollo llevado a cabo por la fundación Apache que tiene como fin crear un servidor HTTP (Web) robusto, de nivel comercial, con innumerables características y de distribución gratuita. Apache fue diseñado con los sistemas UNIX en mente, pero gracias a su popularización su uso en entornos Windows es cada vez más común, aunque ésta versión no alcanza las mismas cotas de rendimiento y flexibilidad que la versión UNIX. En nuestro caso, necesitará descargar la versión para Windows de la dirección httpd.apache.org/dist/httpd/binaries/win32/; el archivo exacto es apache_1.3.x-win32no_src-r2.msi que contiene el instalador sin el código fuente (en el momento de escribir el artículo la versión disponible era la 1.3.22, pero no debería existir ningún inconveniente si usa una versión mayor). La distribución de la versión para Windows usa el sistema de instalación de Microsoft con la extensión .msi, por lo tanto si no dispone de Microsoft Software Installer en su sistema necesitará descargarlo mediante ftp del servidor público de Microsoft (ftp.microsoft.com) en el directorio /developr/platformsdk/oct2000/msi e instalarlo en primer lugar para después continuar la instalación de Apache. Instalación del servidor La instalación del servidor Apache en Windows es prácticamente igual a la de cualquier otra aplicación, y sólo debemos tener en cuenta 2 detalles: En la ventana Server Information de este proceso, rellene los campos con los valores por defecto que aparecen en la parte superior de ellos, es decir, en Network Domain introduzca somenet.com, en Server Name introduzca www.somenet.com y en Administrator’s Email por ejemplo webmaster@somenet.com (estos datos son ficticios y deberían ser cambiados si el ordenador que ejecute el servidor de Web tiene acceso directo a Internet con Ventana de dominio propio, pero la mayoría de los usuarios deberían dejar los información del indicados). Existen 2 modos de funcionamiento de Apache que se servidor pueden seleccionar en esta misma ventana, como servicio del sistema (Run as a service) o como aplicación (Run when started manually); en nuestro caso elija la segunda opción ya que así funcionará –con arranque manual– en cualquier versión de Windows (98/ME/NT/2000) de la misma forma, no obstante es posible usar la primera opción. En el tipo de instalación seleccione Custom para poder elegir el directorio destino en c:\web\ que es el que se usará para almacenar los componentes necesarios pulsando en el botón Change. Arrancar el servidor

Una vez instalado, ejecute el servidor accediendo a Inicio->Programas ->Apache httpd server ->Start Apache in console, debería aparecer una consola de sistema con el texto “Apache/1.3.20 (Win32) running...” en la primera línea, sin ningún otro mensaje de error, lo que indica que el servidor Web está funcionando. El siguiente paso es comprobar si el servidor está activo realmente, para ello inicie una ventana de Internet Explorer u otro navegador e introduzca en la barra de direcciones localhost ó 127.0.0.1 (dirección de red local de una máquina) si accede desde su propia máquina, o la IP correspondiente al servidor si se encuentra en otra diferente (puede averiguar la dirección IP use el comando de MSDOS ipconfig).

Puesta en marcha

Si todo va bien debería ver una página de bienvenida tal y como se puede ver en la figura, de no ser así compruebe que ha iniciado correctamente el servidor Apache según los pasos anteriores y que no tiene configurado el acceso a Internet a través de un proxy. Si este es su caso deberá desactivarlo para realizar las pruebas; en el Página de IE esta opción se encuentra en Herramientas->Opciones de bienvenida Internet->Conexiones->Configuración LAN. En el archivo de configuración principal c:\web\apache\conf\httpd.conf se encuentran todas las opciones necesarias para ajustar el servidor, cambiar el puerto de acceso (por defecto el 80), directorio raíz del sitio, servidores virtuales, etc., pero por ahora no es necesario realizar ningún cambio adicional. Los documentos del sitio web están en c:\web\apache\htdocs, si desea cambiar el contenido de la web deberá borrar los archivos de este directorio para sustituirlos por los propios.

Directorio de las páginas Apache vs. IIS

Sobre este punto sería posible escribir incluso un libro (si no lo hay aún), por lo que en lugar de exponer todas las características de ambos productos es preferible hacer un breve repaso indicando sus ventajas e inconvenientes, y que cada cual tome su propia decisión. Ventajas IIS - Fácil de usar. - ASP preparado en la instalación por defecto. - Soporte ODBC integrado. - Configuración gráfica y en línea de comandos. Apache - Código fuente disponible. - Existen versiones virtualmente para cualquier sistema operativo.

- Excelente integración con PHP y MySQL. - Es el servidor web por excelencia en la Red.

Inconvenientes: ISS - Multitud de nuevos fallos de seguridad. - La mayoría de funcionalidad extra debe ser comprada separadamente. - Sólo funciona en Windows NT/2000. Apache - No existe aún configuración gráfica oficial. - Curva larga de aprendizaje para sacarle el máximo partido MySQL Las bases de datos relacionales se han convertido en una herramienta fundamental en las actividades diarias de casi cualquier empresa, y ya quedan pocas que no usen este sistema para almacenar su información. MySQL es una base de datos relacional de libre distribución usada principalmente como soporte de portales web que necesitan manejar datos dinámicamente, con una potencia que poco tiene que envidiar a las grandes como SQL Server e incluso Oracle.

Proceso de instalación

Antes de nada debe descargar la versión binaria para Windows de la dirección www.mys ql.com/downloads/mysql-3.23.html en el apartado Windows 95/98/NT/2000 (Intel); tenga en cuenta que se trata de un archivo de unos 10MB por lo que si dispone de una conexión a Internet mediante módem tendrá que tener paciencia. El archivo de instalación está empaquetado con el compresor ZIP, pero una vez descomprimido se instala como una aplicación típica de Windows. MySQL asume que el directorio por defecto será c:\mysql (recomendamos que use este directorio) aunque puede elegir otro, pero deberá editar el archivo de configuración c:\my.cnf tal y como se muestra en la figura. Configuración de MySQL El primer paso será iniciar el servidor de bases de datos, para ello abra una ventana de MS-DOS e introduzca estos comandos:
c:\>cd c:\mysql\bin c:\mysql\bin>mysqld-max

Nótese que dentro del directorio \bin existen diferentes versiones del servidor SQL: mysqld (versión original con información de debug incorporada), mysqld-max (binario optimizado), mysqld-nt (versión para Win NT/2000) y mysqld-max-nt (igual, pero para Así se ve en consola NT/2000). El segundo paso es probar el funcionamiento del servidor MySQL usando el cliente (mysql.exe) incluido en el paquete básico. En otra ventana de MS-DOS introduzca (los comandos de MySQL siempre terminan en punto y coma “;”.):
C:\mysql\bin> mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 to server version: 3.23.41-max Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show databases; +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.11 sec) mysql> create database terra; Query OK, 1 row affected (0.06 sec) mysql>

Si obtiene estos mensajes en pantalla, quiere decir que ha conectado correctamente con el servidor de bases de datos. Como puede comprobar, en la instalación típica existen por defecto dos bases de datos: “mysql” (base de datos de administración) y “test” (base de pruebas). MySQL vs SQL Server MySQL es una alternativa a los grandes servidores de bases de datos basados en Microsoft SQL Server y Oracle, al menos en cuanto a solución para manejar bases de datos para portales de Internet. MySQL destaca especialmente por su velocidad al efectuar lecturas y búsquedas en la base de datos –sentencias SELECT en SQL–, pero no por sus capacidades para realizar miles de transacciones en tiempo real que puede requerir, por ejemplo, un banco por Internet. Aquí puede ver una tabla comparativa con los resultados de realizar la sentencia SELECT * FROM BBDD accediendo a 50 registros en 6 bases de datos diferentes con el resultado expuesto en segundos (menos tiempo es mejor); esta ha sido ejecutada 41 veces en un servidor web bajo PHP.

Bases de datos MySQL MS SQL 7 MS SQL 7 ODBC Access ODBC

1 2 3 4 5 6 Media 1.56 1.57 2.56 1.56 1.52 1.57 1.72 2.11 2.07 2.09 2.09 2.09 2.10 2.09 10.47 10.41 11.46 10.48 10.43 11.48 10.79 4.11 3.91 4.00 4.99 4.98 3.98 4.33

PHP Hypertext Preprocessor, es un lenguaje interpretado de alto nivel embebido en páginas HTML. La mayoría de su sintaxis es similar a C, Java y Perl, con numerosas características de PHP específicas. La meta de este lenguaje es permitir escribir a los creadores de páginas web, páginas dinámicas de una manera rápida y fácil. El archivo a descargar se encuentra en www.php.net/downloads.php en la sección Win32 Binaries con el nombre PHP 4.0.x Installer, aunque si lo desea puede usar la versión completa PHP 4.0.x zip package (ocupa bastante más). La instalación de PHP en Windows es también bastante sencilla y sólo hay que tener en cuenta al instalarlo seleccionar en la ventana Server Type el tipo None para poder configurarlo manualmente en Apache, en los demás campos son válidos los valores por defecto. Instalando PHP La integración de PHP –en modo CGI (interprete externo) en lugar de módulo de Apache (interno)- con Apache se realiza editando el archivo de configuración de este último para que interprete correctamente la extensión de archivos .php. Lo más sencillo es añadir estas líneas en el principio del archivo “http.conf”:
# terra ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php Action application/x-httpd-php “/php/php.exe”

También es necesario modificar la línea que comienza por DirectoryIndex, con el fin de interpretar correctamente las páginas de inicio, por esta otra:
DirectoryIndex index.html index.php index.php3

Arrancar PHP Una vez grabados los cambios en el documento httpd.conf es obligatorio detener el servidor Apache –pulsando CTR-C en su ventana– y volverlo a ejecutar para que relea el archivo de configuración. El siguiente fragmento de código usa la función phpinfo() para comprobar si funciona o no la interpretación de archivos .php, debe grabar éste en un archivo llamado terra.php en el directorio c:\web\apache\htdocs\:
<? phpinfo();

?>

Una vez con el archivo grabado en el directorio raíz del servidor web, verifique con el navegador si Apache procesa correctamente los archivos .php introduciendo en la barra de dirección http://127.0.0.1/terra.php; si todo ha ido correctamente y no ha obtenido un mensaje de error observará un mensaje de información de PHP –devuelto por la función phpinfo()– cómo el de la figura significa que ha instalado PHP correctamente, en caso contrario deberá repasar su instalación desde el principio, sobre todo teniendo cuidado con el nombre de los directorios. PHP vs ASP Existe un gran debate en la red sobre sí el lenguaje de programación de guiones PHP es superior o inferior a su homónimo de Microsoft ASP (Active Server Pages). Es cierto que la gran base de usuarios de Microsoft, sobre todo en las empresas informáticas, hacen que ASP sea más fácil de implementar y mantener, pero, ¿cuál es más potente?. Aquí se muestran unas conclusiones explicando por qué PHP es superior a ASP: 1. Velocidad Uno de los principales problemas en los portales de Internet que soportan una gran carga de usuarios es la velocidad de respuesta de su servidor, por lo que este debería ser un punto crítico al elegir un lenguaje u otro. ASP, probablemente, nunca será tan rápido como PHP. ASP está construido en una arquitectura de objetos COM, y por lo tanto, cuando un programador de ASP usa VBScript realmente está corriendo un objeto COM. Si escribe un simple texto en la salida estándar, estaría llamando al objeto Response del método Write. Si accede a una base de datos, debe usar otro objeto, etc. Todo esto sobrecarga y hace más lento el sistema. En cambio, al usar PHP todas las operaciones se realizan en el espacio de memoria de PHP. Esto significa que el código PHP ejecutará más rápido ya que no debe cargar dinámicamente ningún otro objeto en memoria en la ejecución de un programa. 2. Costes ocultos Una de las cosas que se suelen pasar por alto al usar un software determinado son los costes ocultos o derivados de la primera compra. ASP cumple con esta especificación, es decir, un desarrollador posiblemente no pueda realizar todas las tareas que necesita con las opciones que ofrece ASP por defecto; si necesita encriptación comprará ASPEncrypt, si necesita gestión de correo comprará Qmail de ServerObject, por ejemplo, si necesita subir ficheros (file uploading) al servidor comprará SA-FileUP de Artisans. Todo esto y más está disponible en PHP gratuitamente. 3. Programación parecida a C o Java Aunque este punto es más una opinión que una conclusión, poca gente negará las

ventajas –a nivel de programación empírica– del lenguaje C sobre VisualBasic. Además de tener una sintaxis basada en C, PHP toma prestado de perl la interpretación de expresiones regulares y de Java el sistema de objetos. SL (Secure Socket Layer) Esta es quizás la parte más problemática de todo el artículo por lo que es recomendable tener paciencia y hacer exactamente los mismos pasos que aquí se describen debido a que las implementaciones de conexiones seguras (SSL) para la versión de Windows de Apache son conversiones directas de sus análogas de UNIX y fallan al más mínimo descuido. Para realizar el servidor Web perfecto en un entorno Windows no puede faltar soporte para conexiones seguras que eviten las intercepciones de datos a través de Internet al realizar transacciones bancarias o compras online. Aunque existen varias soluciones, sin duda la más probada es SSL por lo que estaría bien proporcionar soporte SSL en nuestro reciente servidor Web. Para este proyecto descargue el modulo SSL precompilado para la versión de Apache que tiene instalada (en nuestro caso la 1.3.20) de la dirección www.modssl.com/con trib/Apache_1.3.20Mod_SSL_2.8.4-Open SSL_0.9.6a-WIN32.zip. Descomprima el archivo ZIP en el directorio c:\modssl y copie los archivos ssleay32.dll y libeay32.dll del directorio modssl\openssl\bin al Certificado directorio del sistema (windows\system en Win98 y winnt\system32 en Windows NT/2000). Crear certificados SSL Después es necesario crear los certificados SSL que a grandes rasgos es una credencial digital que permite a los visitantes de un sitio usar su navegador para verificar la autenticidad del sitio y comunicarse con él en forma segura. Estas son las instrucciones exactas para crearlos:
C:\>cd modssl C:\modssl>cd openssl\bin C:\modssl\openssl\bin>openssl req -config openssl.cnf -new -out somenet.csr Using configuration from openssl.cnf Loading 'screen' into random state - done Generating a 1024 bit RSA private key ..................++++++....++++++ writing new private key to 'privkey.pem' Enter PEM pass phrase: esto es una prueba para terra Verifying password - Enter PEM pass phrase: esto

es una prueba para terra ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) []:es State or Province Name (full name) []:madrid Locality Name (eg, city) []:madrid Organization Name (eg, company) []:idg Organizational Unit Name (eg, section) []:terra Common Name (eg, your websites domain name) []:www.somenet.com Email Address []:webmaster@somenet.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:calidad C:\modssl\openssl\bin> C:\modssl\openssl\bin>openssl rsa -in privkey.pem -out somenet.key read RSA key Enter PEM pass phrase: prueba terra writing RSA key C:\modssl\openssl\bin>openssl x509 -in somenet.csr -out somenet.cert -req -signkey somenet.key -days 365 Loading 'screen' into random state - done Signature ok subject=/C=es/ST=madrid/L=madrid/O=idg/ OU=terra/CN=www.somenet.com/Email=webmas ter@somenet.com Getting Private key C:\modssl\openssl\bin>

Si no se ha producido ningún error, entonces el certificado SSL se ha creado con éxito. Este certificado ha sido firmado digitalmente por nosotros y sólo será válido para hacer pruebas. Si trabajáramos en un entorno real sería necesario obtenerlo de una entidad certificadora. Poner en marcha SSL Lo siguiente es crear el directorio c:\web\apache\conf\ssl y mover los archivos somenet.key y somenet.cert (del certificado digital), así:
C:\web\Apache>cd conf C:\web\Apache\conf>md ssl

C:\web\Apache\conf>cd ssl C:\web\Apache\conf\ssl>copy ..\..\openssl\ bin\somenet.key 1 archivos copiados C:\web\Apache\conf\ssl>copy ..\..\openssl\ bin\somenet.cert 1 archivos copiados C:\web\Apache\conf\ssl>

Después modifique el archivo de configuración de Apache para que incluya las siguientes líneas:
# para más información # http://www.modssl.org/docs/ 2.4/ssl_reference.html LoadModule ssl_module modules/mod_ssl.so SSLMutex sem SSLRandomSeed startup builtin SSLSessionCache none SSLLog logs/SSL.log SSLLogLevel info Listen 443 SSLEngine On SSLCertificateFile conf/ssl/somenet.cert SSLCertificateKeyFile conf/ssl/somenet.key

Apache estará configurado para trabajar en modo SSL en el puerto 443 (HTTPS) únicamente, por lo que las peticiones al puerto 80 (HTTP) dejarán ahora de funcionar. Es posible disponer de los puertos 80 y 443 simultáneamente para trabajar con conexiones normales y seguras al mismo tiempo pero sería necesario crear Vista de la consola servidores virtuales. Antes de iniciar Apache en modo SSL es necesario copiar los archivos que se encuentran en la carpeta modssl en la carpeta Apache sobrescribiendo los archivos previos. Apache cargará el módulo mod_ssl al iniciarlo con apache –D ssl, por lo que si aún se encuentra activo es necesario detenerlo para después desde una línea de comandos ejecutarlo de la forma indicada (si no hace esto, no podrá reconocer solicitudes SSL):
C:\web\Apache>apache -D ssl Apache/1.3.20 (Win32) mod_ssl/2.8.4 OpenSSL/0.9.6a running...

Si no se produce ningún error tendrá listo su servidor Apache con soporte PHP, MySQL y conexiones seguras SSL bajo Windows. Pero antes de probarlo todo en conjunto inicie

un IE e introduzca en la barra de direcciones https://127.0.0.1/terra.php, debería aparecer la misma página web que en el apartado PHP pero en esta ocasión mediante una transmisión segura (el protocolo HTTPS es a groso modo una encapsulación de http sobre SSL). Si es la primera vez que conecta con su servidor mediante SSL, IE presentará un aviso en pantalla indicándole información sobre el certificado que ha creado anteriormente que deberá aceptar para poder continuar. Además, cuando el navegador realiza una conexión segura con un servidor muestra en la parte inferior de la pantalla un pequeño candado cerrado. Probando nuestro trabajo Un ejemplo real aunque muy limitado en este caso es crear una agenda de nombres accesible mediante una página web. Para ello lo primero deberemos crear la estructura de la base de datos, en nuestro caso será simplemente una tabla con 2 registros creada en la base de datos terra (creada en el apartado MySQL): id (número de identificación) y nombre (nombre personal del usuario):
C:\mysql\bin>mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 3.23.41-max-debug Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use terra; Database changed mysql> create table agenda (id int not null auto_increment, nombre char(50), primary key(id)); Query OK, 0 rows affected (0.16 sec) mysql> show tables; +------------------+ | Tables_in_terra | +------------------+ | agenda +------------------+ 1 row in set (0.11 sec) mysql> describe agenda; ... 2 rows in set (0.06 sec)

|

En los siguientes comandos se usan la sentencia “INSERT” de SQL para introducir algunos datos en la base de datos.

mysql> insert into agenda (nombre) values('Pepe Falso'); Query OK, 1 row affected (0.11 sec) mysql> insert into agenda (nombre) values('Jonny Me Lavo'); Query OK, 1 row affected (0.00 sec) mysql> select * from agenda; +----+---------------+ | id | nombre +----+---------------+ | 1 | Pepe Falso | 2 | Jonny Me Lavo | +----+---------------+ 2 rows in set (0.06 sec) mysql>

| |