6. Servicios Web (HTTP)

6.1. ¿De qué va este tema?

Se trata de poner en marcha un servicio web sencillo. Es decir, resolver las siguientes cuestiones:

  1. ¿Cómo pongo disponible un archivo mediante HTTP en un servicio público?

  2. ¿Cómo funciona el envío de hipertexto (texto + marcas)?

  3. ¿Cómo instalo y configuro un servidor web?

6.2. Clases

Le dedicaremos unas 16 sesiones de clase

6.2.1. Servicios Web (Arquitectura)

  • Vivan los estándares: W3C

  • Servicios Web (sobre todo APIs REST ):

    • Independencia de los SO (interoperable)

    • Arquitecturas de Microservicios: servicios relacionados entre sí (sobre http).

    • Servidores de aplicaciones: http + algo más.

  • Principales Componentes:

    • Uso de texto (txt / json) o archivo con lenguajes de Marcas (xml / html ).

    • Hipertexto: HTML/CSS (texto + estructura + diseño) y mucho más (imágenes / video / audio / scripts / …).

    • Un URL (HTML) -> varios URL (peticiones).

    • Página Estática (archivo) vs Página Dinámica (en el momento).

    • La base fundamental: El Protocolo HTTP (no el lenguaje html).

    • Agente de Usuario: clientes (consola o gráfico)

Actividad: Introducción Servicios Web

  1. ¿Qué estándares propone el W3C?

  2. ¿Cual es la última versión de HTML?

  3. ¿Y de CSS?

  4. ¿Y de HTTP?

  5. ¿En qué RFC está descrito el lenguaje HTML?

  6. ¿En qué RFC está descrito el lenguaje HTTP?

  7. ¿En qué año se creó HTTP?

  8. ¿Quién lo inventó y donde?

  9. ¿Para qué se inventó HTTP? ¿Qué problema no estaba resuelto antes?

  10. Ejemplo de servicio web: Chuck Norris API

6.2.2. El Protocolo HTTP

  1. El Protocolo de Transferencia de Hipertexto (HTTP):

  1. Historia de HTTP

https://upload.wikimedia.org/wikipedia/es/timeline/r6z0e3hvnas3nhz5bnuwzt1nf8vtc8z.png
  1. Métodos

  2. Códigos de Estado

  3. Diálogo HTTP ¿ Cómo funciona HTTP ?

https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/diagram-of-http-communication-process-es.png
  1. Los tipos MIME

  2. El formato de log estándar ( Common Log Format )

Actividad: Protocolo HTTP y tipos MIME

  1. ¿En qué RFC puedo ver los códigos de estado HTTP?

  2. ¿Qué significan los 501, 404, 301 y 200?

  3. ¿De cual de los códigos anteriores me tengo que preocupar?

  4. Dime un ejemplo de método HTTP

  5. ¿Entiendes el esquema de petición-respuesta HTTP?

  6. ¿Qué campos tiene la cabecera del mensaje en el ejemplo de la Wikipedia?

  7. ¿Cual es el tipo MIME más común?

  8. ¿Cual es el tipo/suptipo MIME de una imagen png?

  9. ¿Y de un archivo de Excel?

  10. ¿Puedes entender los campos de un log estándar web?

6.2.3. El Mensaje HTTP

Mensajes HTTP :

https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages/httpmsgstructure2.png
  • El mensaje: peticiones y respuestas

  • Estructura:

    1. Petición:

      1. Línea de Inicio

      2. Cabeceras (campo: valor)

      3. Línea Vacía

      4. Cuerpo del mensaje (opcional)

    2. Respuesta:

      1. Línea de estado

      2. Cabeceras (campo: valor)

      3. Línea Vacía

      4. Cuerpo del mensaje (opcional)

  • Cabeceras HTTP para Dummies

Actividad: Cabeceras HTTP

Revisa qué significan los siguientes campos de cabecera (http headers), y qué valores puede tener:

  1. Accept

  2. Content Type

  3. Cache-Control

  4. Cookie

  5. Content-Length

  6. Date

  7. Host

  8. Referer

  9. User-Agent

  10. Accept-Charset

  11. Accept-Encoding

6.2.4. El Cliente HTTP (navegadores)

  1. El Agente de Usuario (HTTP):

  2. Ejemplos de Agentes de Usuario (User-Agent String)

Actividad: Navegadores y Agentes de Usuario

  1. ¿Cual fue el primer navegador web?

  2. ¿En qué año se utilizó por primera vez?

  3. ¿Cuántos navegadores hay en la actualidad?

  4. ¿Uno para navegar en modo texto?

  5. Instala (y usa) un navegador en modo texto (por ejemplo visitando la wikipedia o el marca)

  6. ¿Qué User-Agent String tiene Mozilla Firefox en un Windows de Escritorio?

  7. ¿Qué User-Agent String tiene Google Chrome en un Mac OS de Escritorio?

  8. ¿Qué UAS tiene el robot rastreador de Google?

  9. ¿Algún lugar donde buscar un ejemplo de UA?

  10. ¿Cual es el agente de usuario que estás utilizando ahora?

