4. Irontec – Curso Apache
Protocolo HTTP
● Mensaje de petición:
– Línea de método de petición
– Líneas de cabecera de petición (de tipo XXX:YYY)
– <CR><LF> (Línea en blanco)
– Cuerpo (opcional)
● Mensaje de respuesta:
– Línea de código de estado
– Líneas de cabecera de respuesta (de tipo XXX:YYY)
– <CR><LF> (Línea en blanco)
– Cuerpo (opcional)
● Todas las líneas acaban en <CR><LF>
4
6. Irontec – Curso Apache
Protocolo HTTP
● GET: solicita una petición dentro de la URL.
● POST: envía datos en el cuerpo de la petición
● PUT: upload
● HEAD: solicita una respuesta idéntica a GET pero sólo
devuelve las cabeceras (no el cuerpo).
● DELETE: borrado
● TRACE: devuelve la petición, para comprobar si algún
equipo intermedio modifica la original
● OPTIONS: devuelve los métodos soportados por el
servidor
● CONNECT: empleado para túneles tcp/ip, típicamente
para hacer conexiones https a través de un proxy http.
Riesgo si en el proxy no se limitan los posibles destinos6
7. Irontec – Curso Apache
Protocolo HTTP
● Mensajes de respuesta
● Ej:
– HTTP/1.1 200 OK
– Date: Thu, 27 Mar 2008 21:29:14 GMT
– Content-Type: text/html; charset=US-ASCII
– Server: AmazonS3
● Otras líneas de cabecera:
– ETag, Expires, Pragma, Vary, X-*
– Ref: http://en.wikipedia.org/wiki/List_of_HTTP_headers
7
8. Irontec – Curso Apache
Protocolo HTTP
● Codigos de estado
● Son los códigos devueltos por el servidor.
● Se agrupan en:
– 1xx Información
– 2xx Éxito
– 3xx Redirección
– 4xx Error de cliente
– 5xx Error de servidor
8
9. Irontec – Curso Apache
Protocolo HTTP
● Negociación de contenidos: mecanismo para
devolver distintos recursos o documentos a partir de
una URI solicitada. Ejs: Tipo imagen (gif, png), Idioma,
text/html o text/*
– Cabeceras:
● De cliente. Ej. Accept-encoding: gzip, deflate
● De servidor. Ej: Content-encoding: gzip
– Tipos MIME (Multipurpose Internet Mail Extensions):
● Forma de describir el tipo de documento a transmitir.
● Sintaxis: major type/minor type. Ej: text/html, image/gif
● Basados en extensión o en análisis (file ...)
9
10. Irontec – Curso Apache
Protocolo HTTP
● Conexiones persistentes (“HTTP keep-alive”)
(v1.1): hacer varias conexiones http con una sóla
conexión tcp.
– Ventajas:
● Menor carga de sistema operativo
● Menos congestión en la red (menos conexiones tcp) y
menor latencia en solicitudes posteriores.
● Posibilidad de http pipelining
– Según rfc2616 un cliente no debería establecer más de 2
conexiones persistentes al mismo tiempo con un
servidor, para evitar la congestión.
10
11. Irontec – Curso Apache
Protocolo HTTP
● HTTP pipelining (v1.1): peticiones asíncronas: enviar
más de una petición http sin esperar las respuestas.
– Ventaja: como se pueden enviar varias peticiones en un
único paquete tcp, es posible reducir la carga de red.
11
12. Irontec – Curso Apache
Protocolo HTTP
● Protocolo stateless: no guarda información sobre los
clientes
● Técnicas para mantener la historia:
– Cookies (rfc 2109). Inconveniente: han de habilitarse en el
browser
– URL rewriting (Ej. http://host/path;sessionid=12axY)
Inconvenientes:
● Todas las URLs han de llevar el id. Por tanto, hay que
generar todas las páginas de forma dinámica
● Los bookmarks no valen
● (URLs poco estéticas)
– Campos ocultos en formularios. Inviable a nivel general: no
todo está en formularios
12
13. Irontec – Curso Apache
Protocolo HTTP
● Se suelen encapsular a más alto nivel:
– APIs de php, java servlets,...
– Aplicación
● Cada sesión incluye:
– Identificador de sesión a incluir en el tráfico http
– Variables de sesión: pueden guardarse en ficheros de disco
o ej. en base de datos
– Timeout
● Implicaciones de seguridad: secuestro de sesión, ej.
con URL rewriting
13
14. Irontec – Curso Apache
Protocolo HTTP
● Alternativas de almacenamiento de información de
sesiones:
– En el lado del servidor. Inconvenientes:
● Acceso a la información si hay varios servidores ejs. cluster,
balance de carga. Soluciones:
– Replicación entre servidores
– Compartición: sockets, memoria, disco, BD
● (Limitación en el nº de clientes)
– En el lado del cliente: se usan cookies y criptografía.
Inconvenientes:
● Limitación de tamaño de cookie
● Información del usuario no accesible fuera de la sesión
14
15. Irontec – Curso Apache
Introducción
● Desarrollado inicialmente por Rob McCool (NCSA)
● Es desde 1996 el servidor web HTTP más utilizado en
Internet.
● Es multiplataforma (Unix, Microsoft, Novell)
● La versión 2 de apache se ha reescrito completamente.
● Es extremadamente estable.
● Modularizado para evitar mantener un código
extremadamente complejo y monolítico.
● Es software libre aunque no GPL.
http://www.apache.org
15
16. Irontec – Curso Apache
Introducción
● Roadmap: Evolución de las versiones
● 1.2.X
● 1.3.X
● 2.0.X
● 2.2.X
● Trunk o versión en desarrollo
16
17. Irontec – Curso Apache
Introducción
● Velocidad mayor en el caching
● Filtros Inteligentes
● Configurarión modular
● Balanceo de Carga para Proxys
● Soporte para apagado transparente
● Soporte para archivos mayores de 2GB
● Nuevas opciones para autenticación y autorización
http://httpd.apache.org/docs/2.2/new_features_2_2.html
17
19. Irontec – Curso Apache
Instalación
● Código fuente
● Paquete binario para la distribución Debian
GNU/Linux
¿Ventajas y desventajas de cada uno?
19
20. Irontec – Curso Apache
Instalación – Código fuente
● Descargamos las últimas fuentes del mirror oficial más
próximo (http://apache/rediris.es/httpd)
● Se pueden buscar más mirrors y comprobar sus
estados en http://www.apache.org/mirrors/
http://apache.rediris.es/httpd/httpd-2.2.11.tar.gz
http://apache.rediris.es/httpd/httpd-2.2.11.tar.gz.asc
20
21. Irontec – Curso Apache
Instalación – Código fuente
● Verificamos la integridad del código fuente:
● Averiguamos la clave con la que fue firmada
$ gpg –-verify httpd-2.2.11.tar.gz.asc
gpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID
311A3DE5
gpg: Imposible comprobar la firma: Clave pública no encontrada
● Importamos la clave pública con la que fue firmada
$ gpg --keyserver pgpkeys.mit.edu --recv-key 311A3DE5
gpg: anillo `/root/.gnupg/secring.gpg' creado
gpg: solicitando clave 311A3DE5 de hkp servidor pgpkeys.mit.edu
gpg: /root/.gnupg/trustdb.gpg: se ha creado base de datos de
confianza
gpg: clave 311A3DE5: clave pública "Ruediger Pluem
<rpluem@apache.org>" importada
gpg: no se encuentran claves absolutamente fiables
gpg: Cantidad total procesada: 1
gpg: importadas: 1
21
22. Irontec – Curso Apache
Instalación – Código fuente
●Verificamos la integridad del código fuente:
● Verificamos la firma digital
$ gpg --verify httpd-2.2.11.tar.gz.asc
gpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID 311A3DE5
gpg: Firma correcta de "Ruediger Pluem <rpluem@apache.org>"
gpg: ATENCIÓN: ¡Esta clave no está certificada por una firma de confianza!
gpg: No hay indicios de que la firma pertenezca al propietario.
Huellas dactilares de la clave primaria: 120A 8667 241A EDD4 A78B 4610
4C04 2818 311A 3DE5
● La firma digital es válida pero la clave no es de
confianza!
22
23. Irontec – Curso Apache
Instalación – Código fuente
● Confiamos en la clave (¿seguro?)
$ gpg --edit-key 10FDE075
pub 1024D/311A3DE5 creado: 20051002 caduca: nunca uso: SCA
confianza: desconocido validez: desconocido
sub 2048g/A21CD598 creado: 20051002 caduca: nunca uso: E
[desconocida] (1). Ruediger Pluem <rpluem@apache.org>
Orden> trust
pub 1024D/311A3DE5 creado: 20051002 caduca: nunca uso: SCA
confianza: desconocido validez: desconocido
sub 2048g/A21CD598 creado: 20051002 caduca: nunca uso: E
[desconocida] (1). Ruediger Pluem <rpluem@apache.org>
Por favor, decida su nivel de confianza en que este usuario
verifique correctamente las claves de otros usuarios (mirando
pasaportes, comprobando huellas dactilares en diferentes fuentes...)
1 = No lo sé o prefiero no decirlo
2 = NO tengo confianza
3 = Confío un poco
4 = Confío totalmente
5 = confío absolutamente
m = volver al menú principal
23
24. Irontec – Curso Apache
Instalación – Código fuente
● Continuamos...
¿Su decisión? 5
¿De verdad quiere asignar absoluta confianza a esta clave? (s/N) s
pub 1024D/311A3DE5 creado: 20051002 caduca: nunca uso: SCA
confianza: absoluta validez: desconocido
sub 2048g/A21CD598 creado: 20051002 caduca: nunca uso: E
[desconocida] (1). Ruediger Pluem <rpluem@apache.org>
Por favor, advierta que la validez de clave mostrada no es necesariamente
correcta a menos de que reinicie el programa.
24
25. Irontec – Curso Apache
Instalación – Código fuente
● Verificamos de nuevo la firma digital
$ gpg --verify httpd-2.2.11.tar.gz.asc
gpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID 311A3DE5
gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias,
modelo de confianza PGP
gpg: nivel: 0 validez: 1 firmada: 0 confianza: 0, 0q, 0n, 0m, 0f,
1u
gpg: Firma correcta de "Ruediger Pluem <rpluem@apache.org>"
● ¡Firma digital verificada! Podemos instalar el software
con seguridad.
http://www.gnupg.org/
25
26. Irontec – Curso Apache
Instalación – Código fuente
● Instalamos todo lo necesario para la compilación con
un solo comando:
apt-get install build-essential
● Descomprimimos el código fuente:
tar -xzf httpd-2.2.11.tar.gz
26
27. Irontec – Curso Apache
Instalación – Código fuente
● La instalación de apache se hace en 3 pasos:
● Seleccionar los módulos a incluir en el servidor
● Crear una configuración para el sistema operativo
$ ./configure
● Compilar el ejecutable
$ make
# make install
● Ponemos en marcha el servidor:
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
Intentaremos arrancarlo como usuario NO ROOT.
¿Podemos?
27
28. Irontec – Curso Apache
Instalación – Código fuente
● El script configure nos permite varias opciones.
● -- prefix=/directorio/destino
Es el directorio en el que Apache va a ser instalado. Apache
tiene que ser configurado para el directorio que se especifique
para que funcione correctamente.
● --enable-module
Utilizado para compilar un módulo estático.
● --disable-module
Para no compilar un módulo
● --enable-module=shared
Para compilar el modulo como dinámico (DSO)
IMPORTANTE: no avisa si el modulo indicado existe o28
29. Irontec – Curso Apache
Instalación – Código fuente
● Los módulos estáticos son módulos incluidos en
tiempo de compilación:
● Para conocer que módulos hay incluidos en el binario
compilado podemos hacerlo con:
– Instalado desde las fuentes:
/usr/local/apache2/bin/httpd -l
Compiled-in modules:
http_core.c
mod_env.c
[...]
– Instalado en Debian desde apt:
/usr/sbin/apache2 -l
Compiled-in modules:
core.c
mod_so.c
29
30. Irontec – Curso Apache
Instalación – Código fuente
● Módulos dinámicos son los cargados externamente:
● Apache permite cargar módulos independientes al
archivo binario httpd.
● Es posible gracias al módulo mod_so, que debe
compilarse estáticamente en el núcleo de Apache y
a la herramienta apxs (APache eXtenSion).
● Apache necesita ser compilado previamente para
poder utilizar la herramienta apxs.
● Para usa este mecanismo el sistema también debe
soportar DSO.
¿Cómo compilamos Apache con soporte DSO?
30
31. Irontec – Curso Apache
Instalación – Código fuente
● Módulos cargados externamente vs incluídos:
● Si compilamos estáticamente los módulos, cada
cambio en ellos hay que recompilar apache!
● Ventajas DSO
– El servidor es mucho más flexible
– Permite tener diferentes instancias de servidor con una
única instalación de Apache
– Más sencillo el prototipado y desarrollo de módulos
● Desventajas DSO
– El servidor es un 20% más lento en el arranque
– El servidor en un 5% más lento en funcionamiento
31
32. Irontec – Curso Apache
Instalación – Código fuente
● Ya tenemos Apache compilado y con posibilidad de
añadir módulos dinámicamente. Vamos a compilar
PHP5 como DSO :)
32
33. Irontec – Curso Apache
Instalación – Código fuente
● PHP es un lenguaje de programación interpretado,
diseñado originalmente para la creación de páginas
web dinámicas. Es usado principalmente en
interpretación del lado del servidor (server-side
scripting).
● Es un lenguaje multiplataforma.
● Capacidad de conexión con la mayoría de los
manejadores de base de datos.
● ES LIBRE.
http://es.wikipedia.org/wiki/.php
33
34. Irontec – Curso Apache
Instalación – Código fuente
● Descargamos el código fuente de PHP:
wget http://es2.php.net/get/php-5.2.9.tar.gz/from/es.php.net/mirror
● Comprobamos que la suma de integridad es correcta
con md5sum:
$md5sum php-5.2.9.tar.gz 98b647561dc664adefe296106056cf11 php-
5.2.9.tar.gz
● Configuramos la compilación como módulo de
Apache, con soporte Mysql y GD.
./configure –-with-apxs2=/usr/local/apache2/bin/apxs
--with-mysql
--with-gd
34
35. Irontec – Curso Apache
Instalación – Código fuente
● Cargamos el módulo en Apache
LoadModule php5_module modules/libphp5.so
● Configuramos Apache para que interprete las
páginas .php mediante el módulo de PHP
AddType application/x-httpd-php .php
● Configuramos Apache para que busque páginas .php
índice en caso de no solicitar una.
DirectoryIndex index.html index.php
35
36. Irontec – Curso Apache
Instalación – Código fuente
● Para probar el funcionamiento de PHP tenemos que
crear una página en... ¡PHP! :D
● En el directorio raíz de Apache creamos un fichero
llamado info.php con el siguiente contenido:
<? phpinfo() ?>
● Accedemos a la página desde nuestro navegador.
36
37. Irontec – Curso Apache
Instalación – Paquetes binarios
● Podemos instalar Apache2, PHP, etc. desde apt-get
apt-get install apache2 php5 php5-mysql php5-gd
● Apache estará automáticamente configurado con
soporte php5.
● En el futuro si deseamos actualizar (por algún parche de
seguridad) podremos hacerlo mediante apt-get sin
tener que recompilar nada.
● Apt-get es más sencillo y simple, pero compilar es más
universal.
37
38. Irontec – Curso Apache
Instalación – Paquetes binarios
● Apache instalado por apt-get viene preparado para
trabajar con módulos DSO. Dispone de sus propios
comandos para habilitar y deshabilitar módulos.
● Habilitar módulo SSL
a2enmod ssl
● Deshabilitar módulo SSL
a2dismod ssl
● Con cada cambio es necesario reiniciar Apache.
● Los modulos disponibles están en:
/etc/apache2/mods-available
● Los módulos habilitados están en:
/etc/apache2/mods-enabled
38
39. Irontec – Curso Apache
Configuración
● Apache dispone de cientos de directivas de
configuración.
● No nos podemos saber todas de memoria, por lo que
tendremos que memorizar una URL :)
http://httpd.apache.org/docs/2.2/mod/directives.html
● El fichero de configuración general se encuentra en:
/etc/apache2/apache2.conf
● Existe un VirtualHost por defecto.
/etc/apache2/sites-available/default
● Los puertos de escucha se configuran en:
/etc/apache2/ports.conf
39
40. Irontec – Curso Apache
Configuración
● .htaccess es un archivo de texto oculto que contiene
una serie de directivas para el servidor Apache.
● Cada vez que visitamos una web, Apache busca en la
carpeta accedida el fichero .htaccess para cargar las
opciones que en el se encuentran.
● Es posible deshabilitar el uso de estas directivas con:
AllowOverride None
● Y habilitarlas mediante:
AllowOverride All
40
41. Irontec – Curso Apache
Configuración
● En general los archivos .htaccess no se deben usar
nunca, a menos que no se tenga acceso al archivo
de configuración del servidor (Ej: ISP)
● Se debe usar el contenedor <Directory>
● Razones:
– Eficiencia: Apache debe buscar ficheros .htaccess por
todo el arbol de directorios, en busca de herencias
– Seguridad: Se permite a los usuarios hacer cambios sobre
las directivas del servidor. Cambios sobre los que no se
tiene control.
41
42. Irontec – Curso Apache
Configuración
● Las distintas directivas solo pueden aplicarse en algunos
contextos, por lo que antes de aplicarlo es necesario
saber donde.
● Contextos de aplicación
– Servidor
– Host Virtual
– <Directory>,<Location>,<Files>,<Proxy>
– Fichero .htaccess
42
43. Irontec – Curso Apache
Configuración
● La directiva <directory> nos permite establecer una
configuración específica a un directorio del sistema de
ficheros.
<Directory /var/www/info/>
AllowOverride None
DirectoryIndex prueba.php
</Directory>
● Ahora cada vez que accedamos a http://ip/info nos aplicará la
configuración indicada en la directiva Directory anterior.
43
44. Irontec – Curso Apache
Configuración
● La directiva Allow/Deny nos permiten definir a quien
damos acceso a nuestra web:
Order Deny,Allow
Deny from all
Allow from 192.168.1.101
● Estas directivas deben ser aplicadas a nivel
<Directory> o mediante .htaccess
● El modulo encargado de darnos esta funcionalidad es:
mod_authz_host
44
45. Irontec – Curso Apache
Configuración
● Location es similar a Directory. En este caso Location
hace referencia a una URL, en lugar de una carpeta del
sistema de ficheros.
● Location no debe ser usado para establecer permisos a
nivel del sistema de ficheros, ya que una misma carpeta
puede ser accedida desde diferentes zonas.
<Location /info>
Deny from All
</Location>
45
46. Irontec – Curso Apache
Configuración
● La directiva Files nos permite establecer permisos a
nivel de ficheros mediante expresiones regulares.
● Usando esta directiva junto con la vista anteriormente,
es posible permitir acceso a ciertos ficheros a un
número limitado de usuarios.
● Ejemplo, no permitir el acceso a nadie a las imagenes
.jpg
<Files ~ ".jpg$">
Deny from all
</Files>
46
47. Irontec – Curso Apache
Configuración
● Limit y LimitExcept nos permiten denegar en funcion
de la petición que se haga al servidor.
● Las peticiones validas son:
GET, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND,
PROPPATCH, MKCOL, COPY, MOVE, LOCK y UNLOCK
● Con Limit indicamos a que peticiones habilitar los
controles. Las peticiones no indicadas no se ven
afectadas.
● Con LimitExcept indicamos que peticiones no se ven
afectadas por los controles.
● LimitExcept != Limit
Denegad la descarga de páginas web a todo el
mundo excepto a mi :)
47
48. Irontec – Curso Apache
Configuración
● Redirect nos permite redirigir una petición a otra
página.
● De esta forma, si movemos un documento a otro lado,
es posible que los antiguos usuarios puedan seguir
accediendo al contenido.
Redirect /google http://google.es
● Si alguien accede a /google/prueba, se le reenviara a
google.es/prueba.
● Se pueden establecer distintos códigos de redirección:
301 Redirección permanente
302 Redirección temporal
303 El contenido a sido reemplazado
410 El contenido ya no existe
48
49. Irontec – Curso Apache
Configuración
● ErrorLog y CustomLog nos permiten definir donde y
como se guardarán los Logs de error y Acceso.
● Podemos guardar los logs en la carpeta que queramos,
siempre y cuando Apache tenga permisos para escribir
en ella.
● El formato del log es muy configurable, de forma que
podamos guardar solo aquellos datos que nos
interesen.
49
50. Irontec – Curso Apache
Configuración
● CustomLog tiene la siguiente sintaxis:
CustomLog logs/access_log "%h %l %u %t "%r" %>s %b"
● En primer lugar se indica la directiva, el fichero de
destino y entrecomillado el formato que tendrá.
● Para definir el formato se está haciendo uso de la
directiva LogFormat
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
● Cread el log de Acceso en /tmp/acceso con el siguiente
formato:
192.168.1.101 - [27/Feb/2009:15:10:04 +0100]
● Los logs de error se definen con ErrorLog.
● Cread el log de Error en /tmp/error con el formato
anterior.
50
51. Irontec – Curso Apache
Configuración
● En caso de disponer de un gran número de Servidores
Virtuales y si estos loggean en diferentes archivos puede
darse el caso que Apache se quede sin descriptores de
fichero.
● Son objetos que usan los programas para leer o escribir
un archivo, socket o dispositivo.
● Apache utiliza:
– 10 a 20 descriptores de fichero para uso interno
– 1 para cada archivo de error (ErrorLog)
– 1 para cada directiva de log distinta (CustomLog)
● El sistema operativo se encarga de limitar el número de
descriptores de fichero que puede abrir un programa
determinado.
51
52. Irontec – Curso Apache
Configuración
●El límite de Linux es de 1024 descriptores de fichero.
● Límites:
– Kernel: depende del SO. En Linux
– Hardware
– Software
# ulimit -n
1024
52
53. Irontec – Curso Apache
Configuración
● MaxClients nos permite definir el número máximo de
conexiones que pueden ser atentidas simultáneamente.
● El número a indicar dependerá de las características de
la máquina.
● A más peticiones simultaneas, mas necesidad de
memoria RAM.
MaxClients 100
53
54. Irontec – Curso Apache
Configuración
● Alias es como un enlace simbólico a nivel de Apache
● Nos permite crear enlaces para acceder a documentos
que no están en la raíz de Apache.
● Si hacemos un alias a un directorio externo de la raíz,
es necesario dar permisos de acceso a la misma.
Alias /tmp /tmp
<Directory /tmp>
Order allow,deny
Allow from all
</Directory>
54
55. Irontec – Curso Apache
Configuración
● Options nos permite especificar que características de
servidor Apache estan disponibles para el directorio en
cuestión.
<Directory /tmp>
Options Indexes FollowSymLinks
</Directory>
● Con dichas opciones nos mostrará el contenido de la
carpeta en el navegador y seguirá los enlaces.
http://httpd.apache.org/docs/2.2/mod/core.html#options
55
56. Irontec – Curso Apache
Configuración
● Cuando una carpeta tiene la opcion index podremos
navegar por el contenido y hacer click en lso ficheros.
● Las opciones de index se establecen con IndexOptions.
● Cambios para el index de tmp
– Los iconos deben ser enlaces
– No se debe mostrar la fecha de última modificación
56
57. Irontec – Curso Apache
Configuración
● Con LimitRequestBody especificamos el tamaño
máximo en bytes que se pueden especificar en una
petición.
● LimitRequestBody nos puede ayudar de varias
maneras:
– Defendiendonos ante posibles denegaciones de servicio.
– Limitando el tamaño de los fichero que un usuario puede
subir a nuestro servidor.
LimitRequestBody 102400
57
58. Irontec – Curso Apache
Configuración
● Listen nos permite especificar en que puertos va a
escuchar Apache las peticiones.
● Por defecto es 80 y 443 si se tiene https.
● También es posible especificar un puerto por cada
interfaz del sistema
Listen 192.170.2.1:80
Listen 192.170.2.5:8000
58
59. Irontec – Curso Apache
Autenticación de usuarios
● Es posible controlar el acceso al contenido del servidor
mediante usuario / contraseña
● El módulo encargado es mod_auth
● Generación de archivo de usuarios
# htpasswd -c /etc/apache2/passwd/.passwd miguel
New password:
Re-type new password:
Adding password for user miguel
miguel:YXP3FBeNjIHDs
# htpasswd -c /etc/apache2/passwd/.passwd iker
New password:
Re-type new password:
Adding password for user iker
miguel:YXP3FBeNjIHDs
iker:g1Zy7z22KMSko
59
60. Irontec – Curso Apache
Autenticación de usuarios
● Solicitar al servidor que pida una contraseña
– En el archivo de configuración general (httpd.conf)
dentro de una sección <Directory>.
AuthType Basic
AuthName "Acceso Restringido"
AuthUserFile /etc/apache2/passwd/.passwd
Require user miguel
– A través del archivo .htaccess
● Igual que el modo anterior
● Es necesario habilitar las directivas de autenticación
AllowOverride AuthConfig
60
61. Irontec – Curso Apache
Autenticación de usuarios
● Generación de archivo de grupos de usuarios
/etc/apache2/.group
Grupo1: miguel iker
● Configuración de Apache para soporte de validación
por grupos de usuarios
AuthType Basic
AuthName "Acceso solo para grupos"
AuthUserFile /etc/apache2/passwd/.passwd
AuthGroupFile /etc/apache2/passwd/.group
Require group Grupo1
61
62. Irontec – Curso Apache
Autenticación de usuarios
● Valores que puede adoptar la directriz Require:
Require user <nombre_de_usuario>
Require group <nombre_de_grupo>
Require valid-user
● Inconvenientes
– Cada acceso al directorio protegido hace una nueva
comprobación del nombre de usuario y contraseña. Esto
carga de forma considerable el servidor.
– Es útil para número reducido de usuarios.
62
63. Irontec – Curso Apache
VirtualHost
● El uso de VirtualHost nos permite alojar diferentes
páginas con sus dominios en un solo servidor Apache.
● Los VirtualHost pueden estar basados en IP (que cada
sitio web tenga su ip) o basados en nombre (con una
sola IP sitios web con diferentes nombres).
● Imaginemos un proveedor de Hosting que tiene 1000
clientes en una máquina.
● El fichero que hemos estado modificando todo el rato,
000-default, es un virtual host :)
63
64. Irontec – Curso Apache
VirtualHost
● Cada VirtualHost se puede configurar por separado,
teniendo sus logs, directivas y restricciones propias.
● Dichos ficheros de configuración se guardan en
/etc/apache2/sites-available
● Los comandos para Inicar o Parar un VirtualHost es:
# a2ensite mihost
Enabling site mihost.
# a2dissite mihost
Site mihost disabled.
64
65. Irontec – Curso Apache
VirtualHost
● Para configurar un VirtualHost por nombre son
necesarias estas directivas:
– <VirtualHost>
– NameVirtualHost
– ServerName
– ServerAlias
– DocumentRoot
65
66. Irontec – Curso Apache
VirtualHost
● NameVirtualHost indica a Apache que vamos a utilizar
VirtualHosts basados en nombre.
● Se debe especificar al principio del fichero.
NameVirtualHost 192.168.1.103:80
● Se puede especificar cualquier IP que tengamos en el
sistema así como cualquier puerto.
● La IP se puede sustituir por un *
66
67. Irontec – Curso Apache
VirtualHost
● Una vez que hemos indicado que nuestros hosts serán
por nombre hay que configurar los VirtualHosts.
● <VirtualHost> nos permite indicar en que IP y puerto
está escuchando Apache las peticiones. Por lo general
será:
<VirtualHost 192.168.1.103:80>
● La directiva debe cerrarse con:
</VirtualHost>
● Cuando trabajamos con nombres, es recomendable
especificar la IP para evitar mensajes de Warning
67
68. Irontec – Curso Apache
VirtualHost
● Dentro de <VirtualHost> es donde llevaremos a cabo
todas las configuraciones necesarias. Como mínimo se
recomienda:
ServerName mihost.com
ServerAlias www.mihost.com
DocumentRoot /var/www/info
● Con ServerName indicamos el nombre del VirtualHost.
Por lo tanto, cuando entremos con Firefox en
mihost.com estaremos accediendo realmente al
VirtualHost
● ServerAlias nos permite añadir distintos Alias al
dominio.
● DocumenRoot nos ayudará a especificar donde se
68
69. Irontec – Curso Apache
VirtualHost
● Configurar un VirtualHost para mihost.com tal y como
se ha indicado antes
● Crear un index.php que me muestre la información de
PHP
● Los logs se deben guardar en /var/log/mihost
● Si yo entro a mihost.com me debe dejar acceder sin
problemas. Pero todos los demas, al intentar entrar, les
debe pedir un usuario y contraseña para acceder
69
71. Irontec – Curso Apache
Certificados
● Introducción a la Criptografía
● Criptografía simétrica o de Clave Privada
● Criptografía de Clave Pública
● Resúmenes o Hashes
● Firmas Digitales
● Certificados
71
72. Irontec – Curso Apache
Certificados
●Se encargan de asociar una clave pública con la
identidad real de un individuo, servidor u otra
entidad, conocido como sujecto.
● Como Nombre Distinguido se conoce a una serie
de información que distingue a una entidad:
– Nombre Común
– Compañía
– Departamento
– Ciudad
– Provincia
– País
72
73. Irontec – Curso Apache
Certificados
● Certificados
● Información que contiene un Certificado
– Sujeto:
● Nombre Distinguido
● Clave Pública
– Expendedor
● Nombre Distinguido
● Firma Digital
– Periodo de Validez
– Información Administrativa
● Versión
● Número de Serie
73
74. Irontec – Curso Apache
Certificados
● Autoridades de Certificación
● Son las entidades encargadas de expedir y
gestionar los certificados
● Hay 3 tipos de Autoridades de Certificación
– Oficiales y reconocidas por las herramientas más
comunes
● Verisign, Thawte, Comodo...
– Oficiales y no reconocidas por las herramientas más
comunes
● Izenpe, Ceres, Camerfirma...
– No Oficiales
● Nosotros mismos ;-)
74
75. Irontec – Curso Apache
Certificados
● Consideraciones Previas
● La longitud de las claves privadas para SSL
debe ser 512 o 1024 bits (recomendado), para
compatibilidad con todos los navegadores.
● Una secuencia SSL se compone de:
– Negociación de cifrado a utilizar durante el
intercambio de datos (criptografía simétrica)
– Establecer e intercambiar una clave de sesión
– Puede autenticar al servidor por parte del cliente
– Puede autenticar al cliente por parte del servidor
75
76. Irontec – Curso Apache
Certificados
● Creación de Certificados
● Generar la clave privada del servidor
– Cifrada con criptografía simétrica por seguridad
# openssl genrsa -des3 -out apache.key
1024
– Sin cifrar
# openssl genrsa -out apache.key 1024
● Securizar la clave para que nadie tenga acceso
# chmod 400 apache.key
● Generar la Solicitud de Certificado (CSR)
# openssl req -new -key apache.key -out dominio.csr
● Las Solicitudes de Certificado se realizan para un
dominio concreto.
76
77. Irontec – Curso Apache
Certificados
● El siguiente paso consiste en hacer llegar la
Solicitud de Certificado (CSR) a una Autoridad
de Certificación (CA) para generar el Certificado
(CRT)
77
78. Irontec – Curso Apache
Certificados
● Creación de Certificados
● Autoridad de Certificación Oficial
– Se envía, habitualmente, a través de un formulario
web a la empresa certificadora
– Validan si se ha pagado, en caso de ser necesario.
– Validan nuestras credenciales.
– Generan el Certificado (.crt), con su clave
privada y con la Solicitud de Certificado
remitida por nosotros.
– Remiten el certificado y las instrucciones de
instalación vía mail
– La Solicitud de Certificado ya no es válida.
78
79. Irontec – Curso Apache
Certificados
● Creación de Certificados
● Certificados auto-firmados
–Generar la Clave Privada de nuestra propia CA
# openssl genrsa -out mica.key 1024
– Generar el Certificado auto-firmado
# openssl req -new -x509 -nodes -sha1 -days 365 -key
mica.key -out dominio.crt
79
80. Irontec – Curso Apache
Certificados
● Instalar Certificados en Apache
● Es necesario que Apache disponga del módulo
mod_ssl compilado. mod_ssl ofrece soporte
SSL v2/v3 y TLS v1.
● Cuando EEUU relajó las restricciones en materia
de exportación criptográfica, mod_ssl entró a
formar parte de Apache (Apache 2).
● Si no lo tiene:
– Compilado estáticamente:
./configure –-enable-ssl
make && make install
– Como DSO:
a2enmod ssl
80
81. Irontec – Curso Apache
Certificados
● Instalar Certificados en Apache
● Configurar un host virtual para alojar el dominio
con certificado auto-firmado
<VirtualHost IP:443>
Listen 443
DocumentRoot /var/www
SSLEngine on
SSLCertificateFile /usr/local/apache2/ssl/mica.crt
SSLCertificateKeyFile /usr/local/apache2/ssl/mica.key
</VirtualHost>
81
82. Irontec – Curso Apache
Certificados
● Conversión de Formatos
● El formato por defecto de OpenSSL es PEM.
● Algunas aplicaciones (IExplorer) requieren el
formato DER
● Algunas aplicaciones (Mozilla) requieren el
formato PKCS#12
● Para transformar de formato PEM a DER:
# openssl x509 -in certificado.pem -out certificado.der -outform
DER
● Para transformar de formato PEM a PKCS#12
# openssl pkcs12 -export -clcerts -in certificado.pem -inkey
server.key -out certificado.p12
82
83. Irontec – Curso Apache
Certificado cliente
● Nuestros usuarios pueden autenticarse con un usuario y
clave o mediante un certificado cliente
● Estos certificados se crean a partir de una CA
● Solo podrá entrar si tiene instalado un certificado
válido:
– No caducado
– No revocado
● Vamos a proteger nuestro VirtualHost, de forma que
solo sea accesible mediante un certificado válido
83
84. Irontec – Curso Apache
Certificado cliente
● Primero generamos la CA de la que colgarán todos los
certificados cliente
● Generamos un certificado cliente, para ello creamos un
fichero de configuración específico que indicara que
tipo de certificado es:
cat config.txt
basicConstraints = critical,CA:FALSE
extendedKeyUsage = clientAuth
● Generamos un certificado cliente:
openssl genrsa out miguelangel.key 2048
openssl req new key private/miguelangel.key out
miguelangel.csr
openssl x509 CA CA.crt CAkey private/CA.key req in
miguelangel.csr set_serial 2 days 3650 extfile
config.txt sha1 out miguelangel.crt
84
85. Irontec – Curso Apache
Certificado cliente
● Lo exportamos a un formato aceptable por los
navegadores, por ejemplo p12:
openssl pkcs12 export in miguelangel.crt inkey
private/miguelangel.key certfile CA.crt out
miguelangel.p12
● Configuramos Apache:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/test1.crt
SSLCertificateKeyFile /etc/apache2/ssl/test1.key
SSLCACertificateFile /etc/ssl/clientes/CA.crt
SSLVerifyClient require
85
86. Irontec – Curso Apache
Certificado cliente
● Cuando no queremos seguir dando acceso a un usuario
debemos revocar su certificado
openssl ca revoke miguelangel.crt
● Una vez revocado, generamos/actualizamos el fichero
de revocados que leerá apache
openssl ca gencrl out revovados.crl
● Configuramos Apache para que lo lea :)
SSLCARevocationFile /etc/apache2/ssl/revocados.crl
86
88. Irontec – Curso Apache
Balanceo de carga
● Cuando el servidor no es capaz de responder a las
peticiones es necesario aumentar de alguna manera su
rendimiento
– Más memoria RAM
– Más procesador
– Discos SSD
– RAID con write cache (con bateria)
– Proxy Inverso
– Comprar más servidores
88
89. Irontec – Curso Apache
Balanceo de carga
● A veces es más sencillo comprar un servidor extra que
ampliar el que ya tenemos
● Podemos tener diferentes servidores y repartir la carga
entre ellos
● Esto se conoce como balanceo de carga
● Existe mucho software distinto para montar un
balanceo
● Nosotros vamos a ver:
– GLB
– Keepalived
– DNS
– mod_proxy_balancer
89
90. Irontec – Curso Apache
Balanceo de carga
● El servicio de balanceo de carga se monta en un
servidor externo. Este a su vez debería estar en HA
● Un buen balanceo de carga debería comprobar el
estado de los servidores
● Si un servidor se cae, debería sacarlo de la cola
● De la misma manera, si vuelve a estar Online se
volvería a añadir a la cola
90
92. Irontec – Curso Apache
Balanceo de carga
● Galera Load Balance
http://www.codership.com/en/downloads/glb
● Fácil de implantar y utilizar, sigue la filosofía KISS ;)
– Multithread
– Conexiones distribuidas proporcionalmente
– De momento en Beta
● Para usarlo, hay que compilarlo:
– wget
– tar -xzf
– ./configure
– make && make install
92
93. Irontec – Curso Apache
Balanceo de carga
punisher@shyris:~$ glbd help
Usage:
glbd [OPTIONS] LISTEN_ADDRESS [DESTINATION_LIST]
OPTIONS:
help this help message.
daemon run as a daemon.
fifo <fifo name> name of the FIFO file for control.
control [HOST:]PORT listen for control requests on this address.
threads N number of working threads (connection pools).
source_tracking turn on source tracking: route connections from
one
source to the same destination.
verbose turn on verbose reporting.
version print program version.
LISTEN_ADDRESS:
[IP:]PORT where to listen for incoming TCP connections.
DESTINATION_LIST:
[H1[:P1[:W1]]] [H2[:P2[:W2]]]... a spaceseparated list of destinations
in the form address:port:weight.
93
94. Irontec – Curso Apache
Balanceo de carga
● Haciendo uso de los pesos es posible enviar más
peticiones al servidor más potente
● Si los pesos son iguales, se distribuirán las conexiones
● Si deseamos conexiones persistentes (mismo origen
mismo servidor destino) debemos habilitar el
source_tracking
● Bueno como solución de implantación rápida y sencilla
94
95. Irontec – Curso Apache
Balanceo de carga
punisher@shyris:~$ glbd verbose 10.10.0.123:8081
10.10.0.211:80:1 10.10.0.204:80
Incoming address: 10.10.0.123:8080 , control FIFO:
/tmp/glbd.fifo
Control address: none
Number of threads: 1, source tracking: OFF, verbose: ON,
daemon: NO
Destinations: 2
0: 10.10.0.211:80 , w: 1.000
1: 10.10.0.204:1 , w: 1.000
Router:
Address : weight usage conns
10.10.0.211:80 : 1.000 0.000 0
10.10.0.204:1 : 1.000 0.000 0
Destinations: 2, total connections: 0
95
96. Irontec – Curso Apache
Balanceo de carga
INFO:glb_pool.c:323: Pool 0: added connection, (total pool connections: 1)
INFO:glb_listener.c:77: Accepted connection from 10.10.0.123:45370
INFO:glb_listener.c:79: to 10.10.0.204:80
INFO:glb_pool.c:323: Pool 0: added connection, (total pool connections: 2)
INFO:glb_listener.c:77: Accepted connection from 10.10.0.123:45371
INFO:glb_listener.c:79: to 10.10.0.211:80
INFO:glb_pool.c:323: Pool 0: added connection, (total pool connections: 2)
INFO:glb_listener.c:77: Accepted connection from 10.10.0.123:45372
INFO:glb_listener.c:79: to 10.10.0.204:80
INFO:glb_pool.c:323: Pool 0: added connection, (total pool connections: 2)
INFO:glb_listener.c:77: Accepted connection from 10.10.0.123:45373
INFO:glb_listener.c:79: to 10.10.0.211:80
96
98. Irontec – Curso Apache
Balanceo de carga
● LVS es el estándar de facto para crear balanceadores de
carga en Linux
● Actúa como si fuese un router de capa 4
● El “director” recibe las conexiones y las reenvía al
destino
● Se pueden añadir y eliminar servidores reales en
tiempo real sin tener que reiniciar el servicio
98
99. Irontec – Curso Apache
Balanceo de carga
aptget install ipvsadm
● La configuración es en consola, mediante el comando
ipvsadm
● Es posible guardar las reglas en un fichero de
configuración para que se carguen al arranque
● LVS puede actuar como master o backup, de forma
que podemos tener HA en el balanceador
● Cuando un master se cae, los estados de las conexiones
pasan al Backup
99
100. Irontec – Curso Apache
Balanceo de carga
● Creamos un servidor virtual:
debian1:~# ipvsadm A t 10.10.0.10:80 p 600
● Añadimos un servidor real:
debian1:~# ipvsadm a t 10.10.0.10:80 r 10.10.0.144 m
● Añadimos otro servidor rea:
debian1:~# ipvsadm a t 10.10.0.10:80 r 10.10.0.144 m
Listamos los componentes de nuestro balanceador de
carga:
debian1:~# ipvsadm l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
> RemoteAddress:Port Forward Weight ActiveConn
InActConn
TCP 10.10.0.10:www wlc persistent 600
> 10.10.0.145:www Masq 1 0 0
> 10.10.0.144:www Masq 1 0 0
100
101. Irontec – Curso Apache
Balanceo de carga
● Si un servidor real se cae somos nosotros los que
tenemos que sacar el servidor manualmente
● Existe software que hace uso de LVS para el balanceo y
nos ofrece además herramientas para la auto detección
de las caídas
● Si un servidor se cae, debería sacarlo de las colas sin
necesidad de intervención manual
● Debería comprobar tanto la conexión correcta al
puerto como el contenido descargado de la web (con
un hash)
101
103. Irontec – Curso Apache
Balanceo de carga
● Keepalived nos proporciona todo (y bastantes cosas
más) usando por debajo LVS
http://www.keepalived.org/
– Balanceo de carga
– Balanceo de LVS
– Gestión de del pool de servidores
– Control del contenido
– HA en el director (con VRRP)
– Notificaciones por mail
103
105. Irontec – Curso Apache
Balanceo de carga
● Otra forma típica de balanceo es mediante DNS
● Se deben configurar diferentes registros A para un
único dominio
● El servidor DNS nos dará un registro u otro en Round
Robin
http://es.wikipedia.org/wiki/Planificaci%C3%B3n_Round-robin
● Se usa activamente en servidores de correo electrónico
105
106. Irontec – Curso Apache
Balanceo de carga
● Ventajas
– Facil de implementar
– No necesita de un servidor extra
– Rápido (consulta DNS)
● Desventajas
– No controla la caída de un servidor
– Las caches de los DNS pueden hacer que no sea tan
Round Robin
– No puedes establecer pesos
106
107. Irontec – Curso Apache
Balanceo de carga
mod_proxy_balancer
107
108. Irontec – Curso Apache
Balanceo de carga
● Es un módulo dependiente de mod_proxy que nos
permite configurar un balanceo de carga nativo en
Apache
● Permite 3 tipos de algoritmos para el balanceo:
– Dependiente de las peticiones (se reparten las peticiones
equitativamente)
– Dependiente del tráfico (se reparte en función de los bytes
que ha transmitido cada servidor)
– Dependiente de la carga (se envían las conexiones al que
menos peticiones tenga en ese momento)
108
109. Irontec – Curso Apache
Balanceo de carga
● Primero debemos añadir unos módulos:
– a2enmod proxy
– a2enmod proxy_balancer
– a2enmod proxy_http
● Y luego configuramos Apache:
<Proxy balancer://supercluster>
BalancerMember http://10.10.0.210:80
BalancerMember http://10.10.0.214:80
Order deny,allow
Allow from all
</Proxy>
ProxyPass /test balancer://supercluster
109
113. Irontec – Curso Apache
Mod_Cache
● Mod_Cache nos permite cachear tanto el contenido
local como el accedido a través de proxy en el servidor
● El cacheo se puede hacer a disco duro o memoria
– mod_disk_cache
– mod_mem_cache
● Para activarlo:
a2enmod cache
a2enmod disk_cache
a2enmod mem_cache
113
114. Irontec – Curso Apache
Mod_Cache
CacheRoot /tmp/cache
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 4
CacheMaxFileSize 64000
CacheDefaultExpire 86400
Habilitamos la cache en /tmp/cache, como máximo 5
subdirectorios con nombres de no más de 4 letras. El
tamaño máximo de fichero 64000 y expirará a los
86400 segundos
114
115. Irontec – Curso Apache
Mod_Cache
● CacheIgnoreCacheControl
Ingora las cabeceras no-cache o no-store, guardándo
los datos en caché
● CacheIgnoreHeaders
Podemos especificar una serie de cabeceras a ignorar.
Por ejemplo para prevenir que las cookies se guarden
en cache (Set-Cookie)
● CacheIgnoreNoLastMod
Si no dispone de “Last Modified” lo cachea igualmente.
Por defecto no se cachearian
115
116. Irontec – Curso Apache
Mod_Cache
● CacheSize
Tamaño global de la cache, importante poner un valor
normal que no nos deje sin espacio en el disco duro
● CacheMinFileSize
Tamaño mínimo que debe tener un fichero para poder
se cacheado
● CacheIgnoreURLSessionIdentifiers
No cacheamos las páginas que incluyan un
identificador de sesión
116
118. Irontec – Curso Apache
Mod_Deflate
● Mod_deflate permite comprimir los datos en el lado del
servidor y enviarselos al cliente
● Sirve para ahorrar ancho de banda, a costa de consumo
de CPU
SetOutputFilter DEFLATE
● Algunos navegadores no gestionan la compresión de
todos los elementos de una web, solamente TXT y
HTML
AddOutputFilterByType DEFLATE text/html
● Si sabemos de algun navegador con problemas, lo
podemos ignorar
BrowserMatch ^Mozilla/4 gzip-only-text/html
118
119. Irontec – Curso Apache
Mod_Rewrite
● Mod_Rewrite nos permite reescribir URLs en base a
unas reglas, basadas generalmente en expresiones
regulares
● Muy usadas para posicionamiento web
http://example.com/wiki/index.php?title=Page_title
http://example.com/wiki/Page_title
● Más info y ejemplos en la wikipedia:
http://en.wikipedia.org/wiki/Rewrite_engine
119
120. Irontec – Curso Apache
Mod_Rewrite
● Para activarlo:
– a2enmod rewrite
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
● Lo habilitamos:
– RewriteEngine On
● Y le indicamos donde realizar la reescritura (opcional)
– RewriteBase /vida
● Finalmente reescribimos
– RewriteRule ^index.html$ home.hmtl
120
121. Irontec – Curso Apache
Mod_Rewrite
● Podemos poner unas condiciones para la ejecución de
las reglas con RewriteCond:
– RewriteCond %{HTTP_USER_AGENT} firefox [NC]
– RewriteRule ^/$ firefox.html
● Si se cumple la condición “HTTP_USER_AGENT
incluye la palabra firefox” se reenvía la petición a
firefox.html
● Con [NC] lo hacemos Case Insensitive
● Con [OR] podemos concatenar condiciones
● Vamos a hacer que todas las peticiones que no
sean https muestren un mensaje de error
121
123. Irontec – Curso Apache
Mod_Rewrite
● RewriteRule también dispone de flags:
– [F] prohibe el acceso (403)
– [G] marca la URL como no existente (401)
– [L] aplica la regla y termina, no sigue aplicando las restantes
– [N] vuelve a empezar la reescritura desde el principio
– [NC] no importa mayúsculas/minúsculas
– [R] marca redirect (302)
– [S=num] ignora el siguiente número (num) de reglas
● Denegadme el acceso a mi IP, solamente si
uso Firefox
123
125. Irontec – Curso Apache
Mod_Rewrite
● En RewriteCond y RewriteRule podemos meter una
expresión regular entre paréntesis, que luego se
sustituirán
– RewriteCond (.*) → %1
– RewriteRule (.*) → $1
● Enviar el subdominio como parámetro de búsqueda a
google
● Por ejemplo:
– http://dominio.com/google/vida
– http://www.google.es/search?q=vida
125
127. Irontec – Curso Apache
Mod_Rewrite
● Un poco de SEO
● http://voz-ip.com
● La URL incluye el nombre del producto, simplemente
para posicionamiento
● Todo lo que hay antes del guión no importa a nivel
interno, solamente el identificativo final
● Crear una regla de Rewrite de forma que:
– dskndnpsn3-hola.html
– 324234n-vida.html
● Sin importar lo que tengamos antes del guión,
nos muestre el documento indicado.
127
129. Irontec – Curso Apache
Mod_Rewrite
● A veces únicamente deseamos que la página de login
esté cifrada y no así el resto de la web
– Ahorro de recursos
– Navegación más rápida
– …
● Mediante Mod_Rewrite podemos hacer que una
página en particular tenga que ser mostrada en https
mientras que las demás no
● ¿Como lo haríamos?
129
132. Irontec – Curso Apache
Mod_Security
● Mod_Security es un módulo de seguridad que hace de
barrera entre la red y el servidor Apache
● Tiene un funcionamiento basado en reglas, parecido a
un antivirus o IDS
http://www.modsecurity.org/index.html
● Detecta DDOS, XSS, troyanos, violaciones de
protocolo, etc.
● En Debian Lenny no tenemos paquetes
http://etc.inittab.org/~agi/debian/libapache-mod-security2
● Descargamos:
– libapache-mod-security_2.5.9-1_i386.deb
– mod-security-common_2.5.9-1_all.deb
132
133. Irontec – Curso Apache
Mod_Security
● Una vez instalado el paquete ya tenemos el módulo
instalado y habilitado, solo hay que reiniciar
● Ahora toca instalar las reglas:
http://www.modsecurity.org/download/modsecurity-core-rules_2.5-1.6.1.tar.gz
● Movemos los .conf a /etc/apache2/modsecurity2
● Añadimos al final de apache2:
– include /etc/apache2/modsecurity2/
● Creamos en siguiente enlace simbólico:
– ln s /var/log/apache2 /etc/apache2/logs
133
134. Irontec – Curso Apache
Mod_Security
● Podemos crear nuestras propias reglas de prueba
● Por ejemplo, vamos a filtrar a los que navegan con
Chrome :)
SecRule REQUEST_HEADERS:UserAgent "Chrome" "log,drop"
● Hará una búsqueda en las cabeceras, usando una
expresión regular
● Si concuerda, dropea la conexión y lo logea
● Se pueden descargar más reglas de:
http://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project
● Cuidado, ya que algunas pueden no ser compatibles
134
135. Irontec – Curso Apache
Mod_Security
● Vamos a probar cuanto de seguro es :)
● Nikto2 es una herramienta de testo de la seguridad de
un servidor web
● Comprueba configuraciones y hace más de 7000 teses
● Si Mod_Security está habilitado, el log error.log debería
crecer muchisimo ;)
./nikto.pl h 10.10.0.147
135
136. Irontec – Curso Apache
Mod_Proxy
● Mod_Proxy puede funcionar en dos modos, reenvío y
proxy inverso
– El modo de reenvío (forward proxy) es el típico. El servidor
está entre el cliente y el servidor destino. Vamos, ¡el
proxy de toda la vida!
– En el modo inverso actúa como un servidor web. El cliente
accede al servidor y este reenvía la petición a otro para
finalmente devolverle el contenido como si
originalmente fuese suyo
a2enmod proxy
136
137. Irontec – Curso Apache
Mod_Proxy
● Para habilitar Apache como Proxy creamos un
VirtualHost en el puerto 8080
● Ponemos las siguientes directivas:
<VirtualHost *:8080>
ProxyRequests On
ProxyVia On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
● Tenemos que configurar nuestro navegador para que use el
Proxy
137
138. Irontec – Curso Apache
Mod_Proxy
● Otro VirtualHost
<VirtualHost *:81>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /ma/b/ http://miguelangelnieto.net/
ProxyPassReverse /ma/b/ http://miguelangelnieto.net/
</VirtualHost>
● Cuidado con las barras!
138
139. Irontec – Curso Apache
Optimización del servidor
● La optimización de Apache, al igual que cualquier otro
servicio, depende de:
– Tarjeta de red rápida
– Discos rápidos
– Mucha RAM
– Mucha CPU
● Contra más, mejor
● Como ya hemos dicho, cuando un servidor no da para
más y no se puede ampliar, la solución es montar otro y
repartir carga
139
140. Irontec – Curso Apache
Optimización del servidor
● La regla principal en linux es:
– NO SWAP
● Si el sistema se queda sin RAM y necesita más recursos
usará la SWAP, lo cual degradará el rendimiento hasta
hacerlo inusable
● Para no llegar a ese extremo hay que poner un valor
normal en MaxClients
● MaxClients=RAM/AVG(apache)
140
141. Irontec – Curso Apache
Optimización del servidor
● Muchas consultas DNS pueden ralentizar las respuestas
● A poder ser en Deny y Allow se debe poner direcciones
IP
● HostnameLookups está por defecto Off. Si se requiere
para un directorio en especial se puede habilitar, pero
no se recomienda hacerlo globalmente
141
142. Irontec – Curso Apache
Optimización del servidor
● Los ficheros .htaccess se leen en cada acceso
● Si tienes muchos repartidos por múltiples directorios el
rendimiento de acceso a disco se puede degradar con
muchas lecturas no secuenciales
● AllowOverride None
● El contenido del .htaccess lo podemos mover al
VirtualHost y hacer un reload
● De esa forma se lee una vez y se ejecuta infinito
142
143. Irontec – Curso Apache
Optimización del servidor
● Si tenemos enlaces simbólicos y la directiva
SymLinksIfOwnerMatch habilitada, el sistema tendrá
que hacer dos llamadas al sistema cada vez que quiera
acceder a el
● Si quiere seguridad, no tienes más remedio que tenerlo
activado
● Si quieres rendimiento, tendrás que evitar dicho
chequeo
● Puedes programar una tarea que cada 5 minutos
compruebe los enlaces y sus propietarios
● Será más rápido que hacerlo por cada conexión
143
144. Irontec – Curso Apache
Optimización del servidor
● Las páginas web deberían estar en la misma máquina
donde corre Apache
● Tener los datos montados por NFS o Samba solo añade
OverHead y latencia a las peticiones
● Dependiendo del sistema puede funcionar mejor (o no)
con:
– EnableSendfile Off (envío de ficheros)
– EnableMMap Off (lectura del contenido de ficheros)
144
145. Irontec – Curso Apache
Optimización del servidor
● Ningún software es perfecto :)
● Para evitar memory leaks se recomienda reiniciar los
distintos threads
● Se puede matar un thread cuando haya cumplido su
objetivo en la vida, responder a un número de
peticiones
● 0 significa infinito
● Depende del hardware y del tipo de web que
tengamos, será mejor un valor u otro, no hay regla fija
Setting MaxRequestsPerChild to a non
zero value limits the amount of memory
that process can consume by
(accidental) memory leakage.
145
146. Irontec – Curso Apache
Optimización del servidor
● Con KeepAlive, los threads se quedan esperando más
peticiones de la conexión abierta
● Por defecto espera 15 segundos
● Debes elegir entre ahorro de ancho de banda y
recursos del sistema
KeepAliveTimeout
● Una conexión se queda abierta para bajar el contenido
de la web, por lo tanto esperas superiores a 5 segundos
suelen carecer de sentido
146
147. Irontec – Curso Apache
Optimización del servidor
● Apache soporta varios modos de concurrencia
diferentes dependiendo del sistema operativo
● Se llaman MPM (multi-process Modules)
● En unix tenemos:
– Worker: múltiples procesos con múltiples threads cada
uno. Cada thread gestiona una conexión. Consume
menos memoria y es recomendable para webs con alto
tráfico
– Prefork: múltiples procesos con un único thread. Cada
thread gestiona una conexión. Usa más memoria, tiene
prácticamente el mismo rendimiento, pero es
recomendable usarlo para trabajar con módulos No-
Thread-Safe (PHP5 de Debian requiere este modo)
147
148. Irontec – Curso Apache
AB
● Apache provee una herramienta para el testeo de
rendimiento, Apache Benchmark (ab).
● Nos permite simular miles de accesos
● Las opciones más importantes son:
● -n número de conexiones a realizar
● -c número de conexiónes concurrentes
● -k usar keepalive
148
149. Irontec – Curso Apache
AB
ab -n 1000 -c 10 http://mihost.com/awstats
● Realiza 1000 conexiones, 10 concurrentes a la URL
indicada:
Concurrency Level: 10
Time taken for tests: 0.331 seconds
Complete requests: 1000
Failed requests: 0
● Comparad los datos haciendo solicitudes normales y
con keep alive.
● Poned valores exagerados y comprobad como se
consumen los recursos del sistema.
149