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:
¿Cómo pongo disponible un archivo mediante HTTP en un servicio público?
¿Cómo funciona el envío de hipertexto (texto + marcas)?
¿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
¿Qué estándares propone el W3C?
¿Cual es la última versión de HTML?
¿Y de CSS?
¿Y de HTTP?
¿En qué RFC está descrito el lenguaje HTML?
¿En qué RFC está descrito el lenguaje HTTP?
¿En qué año se creó HTTP?
¿Quién lo inventó y donde?
¿Para qué se inventó HTTP? ¿Qué problema no estaba resuelto antes?
Ejemplo de servicio web: Chuck Norris API
6.2.2. El Protocolo HTTP¶
El Protocolo de Transferencia de Hipertexto (HTTP):
Historia de HTTP
Diálogo HTTP ¿ Cómo funciona HTTP ?
Los tipos MIME
El formato de log estándar ( Common Log Format )
Actividad: Protocolo HTTP y tipos MIME
¿En qué RFC puedo ver los códigos de estado HTTP?
¿Qué significan los 501, 404, 301 y 200?
¿De cual de los códigos anteriores me tengo que preocupar?
Dime un ejemplo de método HTTP
¿Entiendes el esquema de petición-respuesta HTTP?
¿Qué campos tiene la cabecera del mensaje en el ejemplo de la Wikipedia?
¿Cual es el tipo MIME más común?
¿Cual es el tipo/suptipo MIME de una imagen png?
¿Y de un archivo de Excel?
¿Puedes entender los campos de un log estándar web?
6.2.3. El Mensaje HTTP¶
El mensaje: peticiones y respuestas
Estructura:
Actividad: Cabeceras HTTP
Revisa qué significan los siguientes campos de cabecera (http headers), y qué valores puede tener:
Accept
Content Type
Cache-Control
Cookie
Content-Length
Date
Host
Referer
User-Agent
Accept-Charset
Accept-Encoding
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
Instala wget en tu máquina (la que quieras) (también podrías trabajar con cURL )
Descarga un archivo (por ejemplo de www.apuntesinformaticafp.com). ¿Cuál descarga?
Descarga el archivo y también las cabeceras.
¿Cómo descargas un sitio web de forma recursiva? (ojo a limitar los niveles de recursividad)
¿Cómo haces para realizar una descarga, y que continúe, aunque se caiga la conexión?
¿Cómo haces para que coja los urls a descargar, de un archivo?
¿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
LAMP es una arquitectura completa (no sólo servidor http)
Conceptos Previos ( getting started )
Clientes, Servidores y URLs
Hostnames y DNS. Concepto Virtual Host
Archivos de configuración (httpd.conf) y Directivas (secciones de configuración)
Contenido del Sitio Web (Document Root). Concepto de Páginas Estáticas y Dinámicas
Archivos de Log (ErrorLog y CustomLog)
Ejemplo de instalación de Apache en Debian 10 ( se puede usar otro).
Actividad: Escoger servidor e instalarlo
Instala el servidor (vía gestor de paquetes).
¿Donde está (URL) la documentación oficial del servidor?
¿Donde está el archivo de configuración? Revisa el contenido
¿Donde está el contenido del sitio web? Revisa el directorio
Arranca (para y revisa) el servidor
Prueba el servicio en local (localhost)
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:
General (todo el servidor) o
Específicas (a directorios, archivos, urls, etc)
Explicación de las Directivas
Descripción
Sintaxis
Por Defecto
Contexto
Override
Estado
Módulo
Ejemplos de Configuración (depende la distribución):
Asignar Interfaz y Puerto ( Listen )
Directorio Raíz ( DocumentRoot )
Formato de Log ( LogFormat )
Archivo índice ( DirectoryIndex )
Páginas Personalizadas en Códigos HTTP ( ErrorDocument )
Alias a directorios del sistema de archivos ( Alias )
Redireccionar un URL ( Redirect ): en el mismo servidor o a uno externo
Ver los archivos de un directorio ( Options +Indexes)
Busca una directiva cualquiera (que hay muchas )
Actividad. Configurar un servicio web
¿En qué dirección IP está escuchando? (Listen -> ports.conf)
¿En qué puerto? (Listen -> ports.conf)
Asigna el directorio raíz que tú escojas (DocumentRoot -> sites-available/000-default.conf)
Revisar el archivo de log del servidor (errores) (ErrorLog -> sites-available/000-default.conf)
Revisa el log de las conexiones (CustomLog-> sites-available/000-default.conf)
¿Qué campos está guardando en el log? ¿Quieres añadir alguno nuevo? (LogFormat -> apache2.conf)
Cuando entra en un directorio, me interesa que use index.htm e index.html como archivos de índice (DirectoryIndex -> mods-enabled/dir.conf)
Pon el mensaje «Uy! no encuentro esta página» en respuesta a un código HTTP 404 (ErrorDocument -> ./sites-available/000-default.conf)
Pon un conjunto de imágenes en /srv/ftp/images y asocialas al directorio web /imagenes (Alias -> mods-enabled/alias.conf)
Añade un redireccionamiento, de un url de tu sitio web a otro sitio web (Redirect)
6.2.8. Control de Acceso¶
Configuración Específica en Directorios:
La directiva Options (+Indexes)
No usar archivos .htaccess (AllowOverride None)
La directiva Require (o RequireAny o RequireAll ): ¿puedes acceder a este recurso?
Autorización de acceso al recurso (Control de Acceso: ).
Proveedores: muchas opciones
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).
Configura los permisos en un directorio para que se pueda ver el contenido (listado). (Options / Directory -> mods-enabled/alias.conf)
¿Cómo permito que se pueda acceder a cualquier recurso?
¿Y a ninguno?
¿Y a un usuario concreto? ¿A un grupo?
¿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>
¿A qué directorio aplica?
¿El usuario superadmin está autorizado?
¿Y el usuario pepe? (pepe pertenece al grupo admins)
¿Y el usuario juan?
¿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)
Modo de autenticación. AuthType (Basic) y AuthName (un nombre)
Proveedor de autenticación: AuthBasicProvider (file)
Consulta de autenticación (basic / file): AuthUserFile y AuthGroupFile
Herramienta Apache para crear bd usuarios htpasswd
Criterios para escoger proveedor:
Facilidad Configuración y Gestión
Concurrencia y Número de Usuarios
Seguridad ( Asegurar Servicios). Siempre con TLS.
Actividad: Añadir autenticación y autorización
¿Están los módulos de autenticación cargados? (apachectl -h)
Crea un archivo-base de datos de usuarios (p.ej bd_usuarios)
Crea un archivo de grupos (p.ej bd_grupos)
Configura un directorio para que sólo pueda acceder un usuario concreto (p.ej usuario1)
¿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:
Los logs del servidor (ErrorLog): error.log (o journalctl -u apache2).
Los logs de acceso (CustomLog): access.log.
¿Qué campos aparecen registrados? LogFormat
Nivel de detalle de log (LogLevel)
Actividad: Análisis de mi sitio web (log)
Revisa las últimas 15 líneas del log de acceso de forma directa (–follow). ¿Qué peticiones se están haciendo?
Ahora revisa los diferentes archivos de log que tengas.
¿Algún intento de petición sospechosa?
¿Que archivos han solicitado, que no hay en tu servidor?
¿Alguna IP que tengas que bloquear?
¿Cuántas peticiones hizo una IP concreta? (uso vía comandos)
¿Cuántas peticiones tuviste, cada día?
¿Y un día concreto?
¿Cuántas peticiones desde un SO Mac OS X?
¿Ha visitado Google tu sitio web?
6.2.11. Análisis de una web¶
Herramientas para Análisis Web (muchas)
Analizadores de logs
Servicios de Análisis de Webs ( Google LightHouse ).
Desarrollo Web (p.ej Google Developer Tools )
Actividad: Análisis de mi sitio web (web)
¿Cuántas peticiones hace tu cliente al cargar tu web?
¿Cuántas imágenes hay en cada petición?
¿Carga algún script?
¿Cual es el elemento que más tarda en cargarse?
¿Puedes ver el código html de un elemento concreto?
Analiza la web de la wikipedia
Analiza la web del Marca
6.2.12. Práctica Final HTTP¶
Actividad: Práctica Final