6.2.5. El Cliente HTTP (rastreadores web)

Uso de un agente en consola (web crawler GNU wget / wget)

  • Uso (descarga contenidos consola) y Pequeña Historia

  • Eficiente, Robusto, Portable, Automatizable y muy completo

Actividad: Uso de descargas web vía consola

  1. Instala wget en tu máquina (la que quieras) (también podrías trabajar con cURL )

  2. Descarga un archivo (por ejemplo de www.apuntesinformaticafp.com). ¿Cuál descarga?

  3. Descarga el archivo y también las cabeceras.

  4. ¿Cómo descargas un sitio web de forma recursiva? (ojo a limitar los niveles de recursividad)

  5. ¿Cómo haces para realizar una descarga, y que continúe, aunque se caiga la conexión?

  6. ¿Cómo haces para que coja los urls a descargar, de un archivo?

  7. ¿Cómo muestras el % de progreso de la descarga?

¿Alguna opción que hayas visto interesante? Porque tiene muchas opciones .

6.2.6. El Servidor HTTP

  • El Servidor Web

    • Funcionamiento de la conexión: GET (no envía body) vs POST (envía datos en el body)

    • Ejecutar Aplicaciones Web:

      • En el Cliente - front-end: Javascript

      • En el Servidor: PHP y similares

  • Algunas estadísticas de uso : diferentes servidores web

  • Por ejemplo, podemos usar: Apache , ngnix

  • LAMP es una arquitectura completa (no sólo servidor http)

  • Conceptos Previos ( getting started )

    1. Clientes, Servidores y URLs

    2. Hostnames y DNS. Concepto Virtual Host

    3. Archivos de configuración (httpd.conf) y Directivas (secciones de configuración)

    4. Contenido del Sitio Web (Document Root). Concepto de Páginas Estáticas y Dinámicas

    5. Archivos de Log (ErrorLog y CustomLog)

  • Ejemplo de instalación de Apache en Debian 10 ( se puede usar otro).

Actividad: Escoger servidor e instalarlo

  1. Instala el servidor (vía gestor de paquetes).

  2. ¿Donde está (URL) la documentación oficial del servidor?

  3. ¿Donde está el archivo de configuración? Revisa el contenido

  4. ¿Donde está el contenido del sitio web? Revisa el directorio

  5. Arranca (para y revisa) el servidor

  6. Prueba el servicio en local (localhost)

  7. Prueba el servicio en público (en el puerto 80).

6.2.7. Configuración Básica de un Servidor HTTP

Ámbito de aplicación de las directivas:

  1. General (todo el servidor) o

  2. Específicas (a directorios, archivos, urls, etc)

Explicación de las Directivas

  1. Descripción

  2. Sintaxis

  3. Por Defecto

  4. Contexto

  5. Override

  6. Estado

  7. Módulo

Ejemplos de Configuración (depende la distribución):

  1. Asignar Interfaz y Puerto ( Listen )

  2. Directorio Raíz ( DocumentRoot )

  3. Archivo de Log( ErrorLog y CustomLog )

  4. Formato de Log ( LogFormat )

  5. Archivo índice ( DirectoryIndex )

  6. Páginas Personalizadas en Códigos HTTP ( ErrorDocument )

  7. Alias a directorios del sistema de archivos ( Alias )

  8. Redireccionar un URL ( Redirect ): en el mismo servidor o a uno externo

  9. Ver los archivos de un directorio ( Options +Indexes)

  10. Busca una directiva cualquiera (que hay muchas )

Actividad. Configurar un servicio web

  1. ¿En qué dirección IP está escuchando? (Listen -> ports.conf)

  2. ¿En qué puerto? (Listen -> ports.conf)

  3. Asigna el directorio raíz que tú escojas (DocumentRoot -> sites-available/000-default.conf)

  4. Revisar el archivo de log del servidor (errores) (ErrorLog -> sites-available/000-default.conf)

  5. Revisa el log de las conexiones (CustomLog-> sites-available/000-default.conf)

  6. ¿Qué campos está guardando en el log? ¿Quieres añadir alguno nuevo? (LogFormat -> apache2.conf)

  7. Cuando entra en un directorio, me interesa que use index.htm e index.html como archivos de índice (DirectoryIndex -> mods-enabled/dir.conf)

  8. Pon el mensaje «Uy! no encuentro esta página» en respuesta a un código HTTP 404 (ErrorDocument -> ./sites-available/000-default.conf)

  9. Pon un conjunto de imágenes en /srv/ftp/images y asocialas al directorio web /imagenes (Alias -> mods-enabled/alias.conf)

  10. Añade un redireccionamiento, de un url de tu sitio web a otro sitio web (Redirect)

6.2.8. Control de Acceso

  1. Configuración Específica en Directorios:

    1. La directiva Options (+Indexes)

    2. No usar archivos .htaccess (AllowOverride None)

  2. La directiva Require (o RequireAny o RequireAll ): ¿puedes acceder a este recurso?

    1. ¿Quien? Según muchos parámetros (entity-name)

    2. ¿A donde? Directivas Directory , Files , Location

  3. Autorización de acceso al recurso (Control de Acceso: ).

    1. Proveedores: muchas opciones

    2. Definir por recurso

Actividad: Directivas de Control de Acceso

Recuerda que el contexto de estas directivas suele ser Directorio (no aplica a todo el servidor).

  1. Configura los permisos en un directorio para que se pueda ver el contenido (listado). (Options / Directory -> mods-enabled/alias.conf)

  2. ¿Cómo permito que se pueda acceder a cualquier recurso?

  3. ¿Y a ninguno?

  4. ¿Y a un usuario concreto? ¿A un grupo?

  5. ¿Quien dice qué grupo y/o usuario es el cliente? (próxima clase)

Revisa la siguiente configuración:

<Directory "/www/mydocs">
<RequireAll>
  <RequireAny>
      Require user superadmin
      <RequireAll>
          Require group admins
          Require ldap-group "cn=Administrators,o=Airius"
          <RequireAny>
              Require group sales
              Require ldap-attribute dept="sales"
          </RequireAny>
      </RequireAll>
  </RequireAny>
  <RequireNone>
      Require group temps
      Require ldap-group "cn=Temporary Employees,o=Airius"
  </RequireNone>
  </RequireAll>
  </Directory>
  1. ¿A qué directorio aplica?

  2. ¿El usuario superadmin está autorizado?

  3. ¿Y el usuario pepe? (pepe pertenece al grupo admins)

  4. ¿Y el usuario juan?

  5. ¿Cómo interpretas las siguiente configuración (estándar Debian)?

<Directory />
  Options FollowSymLinks
  AllowOverride None
  Require all denied
</Directory>

<Directory /usr/share>
   AllowOverride None
   Require all granted
</Directory>

<Directory /var/www/>
  Options -Indexes +FollowSymLinks
  AllowOverride None
  Require all granted
</Directory>

6.2.9. Autenticación y Autorización

Autenticación y Autorización (en Apache)

  1. Modo de autenticación. AuthType (Basic) y AuthName (un nombre)

  2. Proveedor de autenticación: AuthBasicProvider (file)

  3. Consulta de autenticación (basic / file): AuthUserFile y AuthGroupFile

  4. Herramienta Apache para crear bd usuarios htpasswd

  5. Criterios para escoger proveedor:

    1. Facilidad Configuración y Gestión

    2. Concurrencia y Número de Usuarios

    3. Seguridad ( Asegurar Servicios). Siempre con TLS.

  6. Autorizar a usuario o a grupo (Require group)

Actividad: Añadir autenticación y autorización

  1. ¿Están los módulos de autenticación cargados? (apachectl -h)

  2. Crea un archivo-base de datos de usuarios (p.ej bd_usuarios)

  3. Crea un archivo de grupos (p.ej bd_grupos)

  4. Configura un directorio para que sólo pueda acceder un usuario concreto (p.ej usuario1)

  5. ¿Y para que sólo pueda acceder un usuario de un grupo concreto? (p.ej usuarios)

6.2.10. Análisis de un sitio web (logs)

Analizar los logs:

  1. Los logs del servidor (ErrorLog): error.log (o journalctl -u apache2).

  2. Los logs de acceso (CustomLog): access.log.

  3. Revisión vía comandos y editor de texto (grep / wc / cut)

  4. ¿Qué campos aparecen registrados? LogFormat

  5. Nivel de detalle de log (LogLevel)

Actividad: Análisis de mi sitio web (log)

  1. Revisa las últimas 15 líneas del log de acceso de forma directa (–follow). ¿Qué peticiones se están haciendo?

  2. Ahora revisa los diferentes archivos de log que tengas.

  3. ¿Algún intento de petición sospechosa?

  4. ¿Que archivos han solicitado, que no hay en tu servidor?

  5. ¿Alguna IP que tengas que bloquear?

  6. ¿Cuántas peticiones hizo una IP concreta? (uso vía comandos)

  7. ¿Cuántas peticiones tuviste, cada día?

  8. ¿Y un día concreto?

  9. ¿Cuántas peticiones desde un SO Mac OS X?

  10. ¿Ha visitado Google tu sitio web?

6.2.11. Análisis de una web

Herramientas para Análisis Web (muchas)

  1. Analizadores de logs

  2. Servicios de Análisis de Webs ( Google LightHouse ).

  3. Desarrollo Web (p.ej Google Developer Tools )

Actividad: Análisis de mi sitio web (web)

  1. ¿Cuántas peticiones hace tu cliente al cargar tu web?

  2. ¿Cuántas imágenes hay en cada petición?

  3. ¿Carga algún script?

  4. ¿Cual es el elemento que más tarda en cargarse?

  5. ¿Puedes ver el código html de un elemento concreto?

  6. Analiza la web de la wikipedia

  7. Analiza la web del Marca

6.2.12. Práctica Final HTTP

Actividad: Práctica Final

Instalar un servicio HTTP