From f257dea4d1f58468a0568d6b59f33a9b3aeb42eb Mon Sep 17 00:00:00 2001 From: Nulo Date: Tue, 1 Aug 2023 17:54:40 -0300 Subject: [PATCH] analisis --- .gitignore | 3 ++ graph.sql | 17 +++++++++++ graph_useragent.sql | 19 ++++++++++++ header_done.tsv | 1 + readme.md | 73 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+) create mode 100644 .gitignore create mode 100644 graph.sql create mode 100644 graph_useragent.sql create mode 100644 header_done.tsv create mode 100644 readme.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed98b69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +header.tsv +x.sqlite +x.tsv diff --git a/graph.sql b/graph.sql new file mode 100644 index 0000000..ff4948d --- /dev/null +++ b/graph.sql @@ -0,0 +1,17 @@ +with amounts as ( + select + tls_version, + count(*) as count + from logs + group by tls_version +), +max as ( + select max(count) as value + from amounts +) +select + tls_version, + count, + printf('%.' || (count * 30 / max.value) || 'c', '*') as bar +from amounts, max +order by tls_version; diff --git a/graph_useragent.sql b/graph_useragent.sql new file mode 100644 index 0000000..3ffb055 --- /dev/null +++ b/graph_useragent.sql @@ -0,0 +1,19 @@ +with amounts as ( + select + user_agent, + count(*) as count + from logs + where tls_version = "TLSv1" OR tls_version = "TLSv1.1" + group by user_agent +), +max as ( + select max(count) as value + from amounts +) +select + user_agent, + count, + printf('%.' || (count * 30 / max.value) || 'c', '*') as bar +from amounts, max +order by count; + diff --git a/header_done.tsv b/header_done.tsv new file mode 100644 index 0000000..a380eb7 --- /dev/null +++ b/header_done.tsv @@ -0,0 +1 @@ +uuid dominio http_version method path status_code encoding accept-encoding lang user_agent tls_version tls_algos tls_algos2 diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..b017231 --- /dev/null +++ b/readme.md @@ -0,0 +1,73 @@ +# analisis de datos de access logs de sutty + +mi teoría es que el uso de TLSv1 y TLSv1.1 es muy baja, y deberíamos desactivarla para no [poner en riesgo](https://blog.mozilla.org/security/2018/10/15/removing-old-versions-of-tls/) al resto de nuestrxs usuarixs. + +1. sincronizar archivos + + ```fish + rsync -vP root@gethen.sutty.nl:/srv/sutty/srv/panel.sutty.nl/_storage/'*.psql.gz' . + ``` + +2. descomprimir logs + + ```fish + gunzip -d *.gz + ``` + +3. convertir en un TSV gigante (NOTA: esto está escrito en [fish](https://fishshell.com/), aunque no debería ser tan complicado adaptar a otras shells) + + ```fish + for i in *.psql + grep -E '.{8}-.{4}-.{4}-.{4}-.{12}' $i + end > x.tsv + # limpiar espacio.. + rm *.psql + ``` + + tarea para lx lectorx: se pueden combinar estos tres pasos en uno y ahorrar en espacio de disco y tiempo ;) + +4. generar un archivo de un par de entries para especificar las key/value de cada cosa. ya lo hice, podés saltear este paso y usar `header_done.tsv` + + ```fish + head x.tsv > header.tsv + # editar header.tsv para tener valores de key al menos para los valores que nos importan + # usé libreoffice calc para hacerlo + ``` + +5. importar TSV a una base de datos SQLite (inspirado en [SQLite no es una base de datos de juguete](https://sysarmy.com/blog/posts/sqlite-no-es-una-base-de-datos-de-juguete/)) + + ``` + sqlite x.sqlite + > .mode tabs + > .import "|cat header_done.tsv x.tsv" logs + # van a haber errores... pero no son tantos + # a partir de cierto punto hay columnas de mas.. se ignoran + ``` + +6. (opcional) ¿usas btrfs? forzalo a comprimir la BD de SQLite con ZSTD: + + ``` + sudo btrfs filesystem defragment -czstd x.sqlite + ``` + + esto me lo deja a tan solo 11% del tamaño del archivo original ;) + +7. correr query que retora gráfico (también inspirado en el artículo de arriba) + + ``` + sqlite3 x.sqlite "$(cat graph.sql)" + ``` + + esto devuelve varias "tls_version" basura.. las filtro de lo próximo, que total son pocas requests: + + ``` + |1206821|**** + TLSv1|1689|* + TLSv1.1|24|* + TLSv1.2|1222869|**** + TLSv1.3|8805130|****************************** + ``` + + la primera línea son requests sin HTTPS. es normal, porque se usan para redirigir de HTTP a HTTPS y para Tor (porque tiene su propio cifrado). + + las requests de TLSv1 y v1.1 son algo así como 0.2%... no solo eso, sino que parecen provener generalmente de bots o navegadores que no soportamos de todas maneras (como Internet Explorer 9, 8 u 7), que se puede ver con `sqlite3 x.sqlite "$(cat graph_useragent.sql)"`. \ No newline at end of file