Apache avanzado

149
Apache Miguel Ángel Nieto <[email protected]> Irontec – Internet y Sistemas sobre GNU/Linux

description

 

Transcript of Apache avanzado

Apache

Miguel Ángel Nieto <[email protected]>Irontec – Internet y Sistemas sobre GNU/Linux

Irontec – Curso Apache

2

Protocolo HTTP

● Hypertext Transfer Protocol● Desde 1994● RFC 2616● Sobre TCP.● Puertos por defecto:

– No seguro: tcp 80– Seguro (ssl/tls): 443

● Versiones: 0.9, 1.0, 1.1 (la más usada), 1.2● Protocolo stateless

Irontec – Curso Apache

3

Protocolo HTTP

● Elementos:– Cliente=user agent: web browser, spider, wget, curl,...– Servidor– Intermediarios: Proxy, gateway, túnel

Irontec – Curso Apache

4

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>

Irontec – Curso Apache

5

Protocolo HTTP

● Mensajes de petición● Ej:

– GET / HTTP/1.1– Host:– User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;

rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 Paros/3.2.13

– Accept: text/xml,text/plain;q=0.8,image/png,*/*;q=0.5– Accept-Language: es-es,en-us;q=0.7,en;q=0.3– Accept-Charset: UTF-8,*

● Otras líneas de cabecera:– Keep-Alive, Proxy-Connection, Referer, Cookie, Content-

length,...– Ref: http://en.wikipedia.org/wiki/List_of_HTTP_headers

Irontec – Curso Apache

6

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 destinos host:port

Irontec – Curso Apache

7

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

Irontec – Curso Apache

8

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

Irontec – Curso Apache

9

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 ...)

Irontec – Curso Apache

10

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.

Irontec – Curso Apache

11

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.

Irontec – Curso Apache

12

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

Irontec – Curso Apache

13

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

Irontec – Curso Apache

14

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

Irontec – Curso Apache

15

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

Irontec – Curso Apache

16

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

Irontec – Curso Apache

17

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

Irontec – Curso Apache

18

Introducción

Irontec – Curso Apache

19

Instalación

● Código fuente● Paquete binario para la distribución Debian

GNU/Linux

¿Ventajas y desventajas de cada uno?

Irontec – Curso Apache

20

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

Irontec – Curso Apache

21

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.ascgpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID 311A3DE5gpg: 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 311A3DE5gpg: anillo `/root/.gnupg/secring.gpg' creadogpg: solicitando clave 311A3DE5 de hkp servidor pgpkeys.mit.edugpg: /root/.gnupg/trustdb.gpg: se ha creado base de datos de confianzagpg: clave 311A3DE5: clave pública "Ruediger Pluem <[email protected]>" importadagpg: no se encuentran claves absolutamente fiablesgpg: Cantidad total procesada: 1gpg:               importadas: 1

Irontec – Curso Apache

22

Instalación – Código fuente

● Verificamos la integridad del código fuente:● Verificamos la firma digital

$ gpg --verify httpd-2.2.11.tar.gz.ascgpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID 311A3DE5gpg: Firma correcta de "Ruediger Pluem <[email protected]>"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!

Irontec – Curso Apache

23

Instalación – Código fuente

● Confiamos en la clave (¿seguro?)$ gpg --edit-key 10FDE075pub  1024D/311A3DE5  creado: 2005­10­02  caduca: nunca       uso: SCA                      confianza: desconocido   validez: desconocidosub  2048g/A21CD598  creado: 2005­10­02  caduca: nunca       uso: E   [desconocida] (1). Ruediger Pluem <[email protected]>Orden> trustpub  1024D/311A3DE5  creado: 2005­10­02  caduca: nunca       uso: SCA                      confianza: desconocido   validez: desconocidosub  2048g/A21CD598  creado: 2005­10­02  caduca: nunca       uso: E   [desconocida] (1). Ruediger Pluem <[email protected]>

Por favor, decida su nivel de confianza en que este usuarioverifique correctamente las claves de otros usuarios (mirandopasaportes, 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

Irontec – Curso Apache

24

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: 2005­10­02  caduca: nunca       uso: SCA                      confianza: absoluta      validez: desconocidosub  2048g/A21CD598  creado: 2005­10­02  caduca: nunca       uso: E   [desconocida] (1). Ruediger Pluem <[email protected]>Por favor, advierta que la validez de clave mostrada no es necesariamentecorrecta a menos de que reinicie el programa.

Irontec – Curso Apache

25

Instalación – Código fuente

● Verificamos de nuevo la firma digital$ gpg --verify httpd-2.2.11.tar.gz.ascgpg: Firmado el sáb 06 dic 2008 16:18:37 CET usando clave DSA ID 311A3DE5gpg: comprobando base de datos de confianzagpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias,modelo de confianza PGPgpg: nivel: 0  validez:   1  firmada:   0  confianza: 0­, 0q, 0n, 0m, 0f, 1ugpg: Firma correcta de "Ruediger Pluem <[email protected]>"

● ¡Firma digital verificada! Podemos instalar el software con seguridad.

http://www.gnupg.org/

Irontec – Curso Apache

26

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

Irontec – Curso Apache

27

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 instal l

● Ponemos en marcha el servidor:/usr/ local/apache2/bin/apachectl stop

/usr/ local/apache2/bin/apachectl start

Intentaremos arrancarlo como usuario NO ROOT. ¿Podemos?

Irontec – Curso Apache

28

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-moduleUtilizado para compilar un módulo estático.

● --disable-modulePara no compilar un módulo

● --enable-module=sharedPara compilar el modulo como dinámico (DSO)

IMPORTANTE: no avisa si el modulo indicado existe o no. Por lo que habrá que tener cuidado.

Irontec – Curso Apache

29

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 - lCompiled-in modules: http_core.c mod_env.c[. . . ]

– Instalado en Debian desde apt:/usr/sbin/apache2 -lCompiled-in modules: core.c mod_so.c

Irontec – Curso Apache

30

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?

Irontec – Curso Apache

31

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

Irontec – Curso Apache

32

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 :)

Irontec – Curso Apache

33

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

Irontec – Curso Apache

34

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

Irontec – Curso Apache

35

Instalación – Código fuente

● Cargamos el módulo en ApacheLoadModule php5_module modules/ l ibphp5.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

Irontec – Curso Apache

36

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.

Irontec – Curso Apache

37

Instalación – Paquetes binarios

● Podemos instalar Apache2, PHP, etc. desde apt-getapt-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.

Irontec – Curso Apache

38

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 SSLa2enmod ssl

● Deshabilitar módulo SSLa2dismod 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

Irontec – Curso Apache

39

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

Irontec – Curso Apache

40

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

Irontec – Curso Apache

41

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.

Irontec – Curso Apache

42

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

Irontec – Curso Apache

43

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 NoneDirectoryIndex prueba.php</Directory>

● Ahora cada vez que accedamos a http://ip/info nos aplicará la configuración indicada en la directiva Directory anterior.

Irontec – Curso Apache

44

Configuración

● La directiva Allow/Deny nos permiten definir a quien damos acceso a nuestra web:Order Deny,AllowDeny from allAllow 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

Irontec – Curso Apache

45

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>

Irontec – Curso Apache

46

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>

Irontec – Curso Apache

47

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 != LimitDenegad la descarga de páginas web a todo el mundo excepto a mi :)

Irontec – Curso Apache

48

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 permanente302 Redirección temporal303 El contenido a sido reemplazado410 El contenido ya no existe

Irontec – Curso Apache

49

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.

Irontec – Curso Apache

50

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 LogFormathttp://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.

Irontec – Curso Apache

51

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.

Irontec – Curso Apache

52

Configuración

● El límite de Linux es de 1024 descriptores de fichero.● Límites:

– Kernel: depende del SO. En Linux – Hardware– Software

# ulimit -n1024

Irontec – Curso Apache

53

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

Irontec – Curso Apache

54

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,denyAllow from all</Directory>

Irontec – Curso Apache

55

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

Irontec – Curso Apache

56

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

Irontec – Curso Apache

57

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

Irontec – Curso Apache

58

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 sistemaListen 192.170.2.1:80Listen 192.170.2.5:8000

Irontec – Curso Apache

59

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 miguelNew password:Re-type new password:Adding password for user miguel

miguel:YXP3FBeNjIHDs

# htpasswd -c /etc/apache2/passwd/.passwd ikerNew password:Re-type new password:Adding password for user iker

miguel:YXP3FBeNjIHDsiker:g1Zy7z22KMSko

Irontec – Curso Apache

60

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 BasicAuthName "Acceso Restringido"AuthUserFile /etc/apache2/passwd/.passwdRequire user miguel

– A través del archivo .htaccess● Igual que el modo anterior● Es necesario habilitar las directivas de autenticación

AllowOverride AuthConfig

Irontec – Curso Apache

61

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 BasicAuthName "Acceso solo para grupos"AuthUserFile /etc/apache2/passwd/.passwdAuthGroupFile /etc/apache2/passwd/.groupRequire group Grupo1

Irontec – Curso Apache

62

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.

Irontec – Curso Apache

63

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 :)

Irontec – Curso Apache

64

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 mihostSite mihost disabled.

Irontec – Curso Apache

65

VirtualHost

● Para configurar un VirtualHost por nombre son necesarias estas directivas:

– <VirtualHost>– NameVirtualHost– ServerName– ServerAlias– DocumentRoot

Irontec – Curso Apache

66

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 *

Irontec – Curso Apache

67

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

Irontec – Curso Apache

68

VirtualHost● Dentro de <VirtualHost> es donde llevaremos a cabo

todas las configuraciones necesarias. Como mínimo se recomienda:ServerName mihost.comServerAlias www.mihost.comDocumentRoot /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 encuentra fisicamente la Web a servir.

Irontec – Curso Apache

69

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

Irontec – Curso Apache

70

Certificados

Irontec – Curso Apache

71

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

Irontec – Curso Apache

72

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

Irontec – Curso Apache

73

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

Irontec – Curso Apache

74

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 ;-)

Irontec – Curso Apache

75

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

Irontec – Curso Apache

76

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.

Irontec – Curso Apache

77

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)

Irontec – Curso Apache

78

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 Certif icado (.crt) , con su clave

privada y con la Solicitud de Certif icado remitida por nosotros.

– Remiten el certificado y las instrucciones de instalación vía mail

– La Solicitud de Certificado ya no es válida.

Irontec – Curso Apache

79

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

Irontec – Curso Apache

80

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-sslmake && make install

– Como DSO:a2enmod ssl

Irontec – Curso Apache

81

Certificados

● Instalar Certificados en Apache● Configurar un host virtual para alojar el dominio

con certificado auto-firmado

<VirtualHost IP:443>

Listen 443DocumentRoot /var/www

SSLEngine onSSLCertificateFile /usr/local/apache2/ssl/mica.crtSSLCertificateKeyFile /usr/local/apache2/ssl/mica.key

</VirtualHost>

Irontec – Curso Apache

82

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 certif icado.pem -out certif icado.der -outform DER

● Para transformar de formato PEM a PKCS#12# openssl pkcs12 -export -clcerts - in cert if icado.pem -inkey server.key -out certif icado.p12

Irontec – Curso Apache

83

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

Irontec – Curso Apache

84

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

Irontec – Curso Apache

85

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 

Irontec – Curso Apache

86

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

Irontec – Curso Apache

87

Balanceo de carga

Irontec – Curso Apache

88

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

Irontec – Curso Apache

89

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

Irontec – Curso Apache

90

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

Irontec – Curso Apache

91

Balanceo de carga

GLB (Galera Load Balancer)

Irontec – Curso Apache

92

Balanceo de carga

● Galera Load Balancehttp://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

Irontec – Curso Apache

93

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 space­separated list of destinations

                          in the form address:port:weight.

Irontec – Curso Apache

94

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

Irontec – Curso Apache

95

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

Irontec – Curso Apache

96

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   

Irontec – Curso Apache

97

Balanceo de carga

LVS

Irontec – Curso Apache

98

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

Irontec – Curso Apache

99

Balanceo de carga

apt­get 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

Irontec – Curso Apache

100

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         

Irontec – Curso Apache

101

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)

Irontec – Curso Apache

102

Balanceo de carga

Keepalived

Irontec – Curso Apache

103

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

Irontec – Curso Apache

104

Balanceo de carga

DNS

Irontec – Curso Apache

105

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

Robinhttp://es.wikipedia.org/wiki/Planificaci%C3%B3n_Round-robin

● Se usa activamente en servidores de correo electrónico

Irontec – Curso Apache

106

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

Irontec – Curso Apache

107

mod_proxy_balancer

Balanceo de carga

Irontec – Curso Apache

108

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)

Irontec – Curso Apache

109

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

Irontec – Curso Apache

110

Balanceo de carga

● Estadísticas:

Irontec – Curso Apache

111

Balanceo de carga

<Location /balancer­manager>SetHandler balancer­manager

Order deny,allowAllow from all

</Location>

Irontec – Curso Apache

112

Módulos

MÓDULOS

Irontec – Curso Apache

113

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 cachea2enmod disk_cachea2enmod mem_cache

Irontec – Curso Apache

114

Mod_Cache

CacheRoot /tmp/cacheCacheEnable disk /CacheDirLevels 5CacheDirLength 4CacheMaxFileSize 64000CacheDefaultExpire 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

Irontec – Curso Apache

115

Mod_Cache

● CacheIgnoreCacheControlIngora las cabeceras no-cache o no-store, guardándo los datos en caché

● CacheIgnoreHeadersPodemos especificar una serie de cabeceras a ignorar. Por ejemplo para prevenir que las cookies se guarden en cache (Set-Cookie)

● CacheIgnoreNoLastModSi no dispone de “Last Modified” lo cachea igualmente. Por defecto no se cachearian

Irontec – Curso Apache

116

Mod_Cache

● CacheSizeTamaño global de la cache, importante poner un valor normal que no nos deje sin espacio en el disco duro

● CacheMinFileSizeTamaño mínimo que debe tener un fichero para poder se cacheado

● CacheIgnoreURLSessionIdentifiersNo cacheamos las páginas que incluyan un identificador de sesión

Irontec – Curso Apache

117

Mod_Cache

Manuales de Apache

http://httpd.apache.org/docs/2.2/mod/mod_cache.htmlhttp://httpd.apache.org/docs/2.2/mod/mod_disk_cache.htmlhttp://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

Irontec – Curso Apache

118

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 ignorarBrowserMatch ^Mozilla/4 gzip-only-text/html

Irontec – Curso Apache

119

Mod_Rewrite

● Mod_Rewrite nos permite reescribir URLs en base a unas reglas, basadas generalmente en expresiones regulares

● Muy usadas para posicionamiento webhttp://example.com/wiki/index.php?title=Page_titlehttp://example.com/wiki/Page_title

● Más info y ejemplos en la wikipedia:http://en.wikipedia.org/wiki/Rewrite_engine

Irontec – Curso Apache

120

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

Irontec – Curso Apache

121

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

Irontec – Curso Apache

122

Mod_Rewrite

RewriteCond %{HTTPS} !^on$ [NC]RewriteRule . nossl.html

Irontec – Curso Apache

123

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

Irontec – Curso Apache

124

Mod_Rewrite

RewriteEngine OnRewriteCond %{HTTP_USER_AGENT} firefox [NC]RewriteCond %{REMOTE_ADDR} ^10\.10\.0\.123RewriteRule (.*) $1 [F]

Irontec – Curso Apache

125

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

Irontec – Curso Apache

126

Mod_Rewrite

RewriteEngine OnRewriteCond %{REQUEST_URI} ^/google/(.*)RewriteRule . http://www.google.es/search?q=%1

Irontec – Curso Apache

127

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.

Irontec – Curso Apache

128

Mod_Rewrite

RewriteRule .*­(.*) $1

Irontec – Curso Apache

129

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?

Irontec – Curso Apache

130

Mod_Rewrite

<Directory /var/www/inicio>RewriteEngine OnRewriteCond %{REQUEST_URI} ^(.*)login\.htmlRewriteCond %{HTTPS} !^on$ [NC]RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI}  [L]RewriteCond %{REQUEST_URI} !^(.*)login\.htmlRewriteCond %{HTTPS} ^on$ [NC]RewriteRule . http://%{HTTP_HOST}%{REQUEST_URI}  [L]</Directory>

Irontec – Curso Apache

131

Mod_Security

Mod Security

Irontec – Curso Apache

132

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

Irontec – Curso Apache

133

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

Irontec – Curso Apache

134

Mod_Security

● Podemos crear nuestras propias reglas de prueba● Por ejemplo, vamos a filtrar a los que navegan con

Chrome :)SecRule REQUEST_HEADERS:User­Agent "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

Irontec – Curso Apache

135

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 

Irontec – Curso Apache

136

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

Irontec – Curso Apache

137

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

Irontec – Curso Apache

138

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!

Irontec – Curso Apache

139

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

Irontec – Curso Apache

140

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)

Irontec – Curso Apache

141

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

Irontec – Curso Apache

142

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

Irontec – Curso Apache

143

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

Irontec – Curso Apache

144

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)

Irontec – Curso Apache

145

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 fijaSetting MaxRequestsPerChild to a non­zero value limits the amount of memory that process can consume by (accidental) memory leakage.

Irontec – Curso Apache

146

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 sistemaKeepAliveTimeout

● 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

Irontec – Curso Apache

147

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)

Irontec – Curso Apache

148

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

Irontec – Curso Apache

149

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.