Instalación del servidor web Apache en Linux

Anuncio
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
Descargar