Esta entrada está referida a la segunda parte del ejercicio servidor web(2) que nos plantea nuestro profesor en la asignatura de “servicios de red e internet”, aquí el ejercicio completo: http://josedom24.github.io/mod/serviciosgs/e_web_26
Podemos ver la primera parte del ejercicio servidor web en vagrant aquí: http://manuellunaperez.wordpress.com/2014/10/15/servidor-web/
1. Autentificación, Autorización, y Control de Acceso
1. Crea un escenario en Vagrant que tenga un servidor con una red publica, y una privada, un cliente conectada a la red privada. Crea un host virtual que se acceda con el nombre www.masterlan.com. A la URL www.masterlan.com/intranet sólo se debe tener acceso desde el cliente de la red local, y no se pueda acceder desde la anfitriona por la red pública. A la URL www.masterlan.com/internet, sin embargo, sólo se debe tener acceso desde la anfitriona por la red pública, y no desde la red local.
Creamos las máquinas vagrant, el fichero Vagrantfile estará configurado de la siguiente forma:
# -*- mode: ruby -*- # vi: set ft=ruby : VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.define :servidor do |servidor| servidor.vm.box = "debian64" servidor.vm.hostname = "Servidor" servidor.vm.network "public_network",:bridge=>"eth0" servidor.vm.network "private_network", ip: "192.168.100.1", virtualbox__intnet: "redinterna" end config.vm.define :cliente do |cliente| cliente.vm.box = "debian64" cliente.vm.hostname = "cliente" cliente.vm.network "private_network", ip: "192.168.100.2", virtualbox__intnet: "redinterna" end end
Instalamos el paquete «apache2» en la máquina servidor.
Creamos el directorio «/var/www/masterlan» y dentro de él ponemos un index.html y 2 directorios; «intranet» e «internet» cada uno de ellos con un «index.html».
Cambiamos el propietario del directorio creado de forma recursiva:
chown -R www-data:www-data /var/www/masterlan/
Vamos a crear el sitio «masterlan», para ello vamos al directorio «/var/www/sites-available» y copiamos el fichero default dentro del directorio con nombre «masterlan».
Desactivamos el sitio web por defecto:
root@Servidor:/var/www/masterlan# a2dissite default Site default disabled. To activate the new configuration, you need to run: service apache2 reload
Editamos el fichero masterlan para que quede de la siguiente forma:
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName masterlan.com ServerAlias www.masterlan.com ServerSignature On DocumentRoot /var/www/masterlan <Directory /var/www/masterlan> Options FollowSymLinks Indexes MultiViews AllowOverride None Order allow,deny allow from all </Directory> <Directory /var/www/masterlan/intranet> Options Indexes FollowSymLinks MultiViews AllowOverride None Order deny,allow deny from all Allow from 192.168.100.0/24 </Directory> <Directory /var/www/masterlan/internet> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all deny from 192.168.100.0/24 </Directory> </VirtualHost>
Activamos el host virtual con la orden «a2ensite masterlan»:
root@Servidor:/var/www/masterlan# a2ensite masterlan Enabling site masterlan. To activate the new configuration, you need to run: service apache2 reload
Una vez activado el sitio procedemos a reiniciar apache:
root@Servidor:/var/www/masterlan# service apache2 restart
Modificamos el fichero «/etc/hosts» en la máquina cliente y en la máquina anfitriona para definir el host virtual creado.
En el cliente añadimos lo siguiente:
192.168.100.1 www.masterlan.com
En la máquina anfitriona añadimos:
192.168.1.114 www.masterlan.com
Accedemos desde la máquina anfitriona a «www.masterlan.com/intranet» y tenemos el acceso denegado:
Accedemos a «www.masterlan.com/internet» y podemos ver la página sin problemas.
Para realizar las pruebas desde el cliente es necesario instalar en este un navegador web a nivel de texto plano como por ejempo lynx. Una vez instalada este navegador ejecutamos «lynx www.masterlan.com/internet» y obetenemos la siguiente respuesta:
No tenemos permisos para acceder, continuación ejecutamos «lynx www.masterlan.com/intranet» :
Todo está configurado correctamente.
2.Autentificación básica. Limita el acceso a la URL www.masterlan.com/secreto. Comprueba las cabeceras de los mensajes HTTP que se intercambian entre el servidor y el cliente. ¿Cómo se manda la contraseña entre el cliente y el servidor?
Creamos el directorio «secreto» dentro del directorio web de «masterlan» con una página de inicio y le proporcionamos el propietario adecuado «www-data».
Necesitamos un fichero con las credenciales de los usuarios autorizados para acceder a la página privada, para ello creamos un directorio «login» dentro de «/etc/apache2» .Una vez creado ejecutamos en la terminal:
htpasswd -c /etc/apache2/login/pass.txt root
Con esta orden creamos las credenciales para el usuario «root», las credenciales se guardarán en el archivo «pass.txt»
Ahora vamos a editar el fichero de configuración del sitio «masterlan», añadimos lo siguiente especificando la ruta del fichero con las credenciales de los usuarios:
<Directory /var/www/masterlan/secreto> Options Indexes FollowSymLinks MultiViews deny from all AuthUserFile "/etc/apache2/login/pass.txt" AuthName "Introduzca sus datos" AuthType Basic Require valid-user Order allow,deny Allow from all </Directory>
Reiniciamos apache y accedemos desde la máquina anfitriona a «www.masterlan.com/secreto» :
Ponemos los datos y acceso y accedemos correctamente a la página:
Con el comando «curl -i www.masterlan.com/secreto» obtenemos las cabeceras que se intercambian el servidor y el cliente:
root@cliente:/home/vagrant# curl -i 'www.masterlan.com/secreto' HTTP/1.1 401 Authorization Required Date: Mon, 10 Nov 2014 20:39:13 GMT Server: Apache/2.2.22 (Debian) WWW-Authenticate: Basic realm="Introduzca sus datos" Vary: Accept-Encoding Content-Length: 484 Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>401 Authorization Required</title> </head><body> <h1>Authorization Required</h1> <p>This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.</p> <hr> <address>Apache/2.2.22 (Debian) Server at www.masterlan.com Port 80</address> </body></html>
La contraseña entre cliente y servidor se envía encryptada en Base64.
3.Cómo hemos visto la autentificación básica no es segura, modifica la autentificación para que sea del tipo digest, y sólo sea accesible a los usuarios pertenecientes al grupo directivos. Comprueba las cabeceras de los mensajes HTTP que se intercambian entre el servidor y el cliente. ¿Cómo funciona esta autentificación?
Para cambiar el tipo de autentificación debemos activar el módulo «auth_digest«, para ello ejecutamos:
a2enmod auth_digest
Ahora procedemos a modificar la configuración añadida anteriormente, el fichero quedará así:
<Directory /var/www/masterlan/secreto> Options Indexes FollowSymLinks MultiViews deny from all AuthUserFile "/etc/apache2/login/pass.txt" AuthName "directivos" AuthType Digest Require valid-user Order allow,deny Allow from all </Directory>
Ahora añadimos los usuarios al fichero que contiene las credenciales de acceso, esta vez utilizamos la siguiente orden:
htdigest -c /etc/apache2/login/pass.txt directivos manuel
Tambieén creamos un usuario que no tenga acceso:
htdigest /etc/apache2/login/pass.txt sinacceso alejandro
Una vez realizada toda la configuración reiniciamos el servicio apache. Ahora accedemos a «www.masterlan.com/secreto» desde un cliente para comprobar si funciona la configuración.
Si ponemos las credenciales del usuario alejandro no conseguimos acceder a la página porque no pertenece al grupo «directivos», mientras que si accedemos con el usuario «manuel» accedemos correctamente al sitio.
De nuevo realizamos «curl -i www.masterlan.com/secreto» y obtenemos las cabeceras que se intercambian el servidor y el cliente:
root@cliente:/home/vagrant# curl -i 'www.masterlan.com/secreto' HTTP/1.1 401 Authorization Required Date: Mon, 10 Nov 2014 21:04:01 GMT Server: Apache/2.2.22 (Debian) WWW-Authenticate: Digest realm="directivos", nonce="qB18gIcHBQA=cd0d54f2284e5b99b028e2354275f8741099c98e", algorithm=MD5, qop="auth" Vary: Accept-Encoding Content-Length: 484 Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>401 Authorization Required</title> </head><body> <h1>Authorization Required</h1> <p>This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.</p> <hr> <address>Apache/2.2.22 (Debian) Server at www.masterlan.com Port 80</address> </body></html>
Esta vez vemos como el tipo de autenticación es «Digest», el acceso sólo es válido para los usuarios pertenecientes al grupo «directivos» y las credenciales son cifradas en «MD5».
4.Vamos a combianar el control de acceso (punto 1) y la autentificación (punto 2 y 3), y vamos a configurar el virtual host para que se comporte de la siguiente manera: el acceso a la URL www.masterlan.com/secreto se hace forma directa desde la intranet, desde la red pública te pide la autentificación.
Procedemos a combinar las 2 opciones, para ello modificamos de nuevo el fichero de configuración del sitio «masterlan» y añadimos las lineas:
Allow from 192.168.100.0/24 satisfy any
La configuración del directorio deberá quedar así:
<Directory /var/www/masterlan/secreto> Options Indexes FollowSymLinks MultiViews deny from all AuthUserFile "/etc/apache2/login/pass.txt" AuthName "directivos" AuthType Digest Require valid-user Order allow,deny Allow from 192.168.100.0/24 satisfy any </Directory>
Reiniciamos apache y procedemos a hacer las comprobaciones desde los clientes:
Si accedemos desde la máquina anfitriona se nos pide nuestras credenciales:
Mientras que si accedemos desde el cliente local no se nos piden credenciales y accedemos a la página directamente:
Una vez realizada toda la configuración del primer ejercicio, el contenido del fichero de configuración del sitio «masterlan» deberá ser así:
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName masterlan.com ServerAlias www.masterlan.com ServerSignature On DocumentRoot /var/www/masterlan <Directory /var/www/masterlan> Options FollowSymLinks Indexes MultiViews AllowOverride None Order allow,deny allow from all </Directory> <Directory /var/www/masterlan/intranet> Options Indexes FollowSymLinks MultiViews AllowOverride None Order deny,allow deny from all Allow from 192.168.100.0/24 </Directory> <Directory /var/www/masterlan/internet> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all deny from 192.168.100.0/24 </Directory> <Directory /var/www/masterlan/secreto> Options Indexes FollowSymLinks MultiViews deny from all AuthUserFile "/etc/apache2/login/pass.txt" AuthName "directivos" AuthType Digest Require valid-user Order allow,deny Allow from 192.168.100.0/24 satisfy any </Directory> </VirtualHost>
2. Logs del servidor y configuración con .htaccess
1.Date de alta en CDMON y contrata una Plataforma de prueba. Con ello tenemos a nuestra disposición un hosting comercial con todas sus funcionalidades, incluso con un servidor DNS que nos da acceso al hosting, en mi caso con la URL http://jdmr.com.mialias.net. ¿Si necesitamos configurar el servidor web que han configurado los administradores de CDMON que podemos hacer? Explica la directiva AllowOverride de apache2.
Debemos crear un fichero «.htaccess» y configurar las directivas.
AllowOverride controla qué directivas se pueden situar el los ficheros .htaccess.
Los valores de AllowOverride pueden ser «All», «None», o una combinación de:
- AuthConfig: Permite el uso de directivas de autorización (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, etc.).
- FileInfo Permite el uso de directivas de control de tipo de documentos (DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, etc).
- Indexes Permite el uso de directivas que controlan los índices de directorios (AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, etc.).
- Limit Permite el uso de directivas de acceso de hosts (Allow, Deny y Order).
- Options Permite el uso los valores de la directiva Options.
Por ejemplo:
«Options FileInfo AuthConfig Limit»
o bien
AllowOverride None
Hay que tener en cuenta que si AllowOverride tiene un valor distinto a «None», el servidor web tendrá que buscar este fichero en todos los directorios que haya hasta llegar al fichero o directorio solicitado para aplicar la confiuración. Esto puede influir en el rendimiento del servidor web. Por este motivo es aconsejable poner de forma global «AllowOverride None» y después activarlo en el directorio concreto que queramos que tenga una configuración específica.
2. Utilizando archivos .htaccess, y siguiendo esta guía de CDMON realiza las siguientes configuraciones:
-
Habilita el listado de ficheros en la URL http://tunombre.mialias.net/nas.
Una vez nos hayamos dado de alta en CDMON y hayamos contratado una plataforma de pruebas, accedemos a su panel y habilitamos las conexiones ssh. Para hacer esto buscamos en el apartado «Gestores de archivos» el elemento «SSH, sFTP», accedemos y activamos el servicio ssh y elegimos la contraseña de acceso.
Accedemos desde nuestra máquina por ssh y una vez accedamos creamos el directorio «nas» dentro del directorio «/web». Dentro del directorio «nas» creamos varios ficheros y directorios como ejemplo.
Creamos un fichero «.htaccess» con la linea «Options +Indexes», para ello ejecutamos desde linea de comandos los siguiente:
echo "Options +Indexes" >> .htaccess
Accedemos a «mlp.com.mialias.net/nas/» y vemos que la configuración se ha realizado correctamente:
-
Crea una redirección permanente: cuando entremos en http://tunombre.mialias.net/google salte a www.google.es.
Dentro del directorio «web» creamos un nuevo directorio llamado «google» con un fichero «.htaccess» dentro de él.
Añadimos la siguiente linea al fichero «.htaccess»:
echo "RedirectMatch 301 ^/(.*)$ http://www.google.es" >> .htaccess
Una vez añadida la configuración procedemos a visitar la url «mlp.com.mialias.net/google» se la página redireccionará automáticamente a «www.google.es».
-
Pedir autentificación para entrar en la URL http://tunombre.mialias.net/prohibido. Puedes ver este tutorial de CDMON.
Creamos un nuevo directorio «prohibido» dentro del directorio «web». En la máquina local procedemos a crear un fichero «.htaccess» con la siguiente contenido:
AuthUserFile /home/mlp.com.mialias.net/web/prohibido/.pass AuthName "Inicio de Sesión" AuthType Basic Require user admin
Para crear el fichero «.pass» ejecutamos lo siguiente:
htpasswd -c .pass admin
Se nos creará el fichero y también crearemos un «index.html» para mostrar la página cuando iniciemos sesión.
Enviamos los archivos por scp a la plataforma de pruebas contratada. Si accedemos a la url configurada nos dará error, miramos el log y obtenemos el siguiente error:
[Tue Nov 11 20:53:53 2014] [alert] [client 85.136.169.126] /home/mlp.com/web/prohibido/.htaccess: AuthUserFile not allowed here
3. Vamos a seguir trabajando en el escenario que implementamos en los 5 primeros ejercicios. Vamos a instalar y configurar un analizador de logs de apache2 que nos permita generar estadísticas de acceso a nuestro servidor web (ejemplo [estadísticas de dit.gonzalonazareno.org](http://dit.gonzalonazareno.org/cgi-bin/awstats.pl
-
La URL de la estadística sera www.masterlan.com/estadistica.
Instalamos el paquete «awstats»:
aptitude install awstats
Creamos el directorio «estadística» dentro de «/var/www/masterlan» y le damos los permisos adecuados.
Cuando termine la instalación procedemos a modificar el fichero de configuración del sitio «masterlan», añadimos la siguiente información:
<Directory /var/www/masterlan/estadistica> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined LogLevel warn
Guardamos los cambios y reiniciamos el servicio apache.
Vamos a «/etc/awstats» y copiamos el fichero «awstats.conf» a un nuevo fichero:
cp awstats.conf awstats.estadisticas.conf
Modificamos el fichero creado y en la linea «SiteDomain=» añadimos «www.masterlan,com»:
SiteDomain="www.masterlan.com"
Lo demás lo dejamos como está. Para evitar problemas cambiamos el nombre al fichero de configuración por defecto.
mv awstats.conf awstats-orig
Para generar la página que mostrará el enlace ejecutamos lo siguiente:
/usr/lib/cgi-bin/awstats.pl -config=estadisticas -output -staticlinks > /var/www/masterlan/estadistica/index.html
Accedemos a la página desde el navegador:
-
El acceso a la estadística desde la red local está permitido, si hace desde fuera, por ejemplo desde el host, se requiere autentificación tipo digest (realizar este punto por medio de un fichero .htaccess)
En el fichero de configuración el sitio «masterlan» modificamos la configuración del directorio «/var/www/masterlan/estadistica» para que acepte ficheros «.htaccess»:
<Directory /var/www/masterlan/estadistica> Options Indexes FollowSymLinks MultiViews AllowOverride All </Directory>
Reiniciamos el servidor apache y creamos un fichero .«htaccess» con este contenido:
AuthUserFile "/etc/apache2/login/pass.txt" AuthName "directivos" AuthType Digest Require valid-user Order allow,deny allow from 192.168.100.0/24 satisfy any
Una vez realizada esta configuración se nos pedirá credenciales para acceder a la página de estadisticas.
-
Modifica el cron de awstats para que se genere las estadísticas cada 2 minutos.
Ejecutamos «crontab -e» y se nos abrirá un fichero donde introduciremos lo siguiente:
*/2 * * * * /usr/lib/cgi-bin/awstats.pl -config=estadisticas -output -staticlinks -update > /var/www/masterlan/estadistica/index.html
Con esto nuestras estadisticas se actualizarán cada 2 minutos.
3. Módulos
1. Módulo userdir: Activa y configura el módulo userdir, que permite que cada usuario del sistema tenga la posibilidad de tener un directorio (por defecto se llama public_html) donde alojar su página web. Publica una página de un usuario, y accede a la misma.
Añadimos el módulo «userdir», para ello:
a2enmod userdir
Una vez añadido reiniciamos el servidor apache y añadimos un nuevo usuario llamado «manuel» a nuestro equipo. Creamos dentro de su directorio home un directorio «public_html» y dentro de éste un fichero «index.html». Accedemos desde la máquina cliente y este es el resultado:
lynx go 192.168.100.1/~manuel
Todo funciona correctamente.
2. (Optativo): Instalación de un servidor WebDAV que sea accesible desde la URL www.masterlan.com/webdav.
Activamos los siguientes módulos:
a2enmod dav a2enmod dav_fs
Creamos el directorio «/var/www/masterlan/webdav» y dentro de él un fichero de prueba. Cambiamos los permisos del directorio de forma recursiva (www-data).
Modificamos el fichero de configuración del sitio «masterlan» y añadimos lo siguiente:
DavLockDB /tmp/DavLock <Directory /var/www/masterlan/webdav> dav on Options Indexes FollowSymLinks MultiViews AuthUserFile "/etc/apache2/login/pass.txt" AuthName "directivos" AuthType Digest Require valid-user Order allow,deny allow from all </Directory>
Accedemos desde la máquina anfitriona, para ello nos vamos a un directorio y vamos a «Archivo > Conectar con el servidor» , nos saldrá la siguiente ventana y la rellenamos:
Si las credenciales son correctas veremos el directorio creado en el servidor:
Una vez terminada toda la configuración del sitio «masterlan», el fichero quedará así:
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName masterlan.com ServerAlias www.masterlan.com ServerSignature On DocumentRoot /var/www/masterlan <Directory /var/www/masterlan> Options FollowSymLinks Indexes MultiViews AllowOverride None Order allow,deny allow from all </Directory> <Directory /var/www/masterlan/intranet> Options Indexes FollowSymLinks MultiViews AllowOverride None Order deny,allow deny from all Allow from 192.168.100.0/24 </Directory> <Directory /var/www/masterlan/internet> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all deny from 192.168.100.0/24 </Directory> <Directory /var/www/masterlan/secreto> Options Indexes FollowSymLinks MultiViews AuthUserFile "/etc/apache2/login/pass.txt" AuthName "directivos" AuthType Digest Require valid-user Order allow,deny Allow from 192.168.100.0/24 satisfy any </Directory> <Directory /var/www/masterlan/estadistica> Options Indexes FollowSymLinks MultiViews AllowOverride All </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> DavLockDB /tmp/DavLock <Directory /var/www/masterlan/webdav> dav on Options Indexes FollowSymLinks MultiViews AuthUserFile "/etc/apache2/login/pass.txt" AuthName "directivos" AuthType Digest Require valid-user Order allow,deny allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined LogLevel warn </VirtualHost>
3. Vamos a volver a nuestro hosting en CDMON, vamos a crear una carpeta php donde vamos a tener un fichero index.php con el siguiente contenido:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Conversor de Monedas</title>
</head>
<body>
<form action="index.php" method="get">
<input type="text" size="30" name="monto" /><br/>
<select name="pais">
<option name="Dolar">Dolar</option>
<option name="Libra">Libra</option>
<option name="Yen">Yen</option>
</select>
<input type="submit" value="convertir" />
</form>
<?php
if (isset($_GET['monto'])) {
define ("cantidad", $_GET['monto']);
} else {
define ("cantidad", 0);
}
if($_GET){
// definimos los paises
$tasacambios = array ("Libra"=>0.86,"Dolar"=>1.34,"Yen"=>103.56);
// imprimimos el monto ingresado
echo "<b>".cantidad." euros</b><br/> ".$_GET["pais"]." = ".cantidad*$tasacambios[$_GET["pais"]]." <br><br>";
// por cada pais imprimimos el cambio
}
?>
</body>
</html>
Accedemos por ssh y creamos el directorio php.
Creamos el fichero «index.php» en nuestra máquina y lo subimos a la plataforma por scp.
Configura mediante un fichero .htaccess http://www.masterlan.com/php/moneda/cantidad, donde moneda indica el nombre de la moneda a la que queremos convertir (Dolar,Libra,Yen) y cantidad indica los euros que queremos convertir.
Creamos un fichero «.htaccess» con el siguiente contenido y lo ponemos en el directorio «php» de la plataforma de pruebas:
Options +FollowSymLinks RewriteEngine On RewriteBase /php RewriteRule ^([0-9]+)/([a-zA-Z]+)$ index.php?monto=$1&pais=$2
Tras enviar el fichero accedemos mediante la url «http://mlp.com.mialias.net/php/175/Dolar»: