
Ya hice un tutorial muy parecido sobre Apache y SSL, y otro sobre acceso remoto, pero quería hacer una guía completa, mejorando y uniendo las explicaciones, con un toque extra de configuración en seguridad. Como siempre, la explicación está basada en Debian, pero añadiendo sudo en los comandos precedidos de almohadilla (#) debe servir para Ubuntu.
Como comento, aparte de hacer un todo en uno, he querido poner más énfasis en la seguridad, sobre todo en seguridad pasiva. Todo dentro de un nivel intermedio claro está, porque el ordenador más seguro, según dicen, es el que está apagado. Para ello esta vez he limitado Apache sólo a conexiones SSL y por un puerto distinto al 443 estándar, para, almenos, intentar quitar de enmedio a gran parte de script-kiddies. Y sobre todo eso, he usado un sencillo script PHP para restringir el acceso a la información. Abróchense los cinturones, que comenzamos:
Instalamos Apache2 y PHP5
# aptitude install apache2 php5 libapache2-mod-php5
Comprobamos los vhost que están funcionando en este momento.
# ls /etc/apache2/sites-enabled 000-default
Vemos que sólo está activado el vhost predeterminado (sin cifrar, puerto 80). Tenemos que activar el que funciona con SSL (cifrado, puerto 443), y desactivar el predeterminado, respectivamente.
# a2ensite default-ssl Enabling site default-ssl. Run '/etc/init.d/apache2 reload' to activate new configuration!
# a2dissite default Site default disabled. Run '/etc/init.d/apache2 reload' to activate new configuration!
Activamos el módulo SSL para Apache.
# a2enmod ssl Enabling module ssl. See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates. Run '/etc/init.d/apache2 restart' to activate new configuration!
Reiniciamos el servicio Apache para que los cambios tengan efecto.
# /etc/init.d/apache2 restart
Comprobamos que sólo funciona el vhost por SSL accediendo a la IP del servidor por http (no debería funcionar) y por https (debería funcionar).
Ahora vamos a cambiar el puerto por defecto por el que va a funcionar el vhost por SSL, para que sea uno diferente al 443. Para ello, editaremos el archivo /etc/apache2/sites-available/default-ssl y cambiamos el puerto 443 en la siguiente línea, por otro que queramos, por ejemplo el 8016.
/etc/apache2/sites-available/default-ssl
<VirtualHost _default_:443>
Y finalmente editamos el archivo /etc/apache2/ports.conf para que Apache escuche sólo en el puerto que hemos definido para el vhost. El archivo completo quedaría tal que así con el puerto elegido para el ejemplo:
/etc/apache2/ports.conf <IfModule mod_ssl.c> Listen 8016 </IfModule> <IfModule mod_gnutls.c> Listen 8016 </IfModule>
Ya tenemos Apache2 funcionando exclusivamente con un único vhost cifrado con SSL, a través de puerto diferente al 443. Ahora tenemos que hacer funcionar el servicio No-IP para acceder desde el exterior al servidor.
El primer paso es entrar en la web de No-IP y crear una cuenta de usuario No-IP Free. Una vez que esté creada, tenemos que añadir un host con el botón ‘Add a host’. Si lo estamos haciendo desde la misma conexión en la que está el servidor, todo será automático pues detectará nuestra IP pública y lo tendremos todo listo para añadirlo sin mayor configuración. Simplemente elegir un nombre para el host (Hostname) y un subdominio (no todos están disponibles para cuentas gratuitas).
Ya tenemos configurada funcionando nuestra nueva dirección con nuestra cuenta, así que con redireccionar el puerto 8016 en el router a la IP local del servidor, ya está todo funcionando. No obstante nos interesa, si tenemos IP dinámica, algo completamente normal en España desgraciadamente, instalar el software de No-IP en el servidor para que se actualice la IP pública cada vez que esta cambie, y así nuestra dirección siempre sea válida y no apunte a una IP obsoleta.
En la sección de descargas de No-IP, bajamos el software para Linux y lo descomprimimos en cualquier carpeta. Todo es tan sencillo como entrar mediante terminal en dicha carpeta y hacer un make, lo cual generará un binario noip2 que tenemos que copiar en la carpeta /usr/local/bin del servidor. Todo viene a ser así:
$ tar xvf noip-duc-linux.tar.gz Aquí aparece salida con todos los archivos descomprimidos. cd noip-2.1.9-1 Entramos en la carpeta que acabamos de descomprimir. $ make Aquí aparece la salida del compilador. # cp -vr noip2 /usr/local/bin
Si no tenemos el comando make, tenemos que instalar el paquete build-essential.
El siguiente paso es configurar el programa de No-IP con los datos de nuestra cuenta.
# noip2 -C
Nos preguntará nuestros datos de login (correo electrónico y contraseña), el host que queremos actualizar, el intervalo de actualización y si queremos ejecutar un comando cada vez que la actualización se realice con éxito.
Y voilá, ¡a funcionar!. Sólo nos queda ejecutar el comando para que entre en servicio.
# noip2
El último paso es bloquear el acceso al contenido con una protección básica por contraseña. Para realizar esto hay mil métodos, desde usar autentificación http, usar una combinación de .htpasswd y .htaccess (en Apache), etc. En mi caso, voy a proteger los archivos sensibles con PHP usando el siguiente script:
<?php //pon aquí la contraseña cifrada con SHA1 - este ejemplo es 'hola' // puedes generar el hash de una contraseña nueva, por ejempo en http://www.tech-faq.com/sha-1-generator $password = '99800b85d3383e3a2fb45eb7d0066a4879a9dad0'; session_start(); if (!isset($_SESSION['loggedIn'])) { $_SESSION['loggedIn'] = false; } if (isset($_POST['password'])) { if (sha1($_POST['password']) == $password) { $_SESSION['loggedIn'] = true; } else { die ('Incorrect password'); } } if (!$_SESSION['loggedIn']): ?> <html><head><meta charset="utf-8" /><title>ENTRADA</title></head>
<body> <p>Necesitas una contraseña:</p> <form method="post"> Contraseña: <input type="password" name="password"> <br /> <input type="submit" name="submit" value="Login"> </form> </body> </html> <?php exit(); endif; ?>
La contraseña se almacena como un hash SHA1, para cambiarla sólo hay que generar un nuevo hash (por ejemplo aquí) y cambiar el valor de password, que he resaltado en negrita.
Si llamamos a este script, por ejemplo acceso.php, simplemente tendremos que añadir el siguiente código al principio de cada archivo que queramos proteger:
<meta charset="utf-8" /> <?php require('acceso.php'); ?>
Como colofón, también se puede añadir un enlace para desconectar, que apuntaría a un archivo PHP con el siguiente código:
<meta charset="utf-8" /> <?php session_start(); $_SESSION['loggedIn'] = false; ?> Te has desconectado
- Los script PHP están sacados de una contribución que hizo Tom Haigh en la página de preguntas y respuestas Stack Overflow.
1 Comment
Buenas!
Estoy trasteando con esto del debian y el montar un servidor web. En la vida he tocado nada de esto, pero parece que he conseguido que funcione.
Tengo un par de dudas al respecto, a ver si me puedes echar un cable:
Como es para «jugar», constantemente estoy apagando/reiniciando equipos y router para probar cosas. ¿Cómo podría hacer para que noip2 se ejecutara al iniciar debian? He buscado por ahí, pero no encuentro nada que me funcione.
La otra es que tras configurar el NAT, si accedo al subdominio de no-ip desde la misma red que está el servidor se me muestra la página de inicio del router. He probado con otras conexiones y sí que me muestra la página del servidor. ¿Alguna idea?
Saludos y gracias ;)