Skip to content

Commit c321dfb

Browse files
authored
TP2 2024 C1 (#442)
1 parent a576337 commit c321dfb

File tree

1 file changed

+341
-0
lines changed

1 file changed

+341
-0
lines changed

tps/2024_1/tp2.md

Lines changed: 341 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,341 @@
1+
f---
2+
math: true
3+
---
4+
5+
{% assign tp = site.data.trabajos.TP2 %}
6+
{% capture fecha %}{{tp.entrega | date: "%e/%m"}}{% endcapture %}
7+
8+
Trabajo Práctico 2 - Análisis de logs
9+
================
10+
{:.no_toc}
11+
12+
El trabajo práctico número 2 tiene fecha de entrega para el día **{{fecha}}**
13+
14+
Contenido
15+
---------
16+
{:.no_toc}
17+
18+
* Contenido
19+
{:toc}
20+
21+
22+
Introducción
23+
------------
24+
25+
<p style="text-align: center;">
26+
<img src="{{ 'assets/tps/2017_2/tp2/uma1.png' | relative_url }}" width="200">
27+
<img src="{{ 'assets/tps/2017_2/tp2/uma2.png' | relative_url }}" width="250">
28+
</p>
29+
30+
31+
Una cierta materia de una prestigiosa Universidad de Música ha puesto a
32+
disposición un corrector automático de partituras. Puesto que los docentes a
33+
cargo del curso no tienen demasiada experiencia en programación de sistemas web,
34+
la decenas de visitas diarias al sitio han hecho que los servidores se caigan.
35+
36+
Como cada acceso al sistema queda registrado, los músicos han buscado ayuda a
37+
estudiantes de Algoritmos y Estructuras ds Datos con mucha experiencia en manejo de
38+
archivos y entrada estándar en Go.
39+
40+
### Servidores y archivos de log
41+
42+
En algunas situaciones es preferible que una página web no esté habilitada en un
43+
único servidor web, sino en varios, y si es posible en lugares físicos del
44+
planeta alejados entre sí.
45+
46+
Esto se hace para evitar que un problema regional afecte la disponibilidad de la
47+
página web a nivel global. También sirve para optimizar el tráfico, conectando
48+
un usuario directamente con el servidor más cercano a su ubicación.
49+
Como cada servidor corre de manera independiente, también tendrá su archivo de
50+
log independiente.
51+
52+
Para este trabajo, dispondremos de archivos de log de [Apache](https://httpd.apache.org).
53+
Cada archivo de log representa la historia de solicitudes (_requests_) de un
54+
usuario hacia los recursos (_resources_) que provee un servidor en particular.
55+
Estos pueden ser cualquier tipo de archivos, desde páginas web (`.html`) hasta
56+
videos (`.avi`, `.mov`).
57+
58+
### Denegación de servicios
59+
60+
Nuestro interés es detectar situaciones de sobrecarga de solicitudes de un mismo
61+
cliente en un tiempo breve sobre un mismo servidor.
62+
A este tipo de comportamientos se los llama
63+
[ataque de denegación de servicio](https://es.wikipedia.org/wiki/Ataque_de_denegación_de_servicio)
64+
(DoS) cuando se realizan de forma malintencionada, con el objetivo de
65+
incrementar el tráfico hasta saturarlo haciendo imposible que otros usuarios
66+
legítimos puedan acceder a los servicios brindados por ese servidor.
67+
68+
Aquí pueden insertar todos los chistes del SIU cayéndose cuando se conectan tres
69+
usuarios al mismo tiempo.
70+
71+
### Direcciones IP
72+
73+
Podemos diferenciar de forma unívoca a un cliente que accede a un recurso a
74+
través de un identificador llamado _dirección IP_, o simplemente IP. Estos
75+
quedan registrados en los archivos de logs, y constan de cuatro bloques
76+
numéricos de un byte (es decir, desde 0 a 255). Las direcciones IP usualmente
77+
se escriben separadas por puntos: 192.168.1.1 y 63.255.0.12 son IPs válidas.
78+
79+
Notar que, **alfabéticamente**, el texto `190.0.0.0` es anterior a `62.0.0.0`, por
80+
ejemplo, aunque la numeración no sigue el mismo orden.
81+
Por lo tanto, en este trabajo, la forma en que se comparen debe tener en cuenta
82+
que se están comparando cuatro grupos de números, y que los números se comparan
83+
por valor numérico, no alfabético.
84+
85+
Interfaz
86+
--------
87+
88+
Es necesario implementar una interfaz del programa (no una interfaz gráfica),
89+
que leerá por entrada estándar los siguientes comandos:
90+
91+
- `agregar_archivo <nombre_archivo>`: procesa de forma completa un archivo de
92+
log.
93+
- `ver_visitantes <desde> <hasta>`: muestra todas las IPs que solicitaron algún
94+
recurso en el servidor, dentro del rango de IPs determinado.
95+
- `ver_mas_visitados <n>`: muestra los _n_ recursos más solicitados.
96+
97+
Si un comando es válido deberá imprimir `OK` por salida estándar después de ser
98+
ejecutado.
99+
Si un comando no pertenece a los listados previamente o tiene un error, se
100+
imprime `Error en comando <comando>` por `stderr` y se finaliza la ejecución.
101+
102+
El programa no tendrá un comando para terminar. Este finaliza cuando no quedan
103+
más líneas para procesar por entrada estándar.
104+
105+
### Agregar archivo
106+
107+
El comando se acompaña de la ruta de un archivo de log, accesible desde el mismo
108+
directorio donde se ejecuta el programa.
109+
110+
*Ejemplo:* `agregar_archivo 20171025.log`
111+
112+
Al ejecutarse se deberá procesar el archivo, y detectar posibles casos de ataques
113+
de denegación de servicio. Si se detecta que una dirección IP realizó cinco o más
114+
peticiones en **menos de dos segundos**, el comando debe alertarlo por salida
115+
estándar como sospechosa de intento de DoS.
116+
117+
A la hora de detectar denegaciones de servicio, varios archivos se consideran
118+
independientes ente sí, por lo que no se deberán memorizar entradas entre dos
119+
ejecuciones diferentes de `agregar_archivo`.
120+
121+
Para alertar una IP, basta con mostrar por salida estándar `DoS: <IP>`.
122+
Una misma dirección no deberá ser reportada más de una vez.
123+
Si varias direcciones son sospechosas, estas deberán ser mostradas en orden
124+
creciente.
125+
126+
*Ejemplo de salida:*
127+
128+
```
129+
DoS: 192.168.1.4
130+
DoS: 200.10.4.2
131+
OK
132+
```
133+
134+
### Ver visitantes
135+
136+
Este comando debe listar en orden a todas las IPs que realizaron alguna
137+
petición. Sólo se mostrarán las IPs que se encuentren dentro de un rango de IPs
138+
dado, con los límites inclusive. Como las direcciones son repartidas entre
139+
regiones, esto puede ser útil para saber desde dónde se accede al sitio.<sup>[1](https://xkcd.com/195/)</sup>
140+
141+
*Ejemplo:* `ver_visitantes 62.0.0.0 62.255.255.255` mostrará todas las IPs que
142+
empiezan con 62.
143+
144+
*Ejemplo de salida:*
145+
146+
```
147+
Visitantes:
148+
62.0.0.0
149+
62.9.128.3
150+
62.10.128.3
151+
62.10.129.3
152+
62.10.129.4
153+
62.62.62.62
154+
62.255.255.255
155+
OK
156+
```
157+
158+
Notar que la salida _contiene_ el texto "`Visitantes:`" y luego lista las IPs,
159+
en orden, precedidas por un caracter de tabulación (`\t`), una por línea.
160+
161+
### Ver más visitados
162+
163+
Este comando mostrará los _n_ recursos más solicitados. Esta información suele
164+
ser útil para analizar cuales son las páginas más visitadas a nivel global.
165+
166+
*Ejemplo:* `ver_mas_visitados 10` mostrará los 10 recursos más solicitados, para
167+
todos los logs analizados. Los sitios se muestran ordenados comenzando por el de
168+
mayor cantidad de solicitudes, separado con un guión a la cantidad. En caso de
169+
empate se pueden mostrar en cualquier orden.
170+
171+
*Ejemplo de salida:*
172+
173+
```
174+
Sitios más visitados:
175+
/algoritmos/tps/2024_1/tp1 - 57
176+
/algoritmos/faq/ - 35
177+
/algoritmos/guias/grafos - 25
178+
OK
179+
```
180+
181+
Notar que la salida _contiene_ el texto "`Sitios más visitados:`" y luego lista
182+
los recursos, en orden según visitas, precedidas por un caracter de tabulación
183+
(`\t`), uno por línea junto con la cantidad.
184+
185+
186+
Consideraciones adicionales
187+
---------------------------
188+
189+
### Archivos de log
190+
191+
Cada línea del archivo tiene la siguiente estructura:
192+
193+
- IP del cliente: es la IP del cliente que quiere acceder a un recurso (como el
194+
archivo de la página principal, o un archivo, por ejemplo).
195+
- Fecha y hora: la fecha y hora en la que se efectuó el pedido.
196+
- El método HTTP usado: puede ser GET, POST, PUT, etc.
197+
- La URL del recurso: es la ruta para ubicar un archivo, relativo a la raíz del
198+
servidor.
199+
200+
Cada dato de una línea de log está separado por una tabulación.
201+
202+
Ejemplo:
203+
204+
```
205+
208.115.111.72 2015-05-17T11:05:15+00:00 GET /corrector.html
206+
```
207+
208+
Además, todas las entradas en un archivo de log están registradas en orden cronológico.
209+
210+
Se provee una colección de logs de ejemplo
211+
[aquí](https://drive.google.com/drive/folders/0B0x0VPz_v-f_UENLUnVCMlBiWUE?usp=sharing).
212+
213+
Adicionalmente, se les proporciona un set de pruebas que pueden descargarse del sitio de descargas.
214+
215+
216+
### Fecha y hora
217+
218+
La fecha y hora estarán brindadas en formato
219+
[ISO-8601](https://www.iso.org/iso-8601-date-and-time-format.html),<sup>[2](https://xkcd.com/1179/)</sup>
220+
que consiste de año, mes, día, T mayúscula como separador, hora, minutos,
221+
segundos y zona horaria:
222+
223+
- año = 4 dígitos
224+
- mes = 3 letras
225+
- día = 2 dígitos
226+
- hora = 2 dígitos
227+
- minutos = 2 dígitos
228+
- segundos = 2 dígitos
229+
- zona = +/- 4 dígitos.
230+
231+
Los archivos de log provistos están dados en la zona horaria UTC, por lo que
232+
el valor del último segmento siempre será +00:00.
233+
234+
Para interpretar la sección de la fecha en Go pueden utilizar el módulo [`time`](https://pkg.go.dev/time)
235+
de la librería estándar. Allí pueden encontrar como parsear la fecha que se obtiene de los archivos
236+
((`time.Parse`)[https://pkg.go.dev/time#Parse]), así como la forma de obtener la diferencia en tiempos ((`time.Sub`)[https://pkg.go.dev/time#Time.Sub]).
237+
238+
Para la función `time.Parse` de Go, pueden utilizar `"2006-01-02T15:04:05-07:00"` como _layout_ para que coincida con el formato que estamos utilizando.
239+
240+
### Tiempos de ejecución
241+
242+
- Agregar archivo:
243+
- La búsqueda de DoS debe ser en $$\mathcal{O}(n)$$ siendo $$n$$ la cantidad de líneas del
244+
log.
245+
- El mantenimiento para actualizar los sitios más visitados también debe ser
246+
$$\mathcal{O}(n)$$.
247+
- El mantenimiento para actualizar los visitantes debe ser $$\mathcal{O}(n \log v)$$_
248+
siendo $$v$$ la cantidad de visitantes en toda la historia del programa.
249+
- Ver más visitados: debe ser $$\mathcal{O}(s \log k)$$ siendo $$s$$ la cantidad diferentes de
250+
sitios en toda la historia y $$k$$ el parámetro
251+
- Ver visitantes: debe ser $$\mathcal{O}(v)$$ en el peor caso (en el que se tenga que
252+
mostrar todos los visitantes), $$\mathcal{O}(\log v)$$ en un caso promedio (en el caso en
253+
el que no se pidan mostrar demasiados visitantes). Nuevamente, $$v$$ es la
254+
cantidad histórica de visitantes.
255+
256+
257+
Ejemplos
258+
--------
259+
260+
Se proveen ejemplos completos para mostrar la salida esperada en cada
261+
instrucción.
262+
263+
### Reporte de DoS
264+
265+
Para la siguiente entrada:
266+
267+
agregar_archivo access001.log
268+
agregar_archivo access002.log
269+
270+
Se espera una salida como la siguiente:
271+
272+
OK
273+
DoS: 50.139.66.106
274+
DoS: 67.61.65.249
275+
OK
276+
277+
En esta se reportan dos posibles ataques de DoS en el segundo archivo agregado,
278+
`access002.log`, pero ninguno en el primero.
279+
280+
### Ver más visitados
281+
282+
Para la siguiente entrada:
283+
284+
agregar_archivo access001.log
285+
agregar_archivo access004.log
286+
ver_mas_visitados 3
287+
288+
Se espera una salida como la siguiente:
289+
290+
OK
291+
OK
292+
Sitios más visitados:
293+
/favicon.ico - 144
294+
/ - 129
295+
/style2.css - 116
296+
OK
297+
298+
Notar que:
299+
300+
- de haberse detectado posibles DoS, deberían haberse reportado antes de los
301+
`OK` de `agregar_archivo` (pero dichos accessos a los recursos siguen quedando registrados).
302+
- los sitios más visitados se totalizan sumando los dos archivos agregados hasta
303+
el momento.
304+
- los sitios más visitados son reportados en orden según su frecuencia.
305+
306+
### Ver vistantes
307+
308+
Para la siguiente entrada:
309+
310+
agregar_archivo access001.log
311+
agregar_archivo access004.log
312+
ver_visitantes 200.49.0.0 201.30.0.0
313+
314+
Se espera una salida como la siguiente:
315+
316+
OK
317+
OK
318+
Visitantes:
319+
200.49.190.100
320+
200.49.190.101
321+
201.26.152.202
322+
OK
323+
324+
Notar que, igual que en el ejemplo anterior, los visitantes son reportados
325+
cuando aparecen en alguno de los archivos agregados hasta ese momento, en orden,
326+
según las direcciones IPs.
327+
328+
Entrega
329+
------------------------
330+
331+
El código entregado debe ser claro y legible y ajustarse a las especificaciones
332+
de la consigna. Debe compilar sin advertencias y correr sin errores de memoria.
333+
334+
La entrega incluye, obligatoriamente, los siguientes archivos de código:
335+
336+
- El código de la solución del TP, en su respectivo módulo (el directorio **debe** llamarse `tp2`)
337+
- El código de los TDAs programados en la cursada, en su respectivo módulo.
338+
339+
340+
La entrega se realiza exclusivamente en forma digital a través del [sistema de entregas]({{site.entregas}}),
341+
con todos los archivos mencionados en un único archivo ZIP.

0 commit comments

Comments
 (0)