laboratorio de arquitectura de redes de comunicaciones

Anuncio
Universidad Politécnica de Cartagena
Escuela Técnica Superior de Ingeniería de
Telecomunicación
PRÁCTICAS DE ARQUITECTURAS
DISTRIBUIDAS
Práctica 1: SERVIDOR APACHE, HTTP
Y DOCUMENTOS HTML
Profesores:
Javier Vales Alonso
Esteban Egea López
Natalio López Martínez
1
1. OBJETIVOS
•
•
•
•
•
•
Comprender el funcionamiento de un servidor HTTP.
Comprender cómo se organizan los documentos en un servidor web.
Dotar de mecanismos de control de acceso al servidor.
Entender la estructura, la sintaxis y los elementos que componen una página
HTML.
Comprender la interrelación de HTML con HTTP y URL en la arquitectura del
WWW.
Interpretar HTML como aplicación de SGML.
2. INTRODUCCIÓN
Un servidor HTTP o servidor web es una aplicación que se encarga de servir contenidos
usando el protocolo HTTP (Hyper Text Mark-up Language). El servidor acepta
peticiones del cliente y devuelve los documentos HTML apropiados. Hay, además, una
serie de tecnologías complementarias que se encargan de aumentar la capacidad del
servidor más allá de su habilidad para entregar páginas HTML estándar, como son CGI
(Common Gate Interface), SSI (Server Side Includes) o PHP (Hypertext Preprocessor),
permitiendo dotar de contenido dinámico a los documentos HTML.
El servidor Apache (http://www.apache.org) ha sido el servidor web más popular desde
1996, actualmente se utiliza en más del 50% de los sitios web en Internet. Es una
aplicación software de libre distribución que implementa un servidor HTTP, disponible
para varios sistemas operativos, fundamentalmente UNIX, aunque hay versiones para
Windows NT. El código fuente está disponible.
Aunque hay una implementación para Windows NT, el servidor Apache está pensado y
diseñado para UNIX. Además, en estas prácticas se usará Linux, así que se describirá su
funcionamiento en un entorno UNIX.
Apache es un proceso que se ejecuta en un entorno UNIX. Es un "demonio" que se
ejecuta en segundo plano y está continuamente escuchando el puerto 80, al menos en su
configuración por defecto, esperando a atender peticiones HTTP.
Apache 1.3 es un servidor web "pre-forking", lo que quiere decir que hay un único
proceso de control responsable de lanzar varios procesos "hijos", los cuales se encargan
de escuchar un puerto determinado (habitualmente el 80) y atender peticiones. Apache
se encarga de mantener más de un proceso servidor (procesos "idle"), atentos a las
peticiones, de esta manera hay varios procesos listos para servir y se evita el tener que
crear nuevos hijos cada vez que llega una petición.
El funcionamiento es el siguiente: cuando se ejecuta Apache, se crea un proceso padre,
de control, que atiende peticiones al puerto 80. Este lanza varios procesos hijos que se
encargan de escuchar en ese mismo puerto y atender peticiones.
2
El funcionamiento de estos procesos y las reglas que tienen que aplicar a las peticiones
vienen determinados por unas directivas que se incluyen en un fichero de
configuración. Estas directivas determinan, entre otras cosas, los directorios en los que
se encuentran los documentos que van a ser servidos, el control de acceso que se le
aplicará a las peticiones, etc.
Es conveniente conocer el usuario bajo el cual se ejecutan los procesos y los privilegios
que tiene. El proceso padre se ejecuta como root puesto que se tiene que unir (bind) al
puerto 80, que es un puerto privilegiado en UNIX. Sin embargo, los procesos hijos se
ejecutan bajo un usuario menos privilegiado (normalmente el usuario www-data), para
evitar que un proceso con privilegios de root atienda peticiones que llegan a través de la
red.
Las directivas del fichero de configuración que establecen los privilegios de los usuarios
hijos de Apache. De esta manera, el proceso padre cuando crea los hijos les asigna el
usuario www-data, el cual prácticamente no tiene privilegios sobre los recursos del
sistema. Los procesos hijos tienen que tener permiso para leer los contenidos que se van
a servir pero ninguno más aparte de estos.
Los privilegios que establecen las anteriormente mencionadas directivas son también
los que heredarán los scripts CGI, así que las llamadas al sistema y a los recursos que
utilice el código de los scripts se ejecutarán con muy pocos privilegios.
En conclusión, el servidor Apache es un "demonio" que se ejecuta con privilegios de
root y se asigna al puerto 80. Una vez hecho esto, crea varios procesos hijos con los
privilegios de un usuario www-data, que se quedan escuchando el puerto 80 y atienden
las peticiones, sirviendo aquellos documentos para los cuales el usuario www-data tenga
privilegios de lectura.
Las peticiones se realizan mediante el protocolo HTTP. Es decir, el cliente le envía al
servidor un mensaje del tipo:
GET /index.html HTTP/1.0
Este mensaje le indica al servidor (uno de los procesos “hijo”) que le solicitan el
documento index.html que se encuentra en el directorio raíz de los documentos. Una
cuestión que surge inmediatamente es: ¿Cuál es el directorio raíz?
El directorio raíz es el lugar en el que se encuentran los documentos HTML que puede
servir el sitio. En el se encuentra el árbol de directorios con documentos disponibles.
Una petición del tipo www.midominio.com/index.html significa que se le está pidiendo
al sitio el documento index.html que se encuentra en el directorio raíz.
Mientras que una petición del tipo www.midominio.com/usuario/index.html, le solicita
el documento index.html que se encuentra en el directorio usuario, que a su vez estará
en el raíz.
El directorio raíz puede ser cualquier directorio de la máquina sobre la que se ejecuta
Apache. En el fichero de configuración hay una directiva (DocumentRoot) que indica
este directorio. Por ejemplo, si el valor de esta directiva es /usr/doc/htdocs, el proceso
servidor buscará un fichero llamado index.html en este directorio. Si este documento se
3
encuentra en este directorio, lo devolverá al cliente, con lo que habrá completado la
petición. En caso contrario devolverá un mensaje de error.
Toda la información relativa al servidor Apache se puede encontrar en:
http://httpd.apache.org/docs/
3. DESARROLLO DE LA PRÁCTICA
3.1 Configuración del servidor
En la práctica, la mayoría de las distribuciones de Linux incluyen Apache y lo instalan
junto con el resto del sistema operativo. La diferencia entre distribuciones es la ruta
dónde se instalan los archivos. Por ejemplo, en Debian, los archivos de configuración se
guardan en el directorio /etc/apache/.
En la práctica utilizaremos la instalación de Apache que proporciona Debian.
Una vez instalado el servidor, hay que configurar su funcionamiento. Apache se
configura mediante un único fichero de texto. Estos ficheros incluyen órdenes, llamadas
directivas, que especifican el modo de funcionamiento del servidor. Cada directiva
especifica el funcionamiento de una característica del servidor. Cada directiva tiene a su
vez una serie de opciones. El servidor, al iniciarse, lee el fichero de configuración,
establece su modo de funcionamiento de acuerdo con ellos y espera a que le lleguen
peticiones. Los ficheros de configuración sólo son leídos al iniciar el servidor, por ello,
si se modifica alguna directiva, hay que parar el servidor y volver a reiniciarlo para
que surtan efecto las modificaciones.
El fichero de configuración se encuentra en el directorio /etc/apache/ y se llama
httpd.conf. Estos ficheros contienen la configuración por defecto del servidor.
Antes de seguir adelante: HAGA UNA COPIA DE SEGURIDAD antes de modificar
alguno de estos ficheros. De ese modo siempre podrá recuperar los cambios. Si en algún
momento modificamos algo en los ficheros de configuración que perjudica el
funcionamiento del servidor, siempre podemos recurrir a estos ficheros que guardan la
configuración por defecto del servidor, para restaurar los cambios.
Las directivas que configuran el funcionamiento del servidor se encuentran en este
fichero que es leído por el servidor cada vez que se inicia. Cualquier modificación que
se haga en ellos afecta al funcionamiento del servidor. Los usaremos para configurar el
servidor a nuestro gusto.
Abra en httpd.conf con un editor de texto. Así podrá hacerse una idea de las directivas
del servidor.
Como puede comprobar el fichero httpd.conf consiste en una serie de líneas de texto,
algunas de las cuales están precedidas por el carácter #. Este carácter sirve para hacer
comentarios, el servidor no tiene en cuenta lo que aparece detrás de ellas. El resto son
directivas de Apache. El fichero incluye una amplia descripción de cada directiva, lo
cual le será muy útil.
4
Además de directivas, aparecen los contenedores. Estos se diferencian de las directivas
en que aparecen entre los caracteres <>. Un contenedor sirve para definir un contexto
de aplicación de las directivas. Por ejemplo, el contenedor <Directory
“/var/www/user”> indica que todos las directivas que aparecen entre el inicio y el final
(</Directory>) se aplican sólo a ese directorio.
En la dirección http://httpd.apache.org/docs/mod/index.html encontrará una lista de las
directivas de Apache. Allí se incluye una descripción de las mismas, así como de las
opciones que se le pueden aplicar y del contexto en el que se usan.
La sintaxis es muy importante, así que utilice la dirección anterior para comprobar que
ha escrito correctamente una directiva si tiene dudas. Los espacios en blanco, así como
los saltos de línea y los retornos de carro no son tenidos en cuenta, por lo que puede
usarlos para mejorar la legibilidad cuando modifique el fichero.
Antes de empezar a modificar el fichero httpd.conf, hablaremos sobre una cuestión
relativa a la seguridad.
Permisos para los directorios de Apache
El directorio /var/www, es el directorio raíz, es decir, es donde están los documentos
que pueden ser servidos, puede ser modificable por otros usuarios.
Los documentos HTML que coloque allí deben poder ser leídos por otros usuarios
aparte de root ya que, como hemos dicho anteriormente, los procesos hijos creados por
Apache, se ejecutan como www-data. Entonces, el usuario de www-data debe poder
tener como mínimo permiso de lectura.
Configuración del entorno
Para configurar el entorno, empezaremos a modificar httpd.conf. Habitualmente con la
configuración por defecto el servidor ya puede funcionar perfectamente.
El fichero httpd.conf está dividido en tres secciones:
• Sección 1. Configuración del entorno. Directivas relacionadas con parámetros del
propio servidor.
• Sección 2. Servidor principal. Directivas que controlan el acceso a los documentos
servidos.
• Sección 3. Virtual hosts. Directivas que afectan a servidores virtuales, si se crearan.
En nuestro caso no los crearemos así que no habrá que modificarla.
Las directivas de la Sección 1 configuran aspectos de rendimiento de Apache. EN
ESTA PRÁCTICA NO SE MODIFICARÁN. A título informativo, le resumimos las
más importantes.
ServerType. Afecta a como se ejecuta el servidor. Antes había dos posibles modos de
funcionamiento, hoy en día solo se usa el modo por defecto: standalone.
ServerRoot. Indica el directorio raíz de Apache, dónde se encuentra el ejecutable
principal.
5
Timeout, KeepAlive, MaxKeepAliveRequests, KeepAliveTimeout. Sirven para configurar
el rendimiento servidor. En principio las dejaremos por defecto. Habría que ver como
rinde el servidor en un entorno real para ajustar estos parámetros.
MinSpareServers, MaxSpareServers, StartServers, MaxClients, MaxRequestsPerChild.
Estas directivas son las que regulan el tamaño de los recursos consumidos por Apache.
Controlan cuantas instancias del servidor (hijos) se crearán para atender peticiones, el
número máximo de conexiones que se aceptarán, etc. Apache trata de adaptarse a las
condiciones, creando y eliminando hijos en función de las condiciones, manteniéndose
dentro de los parámetros indicados. Se trata de equilibrar el consumo de memoria y
CPU con el rendimiento en número y rapidez de peticiones atendidas. En general, la
configuración por defecto es aceptable. Lo que hay que hacer es observar las
condiciones del servidor e ir variándolos para adaptarse.
Como ha podido observar, es mejor dejar la configuración por defecto para el entorno
de Apache. Hay que elaborar estadísticas de funcionamiento del servidor (número
máximo de peticiones concurrentes, tiempo necesario para establecer una conexión,
consumo de recursos del procesador, etc.) y actuar en consecuencia para corregir.
Servidor principal
El siguiente grupo de directivas regula el funcionamiento del servidor principal. El
concepto de servidor principal aparece porque Apache permite definir directorios
virtuales, es decir, permite que el mismo servidor atienda peticiones dirigidas a
diferentes direcciones IP o permite que un mismo sitio (definido por una dirección IP)
pueda tener asignados diferentes nombres de dominio, atendidos por el mismo servidor.
Los servidores virtuales vienen definidos por el contenedor <VirtualHost>. En esta
práctica no se estudiarán directorios virtuales.
Veamos las directivas disponibles:
Port. Indica el puerto que se servirá. Se dejará el puerto por defecto, el 80.
User, Group. Indican el usuario y el grupo bajo el cual se ejecutarán los procesos
servidores. Debe tener como valor www-data.
Los procesos servidores se ejecutarán bajo este usuario así que sólo tendrán acceso a los
recursos permitidos para él.
ServerAdmin. Indica una dirección de correo a la que hay que dirigir las cuestiones
cuando hay un problema con el servidor.
ServerName. El nombre que usará el servidor, si este es distinto del nombre real. Este
nombre debe coincidir con la entrada en el DNS.
DocumentRoot. Indica el directorio raíz a partir del cual se servirán documentos. Por
defecto es /var/www. Hay que tener en cuenta que cualquier petición a un documento
que no esté bajo este directorio no se servirá. Por ejemplo, una petición a
www.midominio.com/opt/mm.html buscará el documento mm.html en el directorio opt a
partir del raíz indicado en esta directiva, es decir /var/www/opt.
6
A partir de este punto, empiezan a aparecer contenedores:
•
<IfModule mod> indica que si el módulo mod ha sido instalado, se procesen las
directivas incluidas en él.
•
<Directory dir> delimita el directorio para el cual se aplicarán las directivas.
Permite aplicar controles de acceso basados en directorios, es decir, quién y
cómo se puede acceder a un determinada directorio. Del control de acceso
hablaremos más adelante.
El primer contenedor que aparece es <Directory />. Establece las directivas que se
aplicarán a todos los subdirectorios a partir del raíz. Esto sirve para aplicar condiciones
de acceso y funcionamiento muy restrictivas que luego serán sobreescritas caso a caso.
Así tendremos el comportamiento del servidor controlado para cualquier directorio al
que se intente acceder.
El siguiente contendor es <Directory “/var/www”>. Con las directivas aquí incluidas se
sobreescriben las que el contenedor <Directory /> establecía. Así, mientras que el
primero sólo permite para cualquier directorio la opción FollowSimLinks, este nuevo
contenedor añade más opciones como son Indexes y MultiViews. Diríjase a la
documentación de Apache y de las directivas para saber en que consisten esas opciones.
Sigamos con las directivas:
DirectoryIndex. Esta directiva aparece dentro de un contenedor <IfModule mod_dir.c >.
Permite indicar el nombre de la página HTML que aparecerá como índice por defecto,
en orden de preferencia de derecha a izquierda. Añada:
DirectoryIndex index.html index.htm default.html
El resto de directivas se refieren a opciones para configurar los ficheros de registro.
Déjelas por el momento y busque la siguiente directiva:
Alias. Esta directiva también aparece dentro del contenedor <IfModule mod_alias.c>.
Sirve para indicar que ciertos directorios contienen documentos para ser servidos
aunque no aparezcan dentro del directorio raíz (el especificado por DocumentRoot).
Por ejemplo, la directiva Alias /icons/ “/usr/local/web/apache/icons” está diciendo
cuando haya peticiones al directorio icons los documentos sean buscados en
/usr/local/web/apache/icons.
Entonces, si no hubiera un Alias, la petición www.midominio.com/icons/foto.gif
provocaría que el servidor buscara un fichero llamado foto.gif en el directorio
/var/www/icons, es decir, bajo el raíz. Como sí que hay un alias, el fichero se busca en
/usr/local/web/apache/icons.
Después de esta directiva aparece un contenedor correspondiente al directorio nombrado
en la directiva que establece el control de acceso al directorio.
3.2 Ejecución del servidor
7
En este punto ya tenemos una primera configuración del servidor y podemos ejecutarlo.
El script apachectl permite ejecutar el servidor si se ha instalado a partir de la
compilación. En nuestro caso, como el servidor se ha instalado con Debian, tenemos un
script de arranque en /etc/init.d.
• Ejecute el siguiente comando:
%/etc/init.d/apache configtest
Este comando sirve para comprobar que la sintaxis de los ficheros de configuración es
correcta. Si hubiera cometido un error de sintaxis al escribir las directivas aparecería un
mensaje de error.
Para ejecutar el servidor:
%/etc/init.d/apache start
Ahora el servidor ya está corriendo.
• Compruebe que todo funciona correctamente. Para ello abra un navegador web y
pida la URL http://localhost.
Para detener el servidor:
%/etc/init.d/apache stop
Para reiniciar el servidor (cuando está corriendo) hay varios métodos, restart o graceful.
•
Cree un par de documentos HTML y cópielos a diversos directorios bajo el raíz
de los documentos. Compruebe que los puede obtener con el navegador.
•
Asigne permisos 740 a los documentos HTML e intente obtenerlos.
3.3 Documentos de usuario
En el apartado anterior acaba de comprobar que los documentos que puede servir
Apache deben estar en el directorio raíz que se indique en la directiva DocumentRoot.
Esta forma de organizar los documento es adecuada para un sitio web en el que hay un
solo administrador que se encarga de publicar los contenidos.
El problema es que deja de ser práctico cuando hay muchos usuarios que necesitan
publicar documentos. Piense en la Universidad, por ejemplo, si cada profesor quiere
publicar contenidos de su asignatura, tendría que enviárselos al administrador de la web
para que los colocara y organizara en directorios bajo el raíz. ¡Y hay más de 500
profesores en la UPCT!. Además tendría que actualizarlos cada cierto tiempo, etc.
Para solucionar este problema el usuario debe ser capaz de poder publicar y organizar
los documentos visibles en la web sin necesidad del administrador. La solución es
simple: cada usuario tiene asignado un directorio en el que puede colocar documentos
que serán servidos, aunque no se encuentren bajo el DocumentRoot.
8
Apache permite designar estos directorios mediante la directiva UserDir cuyo valor es
public_html.
Cuando
al
servidor
le
lleguen
peticiones
del
tipo
www.midominio.com/~usuario/index.html, el servidor buscará dentro del directorio
personal del usuario /home/usuario/public_html el archivo solicitado. Es decir, cuando
en la URL de la petición a continuación del dominio aparezca el símbolo ~ seguido de
un nombre de usuario que exista en el sistema, el servidor buscará el documento pedido
bajo el directorio public_html del usuario.
Ejemplos:
www.ait.upct.es/~eegea/productos.html devolverá el fichero productos.html que se
encuentra en /home/eegea/public_html.
www.ait.upct.es/~jvales/imagenes/foto.jpg devolverá el fichero foto.jpg que se encuentra
en el directorio /home/jvales/public_html/imagenes.
• Cree un usuario (con el comando adduser).
• Coloque documentos HTML en el public_html del usuario y compruebe que
puede visualizarlos con el navegador.
3.4 Ficheros de registro
• Abra el fichero /var/log/apache/error_log.
En este fichero se registra cualquier error que se produce en el servidor. Este fichero se
utiliza principalmente para depurar los scripts que colgamos en el sitio web. Si tiene que
programar scripts CGI o PHP, el fichero error_log es fundamental puesto que cualquier
mensaje de error que produzca el script se almacena en ese fichero. Apache proporciona
varias directivas para configurar estos ficheros.
Los ficheros de registro son muy importantes también a la hora de administrar el
servidor. El fichero access_log registra todos los accesos al servidor por lo que resulta
muy útil para obtener estadísticas procesándolo adecuadamente.
3.5 Control de acceso
Apache usa 3 criterios para gestionar quién puede acceder a los contenidos:
autorización, autentificación y control de acceso. Resumidamente, autentificación es la
verificación de que una persona es quien dice ser, autorización consiste en comprobar si
esa persona puede acceder al recurso. El control de acceso es más general que la
autorización, consiste en decidir si un recurso puede ser accedido en función de algún
parámetro adicional, además de la identidad del usuario. Por ejemplo, una persona
puede estar autorizada a acceder a un recurso, siempre y cuando lo haga entre las 8 y las
16 horas.
La autentificación y autorización son prácticamente indistinguibles en Apache. El
servidor usa 3 mecanismos para llevarla a cabo:
1. Autentificación básica.
2. Autentificación por digest
3. Autentificación en bases de datos
Sólo estudiaremos el primer tipo. Cuando se intenta acceder a un recurso protegido, el
servidor manda un mensaje al navegador diciendo que se necesita autentificación. Si el
navegador está preparado para ello, solicitará la autenticación al usuario y la enviará al
9
servidor. Como el protocolo HTTP no guarda información de estado, cada vez que se
intente acceder al mismo dominio de autentificación (es decir, al recurso protegido), el
servidor volverá a pedir credenciales. Sin embargo, el navegador almacena esta
información y las proporciona automáticamente. Si se cambia de dominio o se cierra el
navegador, el proceso volvería a comenzar.
Autentificación básica
La autentificación básica consiste en crear un fichero de texto en el que se almacenará
un nombre de usuario y una contraseña, para los usuarios que pueden acceder a un
recurso. Una vez creado, se configura el servidor para que pida autentificación cuando
se acceda a un determinado recurso. Esto se hace por medio de dos sistemas:
• Incluyendo las directivas adecuadas en un contenedor, como <Directory>. Tenga en
cuenta que existe el contenedor <Location> cuyo contexto es un URL, por lo que
puede proteger un documento individualmente.
• Creando un fichero .htaccess en el directorio que va a ser protegido.
Para crear un fichero de contraseñas utilizará la utilidad htpasswd. Este programa
genera un fichero en el que almacena un nombre de usuario y su clave cifrada.
• Ejecute:
% htpasswd –c /etc/apache/claves nombreusuario
Le pedirá que introduzca la contraseña dos veces. El parámetro c sirve para crear un
fichero por primera vez. Si quiere añadir otro usuario al fichero utilice el mismo
comando sin ese parámetro.
IMPORTANTE: Este fichero debe estar situado en un directorio con los permisos
adecuados y sólo debe poder ser leído por el servidor. Cuanto menor sea el número de
usuarios que tienen acceso a él mejor. Modifique sus permisos adecuadamente.
Ahora vamos a proteger un directorio.
•
Cree un directorio protected bajo /var/www.
•
Abra el fichero httpd.conf. Introduzca las siguientes directivas:
<Directory “/var/www/protected”>
AuthType Basic
AuthName “mi dominio”
AuthUserFile /etc/apache/claves
Require valid-user
</Directory>
Con estas directivas lo que está diciendo es que al directorio especificado se le aplique
una autentificación básica, el nombre del dominio para esa configuración, el fichero en
el que hay que buscar el usuario y, por último, que condiciones son necesarias para que
se aplique la autentificación
•
•
Reinicie el servidor e intente acceder a un documento del directorio protected.
Vuelva a intentarlo para comprobar como el navegador no le vuelve a pedir las
credenciales.
10
•
Añada otro usuario al fichero de contraseñas.
La directiva Require permite definir qué usuarios del fichero de contraseñas están
autorizados. Modifique la directiva para que sólo permita el acceso a un usuario:
Require valid-user
Cuando muchos usuarios comparten el acceso a un recurso hay un método más eficiente
para garantizar el acceso: crear un grupo (igual que en UNIX). Para ello, cree un fichero
de texto /etc/apache/ficherogrupos con la siguiente sintaxis:
nombregrupo: usuario1 usuario2
El fichero debería estar en el mismo directorio que las contraseñas y similarmente
protegido. Incluya las siguientes directivas, en el directorio que se va a proteger, de
manera que quede:
<Directory “/var/www/protected”>
AuthType Basic
AuthName “mi dominio”
AuthUserFile /etc/apache/claves
AuthGroupFile /etc/apache/ficherogrupos
Require group nombregrupo
</Directory>
•
Compruebe que el directorio sigue correctamente protegido.
De esta manera ya podemos asignar recursos a grupos y protegerlos. El otro método
para proteger un directorio es crear un fichero .htaccess en el directorio que va a ser
protegido.
Así se puede permitir que un usuario proteja como crea conveniente su propio directorio
sin que sea necesario modificar el fichero httpd.conf. Lo que hace el servidor Apache
cuando va a servir un documento es comprobar su lista de <Directory> para ver las
directivas que le va a aplicar.
Además busca los ficheros .htaccess que haya en el directorio del documento y todos
los precedentes empezando por el raíz. Las directivas especificadas en esos ficheros se
van combinando, de manera que Apache aplica a un documento las directivas
encontradas en todos los ficheros .htaccess precedentes en el árbol de directorios así
como las del fichero del propio directorio (y las definidas por los contenedores en
httpd.conf).
Este es un proceso que puede ser muy costoso puesto que para cada petición Apache
tiene que procesar estos ficheros. Para controlarlo se usa la directiva AllowOverride.
Consulte en la documentación el uso de esta directiva. Como puede comprobar Apache
deshabilita por defecto los ficheros .htacccess:
<Directory “/”>
AllowOverride None
</Directory>
De esta manera, ni siquiera se buscan los ficheros .htaccess al servir documentos. Si
esta directiva se establece a AllowOverride AuthConfig se permite el uso de directivas
11
de control de acceso en los ficheros .htaccess y Apache los procesará. Esta directiva
permite habilitar otro tipo de directivas en esos ficheros. Es conveniente tener claro qué
es lo que se permite al habilitar cierto tipo de directivas en ficheros que introducen los
usuarios. Consulte siempre la documentación de Apache antes de modificar las directiva
AllowOverride si quiere evitar problemas de seguridad.
Nosotros permitiremos que sólo se puedan usar los .htaccess en el directorio protected y
sólo para directivas de control de acceso.
• Para ello borre las directivas relativas al directorio protected en httpd.conf y
sustitúyalas por las siguientes:
<Directory “/var/www/protected”>
AllowOverride AuthConfig
</Directory>
•
Ahora cree un fichero de texto con las siguientes directivas:
AuthType Basic
AuthName “mi dominio”
AuthUserFile /etc/apache/claves
AuthGroupFile /etc/apache/ficherogrupos
Require group nombregrupo
•
Salve el fichero como .htaccess. Apache sólo permite este nombre, si quiere
darle otro nombre debe modificar la directiva AccessFileName. Compruebe los
permisos del fichero y asígneles los adecuados.
•
Intente acceder al directorio desde el navegador y compruebe que la
autentificación funciona correctamente. Compruebe también que se puede
cambiar las directivas del fichero .htaccess y se aplican sin tener que reiniciar el
servidor.
Hay que decir que la autentificación básica en Apache no es segura en ningún sentido:
auque las claves se almacenen cifradas, se transfiere desde el navegador sin cifrar, así
como todo el contenido al que se accede.
Una vez resuelto el problema de la autentificación, ahora hay que crear reglas de control
de acceso. Esto se puede hacer con las directivas Order, Deny, Allow y Satisfy. Consulte
la documentación sobre estas directivas.
Allow y Deny permiten controlar el acceso en función del nombre del host, de la
dirección del host y del nombre de la máquina. Estas directivas se usan en conjunción
con Order, que especifica cual de las anteriores directivas se evalúa primero.
Compruebe como se han usado en los contenedores del fichero httpd.conf .
• En el contenedor <Directory "/var/www"> sustituya las directivas Deny y Allow
por las siguientes:
Order allow,deny
Allow from IPaddress
En donde IPaddress es la dirección IP de uno de sus compañeros, intente acceder desde
ese ordenador y desde otros para comprobar que la directiva funciona.
12
Si se establece Order Allow, Deny se evalúan antes las directivas Allow que las Deny.
Además, el acceso está negado por defecto. Y viceversa con Order Deny,Allow: primero
las Deny y el acceso es libre por defecto.
•
Vuelva a permitir el acceso a todo el mundo en /var/www.
3.6 Ejercicio
Configure su servidor para que sea ejecutado por el usuario web con el grupo grupoweb.
Su servidor será utilizado por una empresa para alojar su sitio web. El nombre de esta
empresa es upct. La empresa quiere que al introducir su dominio en un navegador
aparezca su página principal que se llamará main.html. Además, quiere incluir un
directorio privado al que sólo puedan acceder máquinas del su red local (el laboratorio)
y siempre y cuando el usuario esté registrado con una contraseña y sea miembro de un
grupo llamado autores. La empresa quiere que el control de acceso a este directorio
pueda ser modificado sin tener que depender del administrador del servidor.
Configure su servidor para cumplir todos los requisitos de la empresa. Tenga en cuenta
los permisos de los diferentes elementos.
3.7. HTML mediante editor de textos.
Cree una página web (pagina.html) donde sólo debe incluir el mensaje “Mi primera
pagina web!!”. Utilice un editor de texto (ASCII) convencional, por ejemplo, emacs o
vi. De acuerdo a lo que aprendió en clases de teoría, debe crear esta página con su DTD,
el HEAD y el BODY. Una vez la tenga preparada, grabe la página en el directorio
public_html de su usuario de AD en el servidor labit601.upct.es. Si no existe ese
directorio, debe crearlo.
•
Desde mozilla podrá acceder a la página con la URL:
http://labit601.upct.es/~usuario/pagina.html
Donde debe cambiar usuario por lo que corresponda. Observará que carga su página
HTML, vía protocolo HTTP.
IMPORTANTE: Observe la URL que ha utilizado para solicitar el documento:
http://labit601.upct.es/~usuario/pagina.html
En esta URL se le indica al navegador que, mediante el protocolo HTTP (http://), le
solicite al servidor labit601.upct.es el documento indicado. El navegador establecerá
una conexión TCP con el servidor del laboratorio (labit601.upct.es) y posteriormente
enviará un mensaje HTTP para solicitar dicho documento.
Observe la siguiente URL:
file:///home/usuario/pagina.html
ESTE ES UN ERROR MUY COMÚN en el desarrollo de esta práctica. Esta URL es
la URL que verá en su navegador si pincha en el fichero HTML que ha creado
previamente. Esta URL indica que desde el sistema de ficheros de la máquina local
(file://) se abra el documento que se encuentra en /home/usuario/pagina.html.
13
En este caso, ni siquiera abre una conexión de red ni se utiliza el protocolo HTTP. El
navegador se limita a abrir un documento HTML local.
Si introduce la URL correcta, el Apache del servidor labit601 automáticamente
traduce la parte de la página de la URL (/~usuario/pagina.html) por la ruta:
$HOMEUSUARIO/public_html/pagina.html.
En este punto, recuerde que el criterio y la forma de traducción entre la página indicada
por la URL, y los archivos locales, es totalmente dependiente del servidor. Por tanto, es
importante entender que diferentes URL pueden ser finalmente la misma página (a
criterio del servidor).
Para finalizar este apartado, comprobará el intercambio de mensajes que se produce
entre cliente y servidor cuando se utiliza el protocolo HTTP con documentos HTML.
• Ejecute Ethereal y compruebe el intercambio de mensajes con el servidor
labit601 que se produce cuando solicita la página anterior.
• ES IMPORTANTE QUE ESTUDIE CON DETALLE EL INTERCAMBIO DE
PAQUETES ENTRE CLIENTE Y SERVIDOR, PARA ESTE EJEMPLO
SENCILLO.
• Modifique la página que ha creado e introduzca al menos una etiqueta <img>.
El atributo src de la etiqueta debe indicar la URL de una imagen externa al
servidor Apache del laboratorio. Por ejemplo: <img
src=www.google.com/images/hp0.gif>
• Solicite de nuevo su página y capture el intercambio de mensajes mediante
Ethereal.
• OBSERVE DETENIDAMENTE EL INTERCAMBIO DE MENSAJES QUE
SE HA PRODUCIDO EN ESTA OCASIÓN. COMPRUEBE CUANTAS
PETICIONES HTTP Y A QUE DIFERENTES SERVIDORES VAN
DIRIGIDAS EN ESTA OCASIÓN.
3.8. Pruebas con el protocolo HTTP
Ahora, debe realizar una prueba sin utilizar mozilla: Usando un terminal (telnet),
conéctese al puerto del servidor web de labit601 (80). Con esta acción, está
estableciendo una conexión TCP directa con el puerto 80 del servidor.
• Escriba:
GET / HTTP/1.0
•
[Doble retorno de carro]
Observe el resultado, debe saber distinguir los tres posibles componentes de una
respuesta HTTP:
1. La línea de estado: Versión HTTP + código + explicación del código en modo
texto.
2. Las cabeceras: Varios pares (Parámetro: valor).
3. El objeto transferido: Una página HTML, una imagen, un fichero de datos, etc.
14
•
Con la salida del comando anterior, busque que cabeceras están presentes
en la respuesta, y a qué se corresponde la página obtenida.
•
Repita la operación con el comando:
GET /index.html HTTP/1.0
Ahora el servidor entiende que usted solicita la página llamada index.html. Si observa
detenidamente la respuesta, comprobará que es idéntica a la anterior. En efecto, si no se
solicita una página determinada, Apache retorna index.html por defecto.
•
Por último, si desea acceder a su pagina.html, debe proceder con la orden:
GET /~usuario/pagina.html HTTP/1.0
Ahora, verifique que el contenido del objeto se corresponde con lo que ha escrito usted
en pagina.html.
3.9. Comprobación de la conformidad de los documentos
HTML es un lenguaje definido usando otro lenguaje: El SGML. Mediante SGML
especificamos un DTD para el lenguaje HTML 3.2, otro para HTML 4.0, etc. Es
importante poder comprobar si una página es "conforme" a su DTD (si está bien
declarada de acuerdo a la semántica y la sintaxis del lenguaje). Para ello, existen
aplicaciones denominadas parsers, que realizan dichas comprobaciones. Para
comprobar la conformidad de sus páginas, puede usar el parser on-line del consorcio
del WWW, ubicado en http://validator.w3.org.
•
Debe enviar la pagina que creó a dicho parser (indicando la URL de la página),
y comprobar si la sintaxis es adecuada.
En primera instancia el parser le dirá que no es posible validar la URL, puesto
que no sabe que juego de caracteres utiliza. En múltiples ocasiones, éste se indica a
través de un parámetro de HTTP (en una de las cabecera). Sin embargo, si el servidor no
está configurado para ello, o se desea indicar otra familia de caracteres, puede hacerlo a
través del elemento <meta> de la cabecera (<head>) de HTML, del siguiente modo:
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8”>
•
Ahora, edite su página, incluyendo este elemento, y vuelva a comprobar si es
HTML 3.2 válido. En caso de que exista algún error, el parser le ayudará a
encontrarlo.
•
Tiene a su disposición en http://labit601.upct.es/~ad/ejemplos/Tema2 los
ejemplos presentados en teoría correspondientes al lenguaje HTML. Estúdielos
y compruebe que entiende la estructura del elemento presentado en cada uno.
Verifique si son conformes a la especificación HTML 3.2. En caso de que
alguno no lo sea, debe encontrar el problema y corregirlo.
15
Descargar