Práctica 4 GESTIÓN Y UTILIZACIÓN DE REDES LOCALES Curso 2006/2007 Instalación del servidor web Apache en Linux 1. Objetivos de la práctica El objetivo de la práctica es aprender las bases para instalar y configurar de forma segura un servidor web en su versión básica, pero con posibilidad de transferencias seguras mediante SSL (Secure Sockets Layer): • Identificar y diferenciar los diferentes ficheros de configuración del apache. • Aprender la utilidad de las principales directivas del fichero httpd.conf. • Aprender a realizar un control de acceso básico a las diferentes áreas del servidor. • Aprender los requisitos necesarios para instalar y poner en funcionamiento un servidor con SSL. Para ello utilizaremos el servidor web apache, que es uno de los más utilizados actualmente en Internet desde hace años. Además, posee la ventaja de estar disponible para varios sistemas operativos, como Unix y Windows. Para proporcionar la posibilidad de SSL utilizaremos el paquete mod_ssl, por su mayor facilidad de instalación y mejor documentación que el paquete Apache-SSL 2. Instalación del servidor Aunque la última versión de Apache disponible es la 2.0.54, para poder trabajar con SSL debemos utilizar la 1.3.33, que es la última para la que está disponible el módulo criptográfico mod_ssl. Para la práctica podéis descargarla de la página web de la asignatura. Por supuesto está también disponible en la propia organización: http://www.apache.org/dist/. Si queremos que tenga posibilidad de utilizar transferencias seguras con SSL necesitaremos al menos dos paquetes más: mod_ssl y OpenSSL, todos disponibles en nuestro servidor. En total: Paquete: Apache Versión: 1.3.33 Web: http://www.apache.org Archivo: apache_1.3.33.tar.gz Paquete: mod_ssl Versión: 2.8.8-1.3.33 Descripción: la interfaz Apache con OpenSSL Web: http://www.modssl.org Archivo: mod_ssl-2.8.8-1.3.33.tar.gz Paquete: OpenSSL Versión: 0.9.6b Descripción: El Toolkit Open Source para SSL/TLS Web: http://www.openssl.org Archivo: openssl-0.9.6b.tar.gz 2 Podríamos instalar sólo el paquete Apache, con lo cuál obtendríamos sólo un servidor normal sin SSL, y posteriormente volver a instalarlo con SSL, pero como resultaría bastante aburrido instalarlo dos veces durante la misma práctica lo haremos directamente todo a la vez. El primer paso será descomprimir los paquetes y ejecutar el tar para situar los archivos en sus directorios. Se recomienda hacer la instalación en /usr/local/apache: $ $ $ $ $ mkdir /usr/local/apache cd /usr/local/apache gzip –d –c apache_1.3.24.tar.gz | tar xvf – gzip –d –c mod_ssl-2.8.8-1.3.24.tar.gz | tar xvf – gzip –d –c openssl-0.9.6b.tar.gz | tar xvf – Configurar y compilar la librería OpenSSL: $ cd openssl-0.9.6b $ ./config $ make (que tarda un ratito …) $ cd .. Por último hay que aplicar las extensiones fuente mod_ssl y los parches al Apache y compilar Apache con mod_ssl y OpenSSL: $ cd mod_ssl-2.8.8-1.3.24 $ ./configure --with-apache=../apache_1.3.24 --with-ssl=../openssl-0.9.6b --prefix=/usr/local/apache $ cd .. $ cd apache_1.3.24 $ make (tarda un ratito …) $ make certificate $ make install Durante la instalación, en la parte relativa al certificado, se os pedirá la PEM phrase. Esto es un password que debereis RECORDAR para poder lanzar más tarde el servidor con la opción de Secure Sockets Layer (SSL), así como para poder leer las claves generadas. Al hacer el “make certificate” se pueden especificar varios tipos, en nuestro caso el adecuado es “test”, que es el que toma por defecto si no le indicamos ninguna opción. Los valores que va pidiendo a continuación para generar el certificado no son críticos, con excepción del “Common Name” para el que es conveniente especificar el nombre de dominio del servidor, en nuestro caso “ptxolXX.disca.upv.es”. Una vez obtenido el certificado, la orden “make certificate VIEW=1” permite ver los datos generados. El paso siguiente será comprobar que los permisos de los directorios y ficheros del Apache están como dicen las recomendaciones de seguridad: Generalmente, Apache se inicia como usuario root, y posteriormente atiende las peticiones recibidas como el usuario establecido por la directiva User del fichero de configuración httpd.conf. Como con cualquier orden que ejecuta root, hay que tener cuidado de que esté protegido frente a modificaciones por otros usuarios. No sólo los ficheros deben ser modificables sólo por root, sino también los directorios y los padres de estos directorios. Por ejemplo, si situamos la raíz del servidor en /usr/local/apache, este directorio debe crearse como root. 3 3. Arranque y parada del servidor Si se desea que el servidor escuche en el puerto 80 (el habitual), el cual es un puerto reservado, habrá que lanzarlo como root. Tenemos dos posibilidades. Ejecutar httpd (/usr/local/apache/bin/httpd), ¡ojo, con la ruta), o la orden apachectl start (/usr/local/apache/bin/apachectl start) que es la opción más recomendable. Esto buscará el fichero de configuración (httpd.conf) en el lugar compilado en el código (por defecto /usr/local/apache/conf/httpd.conf). Si está en otro sitio se puede indicar con la opción -f. : $ /usr/sbin/httpd -f /etc/httpd/httpd.conf Una vez arrancado se puede acceder a la documentación utilizando el navegador: $ http://localhost Cuando el servidor arranque creará varios procesos hijos para atender las solicitudes. Si se inició Apache como usuario root, el proceso apache continuará ejecutándose como root mientras los hijos cambiarán al usuario indicado en el httpd.conf. Ejercicio:Verificación de la instalación: Arrancar el servidor sin SSL (sólo puede utilizarse http): $ /usr/local/apache/bin/apachectl start Ejecutar un navegador con http://localhost Para detener el servidor, antes de lanzar el servidor que incluye SSL hay que hacer: $ /usr/local/apache/bin/apachectl stop Para arrancar el servidor con SSL (pueden utilizarse http y https): $ /usr/local/apache/bin/apachectl startssl Ejecutar un navegador con http://ptxolXX.disca.upv.es Ejecutar un navegador con https://ptxolXX.disca.upv.es El servidor advertirá que no conoce la autoridad certificadora que emitió el certificado. Podéis visualizar el contenido del certificado y aceptarlo, por lo menos para la sesión en curso. $ /usr/local/apache/bin/apachectl stop ADVERTENCIAS: 1. Cuando se utiliza https conectarse mediante localhost puede ocasionar problemas (o por lo menos una advertencia de seguridad) porque el nombre de dominio del ordenador (o alguno de sus alias) debe coincidir con el indicado al crear el certificado para el servidor. 2. Si en un ordenador ya existe un servidor web ejecutándose –porque se ha lanzado en el arranque del sistema– tendrá reservado el puerto 80 y no dejará arrancar uno nuevo sobre el mismo puerto. El problema se detecta porque la conexión a través de SSL no funciona, mientras que la que utiliza sólo http trabaja con el servidor que ya estaba instalado. 3. En caso de problemas una buena medida es consultar los registros de log (/usr/local/apache/logs/). 4. Para reiniciar el servidor: $ /usr/local/apache/bin/apachectl restart 4 4. Configuración del servidor Entre los archivos de nuestro directorio de configuración (/usr/local/apache/conf) tenemos: 1. httpd.conf: Establece los atributos generales del servidor: número de puerto en el que escucha, usuario que lo ejecuta, raíz del árbol de documentos etc. En la actualidad se recomienda establecer todas las opciones de configuración necesarias en este fichero, y dejar los otros dos ficheros de configuración vacíos, esto simplifica la administración del servidor. Su configuración está bastante bien documentada en el propio archivo mediante comentarios. 2. srm.conf: Se utilizaba para establecer la raíz del árbol de documentos, que ahora se establece en httpd.conf, por lo tanto no hay que utilizarlo. 3. access.conf: Establecía la política de acceso. Ahora también puede establecerse desde httpd.conf, por lo que no es necesario utilizar este fichero. Además de estos tres ficheros, el comportamiento del servidor puede configurarse directorio a directorio, mediante ficheros .htaccess en los directorios que contienen documentos html a los que el servidor accede. La configuración de los ficheros está bastante bien documentada. Es muy importante recordar que cuando se cambia la configuración de los ficheros es necesario reiniciar el apache (apachectl restart) o enviarle una señal de SIGHUP con la orden kill para que los cambios tengan efecto. Hay que estar seguro de que se envía la señal al proceso padre y no al hijo. El padre en general es el que tiene un número de proceso menor. El id del proceso del padre está también en el fichero httpd.pid en el directorio log. 4.1.El archivo httpd.conf Es el primero de los tres ficheros de configuración que se procesan. Está constituido por una serie de directivas que dan al servidor instrucciones para su funcionamiento. Estas directivas se agrupan en tres secciones básicas: 1. Directivas que controlan el funcionamiento del servidor como un todo (el “entorno global”). 2. Directivas que definen los parámetros del servidor principal., o por defecto, que responde a las solicitudes que no son manejadas por servidores virtuales. 3. Configuración de los servidores virtuales, que permiten enviar las peticiones web a diferentes direcciones IP o nombres de host, pero manejándolas en realidad con el mismo proceso servidor. En esta práctica no entraremos en los aspectos de configuración de servidores virtuales, sino únicamente del servidor principal. Cada directorio al que el apache accede puede configurarse con respecto a que características se habilitan o se inhabilitan en él y en sus subdirectorios. ..1. Entorno global Entre las directivas de esta sección tenemos: ServerType standalone Determina si el servidor se lanzará a través del inetd o de forma autónoma (que generalmente es la opción elegida). ServerRoot "/usr/local/apache” Raíz del árbol de directorios bajo la que se sitúan los ficheros de configuración, error y log. Ejercicio: Comprobar cuál es la raíz en vuestro servidor. 5 PidFile /usr/local/apache/httpd.pid Fichero en el que se almacena el identificador de proceso del servidor cuando el servidor arranca. Este identificador es el que hay que utilizar para detener el servidor si no se utiliza la orden “apachectl stop”. ..2. Configuración del servidor principal Port 80 Puerto en el que escucha el servidor si no se lanza a través del inetd. Recordad que para que escuche en el 80 hay que lanzarlo como root. User nobody Group nogroup Usuario bajo el que se atenderán las peticiones recibidas, debe corresponder con un usuario real (sin privilegios) definido en la máquina y el grupo al que pertenezca. DocumentRoot "/usr/local/apache/htdocs" Directorio que contendrá los documentos que se ofrecen a los clientes. Por defecto todas las solicitudes se toman desde el directorio aunque se pueden utilizar enlaces simbólicos para apuntar a otros directorios Ejercicio: Comprobar cuál es la raíz para los documentos en vuestro servidor. <Directory /> Options FollowSymLinks AllowOverride None </Directory> La directiva Directory se utiliza para definir opciones específicas que se aplican al directorio indicado. En el ejemplo mostrado se hace referencia al directorio raíz de documentos (DocumentRoot). Se pueden definir otros directorios previamente habilitados. No puede utilizarse con caminos relativos, pero permite utilizar expresiones regulares para indicar el directorio (por ejemplo, se pueden usar comodines de caracteres). Lo habitual es configurar por defecto unos permisos muy restrictivos y posteriormente habilitar el acceso y permisos más amplios en directorios específicos. Por ejemplo, el bloque anterior permite únicamente seguir enlaces simbólicos (directiva Options FollowSymLinks), y mediante la directiva AllowOverride None impide que se puedan modificar los permisos establecidos en este archivo (httpd.conf), por otros indicados en archivos .htaccess (particulares de cada directorio del servidor). A partir de aquí habilitaremos el acceso a la parte del servidor que nos interese y a todos, o a algunos usuarios determinados. <Directory "/usr/local/apache/htdocs"> La ruta especificada en esta directiva debe coincidir con la raíz del árbol de documentos (DocumentRoot) y las opciones que se especifican a continuación hacen referencia a este directorio y sus subdirectorios. Options Indexes FollowSymLinks Multiviews Al activar la opción “Indexes” (ordenación de directorios) el servidor permite que si se solicita un URL que corresponde a un directorio y no hay página por defecto para mostrar (por ejemplo: index.html) se devuelva un listado de los ficheros del directorio. Si esta opción está activada hay que asegurarse que los directorios no contienen archivos sensibles: listas de control de acceso, archivos de configuración o bases de datos como “.htpasswd” y “.htaccess”. A no ser que se desee ofrecer navegación por archivos, es más seguro no activar esta opción. La opción puede desactivarse anteponiendo un signo “ – “: Options –Indexes Tener en cuenta que una vez activada para un directorio la opción permanece activa para todos los subdirectorios del directorio a no ser que se modifique. 6 La opción “FollowSymLinks” permite que puedan seguirse los enlaces simbólicos en este directorio. Esto tiene serias implicaciones de seguridad porque los usuarios locales pueden, inadvertidamente, (o incluso de forma maliciosa) vincular a archivos de sistema internos y, por tanto, “romper la barrera”, permitiendo a usuarios remotos saltar por encima de la barrera virtual que separa el espacio web de la jerarquía del sistema de archivos principal. En principio esta opción no debería activarse. Por último, la opción “Multiviews” permite negociar los contenidos con el navegador para elegir la mejor representación de acuerdo con sus preferencias (idioma, conjunto de caracteres, codificación, …). AllowOverride None Controla que opciones pueden modificar los .htaccess de los directorios de usuario. Puede impedirse totalmente la modificación con “None”, permitirse totalmente con “All”, o de forma parcial utilizando otros parámetros. (Consultar la documentación en caso necesario). Las dos directivas siguientes permiten realizar control del acceso al servidor: Order allow, deny Determina el orden en que se evalúan los derechos de acceso. Hay permitidas tres opciones: • allow, deny • deny, allow • mutual-failure: especifica que una conexión debe pasar las directivas allow y deny La directiva “allow” controla qué hosts (si hay alguno) pueden conectarse y ofrece tres opciones: all, none o list (donde list es una lista de hosts autorizados). La directiva “deny” controla qué hosts (si hay alguno) no pueden conectarse y ofrece tres opciones: all, none o list (donde list es una lista de hosts no autorizados). Allow from all Todo el mundo puede acceder al directorio especificado. Puede también habilitarse/denegarse acceso restringido indicando en lugar de all, nombres de dominio o direcciones IP. Pueden especificarse múltiples nombres o direcciones separados por espacios en blanco. </Directory> Ejercicio: Crear un directorio que se supone debe ser de acceso restringido y utilizando las directivas adecuadas: • No permitir listados del directorio. • Restringir el acceso únicamente a uno de los ordenadores del laboratorio de redes. (Un ordenador cercano al vuestro, para poderlo comprobar con comodidad). <IfModule mod_userdir.c> userDir public_html </IfModule> Ruta que se añade al directorio home del usuario si se recibe una solicitud del tipo ~usuario. Cuando por ejemplo hacemos: http://ptxolXX.disca.upv.es/~gyurlXX/practica2.html el servidor intenta acceder a: /home/gyurlXX/public-html/practica2.html 7 Ejercicio: Comprobad el acceso a vuestro directorio. En el propio fichero httpd.conf tenéis un ejemplo de cómo permitir el acceso a los directorios de los usuarios sólo con permiso de lectura. <IfModule mod_dir.c> DirectoryIndex index.html </IfModule> Establece el nombre de los ficheros que se utilizarán como páginas por defecto cuando el URL sólo indica directorios, pero no especifica ningún fichero. Pueden indicarse varios nombres de fichero separados por espacios. Ejercicio: Comprobar que ocurre si comentamos la directiva. Incluir también las de tipo index.htm. Si el fichero especificado por la directiva DirectoryIndex no existe el comportamiento del servidor variará dependiendo de que esté permitido o no el listado del directorio. Las directivas siguientes se utilizan para restringir el acceso a los directorios mediante autentificación HTTP básica, que se explicará en el apartado siguiente. AccessFileName .htacces directorio. ->nombre del fichero para mirar información de control de acceso en cada < Files ~”^\.ht”> Order allow deny Deny from all Impide que los .htaccess pueden ser vistos por los usuarios que acceden. </Files> 4.2. Control de acceso a directorios mediante autentificación de usuarios El acceso a los directorios puede restringirse de dos formas: utilizando el nombre de dominio o la dirección IP del ordenador donde se ejecuta el cliente, o solicitando un nombre de usuario y una contraseña. Para el primer tipo de restricción ya hemos comentado las directivas necesarias, así es que en este apartado vamos a ver como llevar a cabo la segunda posibilidad. Para restringir el acceso mediante nombre de usuario y contraseña serán necesarios dos pasos: en primer lugar crear un fichero que contenga los nombres de los usuarios autorizados (que no tiene porque coincidir con usuarios del sistema), y en segundo lugar indicar al servidor que recursos están protegidos y cuáles son los usuarios que pueden acceder a ellos. Para ello se utilizarán la herramienta htpasswd y los archivos . htaccess. .. Creación de la base de datos de usuarios Necesitamos crear una lista de usuarios con sus contraseñas asociadas. Por seguridad esta lista NO DEBE ESTAR BAJO EL DIRECTORIO RAÍZ DE DOCUMENTOS. El formato es similar al fichero de contraseñas de Unix, con el nombre de usuario separado de la contraseña por dos puntos. Cuando los usuarios piden acceso a un directorio web protegido, el servidor les pide el nombre de usuario y la contraseña. Después compara esos valores con los que tiene almacenados en el usuario de contraseñas (li donarem el nom que vulguem, p.ex., passweb). Como las contraseñas se almacenan cifradas, este archivo no se edita directamente, sino que se crea y se gestionan sus usuarios mediante el programa htpasswd (/usr/local/apache/bin/htpasswd). $ htpasswd [-c] passweb nombre_usuario La opción –c se utiliza para crear el fichero cuando se introducen los datos del primer usuario. El programa pedirá la contraseña del usuario y su confirmación. Puede utilizarse también para modificar las contraseñas de usuarios ya incluidos en el archivo. 8 .. Normas de acceso para la autentificación Se pueden almacenar en el archivo httpd.conf del servidor o en archivos .htaccess situados en los directorios donde se intenta acceder. Veamos los pasos para restringir el acceso desde el archivo de configuración principal al subdirectorio secret situado en htdocs. <Directory /usr/local/apache/htdocs/secret> AllowOverride None Impide modificaciones mediante archivos .htaccess A partir de aquí todas las órdenes son IMPRESCINDIBLES AuthName prueba Pseudónimo para el directorio, permite acceder a otras áreas que comparten el mismo nombre de usuario y la misma contraseña. Es el nombre que se muestra cuando se solicita la autentificación al usuario. AuthType Basic [/Digest] Tipo de autentificación: básica o digest. Distingue cómo se transmitirá la contraseña a través de la red, utilizando uuencode (cifrado trivial) en el caso Basic, o utilizando MD5 (más seguro). La segunda posibilidad requiere compilar el apache con un módulo extra (mod_digest.c) y generar el fichero de contraseñas con htdigest en lugar de con htpasswd. AuthUserFile /usr/local/apache/bin/passweb Indica el nombre y la ruta del fichero de contraseñas. Debe especificarse la ruta completa, y no rutas relativas. <Limit GET> require user pepito Establece el tipo de acceso permitido (GET, PUT y POST) y para que usuario(s). Pueden especificarse varios separados por espacios. </Limit> </Directory> Ejercicio: Restringir el acceso mediante contraseña a uno de los directorios del árbol de documentos. 9