Apache avanzado

11,124 views

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,124
On SlideShare
0
From Embeds
0
Number of Embeds
931
Actions
Shares
0
Downloads
914
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Apache avanzado

  1. 1. Apache Miguel Ángel Nieto <miguelangel@irontec.com> Irontec – Internet y Sistemas sobre GNU/Linux
  2. 2. Irontec – Curso Apache 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 2
  3. 3. Irontec – Curso Apache Protocolo HTTP ● Elementos: – Cliente=user agent: web browser, spider, wget, curl,... – Servidor – Intermediarios: Proxy, gateway, túnel 3
  4. 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
  5. 5. Irontec – Curso Apache 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 5
  6. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  18. 18. Irontec – Curso Apache Introducción 18
  19. 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. 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. 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. 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. 23. Irontec – Curso Apache Instalación – Código fuente ● Confiamos en la clave (¿seguro?) $ gpg --edit-key 10FDE075 pub  1024D/311A3DE5  creado: 2005­10­02  caduca: nunca       uso: SCA                       confianza: desconocido   validez: desconocido sub  2048g/A21CD598  creado: 2005­10­02  caduca: nunca       uso: E    [desconocida] (1). Ruediger Pluem <rpluem@apache.org> Orden> trust pub  1024D/311A3DE5  creado: 2005­10­02  caduca: nunca       uso: SCA                       confianza: desconocido   validez: desconocido sub  2048g/A21CD598  creado: 2005­10­02  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. 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: 2005­10­02  caduca: nunca       uso: SCA                       confianza: absoluta      validez: desconocido sub  2048g/A21CD598  creado: 2005­10­02  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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 65. Irontec – Curso Apache VirtualHost ● Para configurar un VirtualHost por nombre son necesarias estas directivas: – <VirtualHost> – NameVirtualHost – ServerName – ServerAlias – DocumentRoot 65
  66. 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. 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. 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. 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
  70. 70. Irontec – Curso Apache Certificados 70
  71. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  87. 87. Irontec – Curso Apache Balanceo de carga 87
  88. 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. 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. 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
  91. 91. Irontec – Curso Apache Balanceo de carga GLB (Galera Load Balancer) 91
  92. 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. 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 space­separated list of destinations                           in the form address:port:weight. 93
  94. 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. 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. 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
  97. 97. Irontec – Curso Apache Balanceo de carga LVS 97
  98. 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. 99. Irontec – Curso Apache 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 99
  100. 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. 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
  102. 102. Irontec – Curso Apache Balanceo de carga Keepalived 102
  103. 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
  104. 104. Irontec – Curso Apache Balanceo de carga DNS 104
  105. 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. 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. 107. Irontec – Curso Apache Balanceo de carga mod_proxy_balancer 107
  108. 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. 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
  110. 110. Irontec – Curso Apache Balanceo de carga ● Estadísticas: 110
  111. 111. Irontec – Curso Apache Balanceo de carga <Location /balancer­manager> SetHandler balancer­manager Order deny,allow Allow from all </Location> 111
  112. 112. Irontec – Curso Apache Módulos MÓDULOS 112
  113. 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. 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. 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. 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
  117. 117. Irontec – Curso Apache Mod_Cache Manuales de Apache http://httpd.apache.org/docs/2.2/mod/mod_cache.html http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html 117
  118. 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. 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. 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. 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
  122. 122. Irontec – Curso Apache Mod_Rewrite RewriteCond %{HTTPS} !^on$ [NC] RewriteRule . nossl.html 122
  123. 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
  124. 124. Irontec – Curso Apache Mod_Rewrite RewriteEngine On RewriteCond %{HTTP_USER_AGENT} firefox [NC] RewriteCond %{REMOTE_ADDR} ^10.10.0.123 RewriteRule (.*) $1 [F] 124
  125. 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
  126. 126. Irontec – Curso Apache Mod_Rewrite RewriteEngine On RewriteCond %{REQUEST_URI} ^/google/(.*) RewriteRule . http://www.google.es/search?q=%1 126
  127. 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
  128. 128. Irontec – Curso Apache Mod_Rewrite RewriteRule .*­(.*) $1 128
  129. 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
  130. 130. Irontec – Curso Apache Mod_Rewrite <Directory /var/www/inicio> RewriteEngine On RewriteCond %{REQUEST_URI} ^(.*)login.html RewriteCond %{HTTPS} !^on$ [NC] RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI}  [L] RewriteCond %{REQUEST_URI} !^(.*)login.html RewriteCond %{HTTPS} ^on$ [NC] RewriteRule . http://%{HTTP_HOST}%{REQUEST_URI}  [L] </Directory> 130
  131. 131. Irontec – Curso Apache Mod_Security Mod Security 131
  132. 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. 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. 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: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 134
  135. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×