Come esportare i certificati di traefik

In seguito alla sostituzione del reverse proxy nginx con traefik abbiamo riscontrato una mancanza nei servizi di posta ospitati sul server.
Purtroppo questi ultimi avevano la necessita dei certificati TLS che solitamente vengono generati per la navigazione web, ad esempio il certificato del dominio linux.livorno.it.

Fino a quel momento i servizi di posta utilizzavano i certificati generati dal programma certbot (let’s encrypt), ma in seguito alla migrazione verso traefik i certificati venivano direttamente gestiti da lui, senza la necessità di utilizzare un programma esterno al reverse proxy come certbot.

Traefik però salva i propri certificati in un file dal nome acme.json, quindi in modo differente rispetto ai soliti file privkey.pem e fullchain.pem.
Come soluzione è stato pensato uno shell script per convertire parti del contenuto json in file pem.

#!/bin/sh

cd /srv/traefik/

ACME=`cat acme.json`
CERTIFICATES=`echo $ACME | jq '.myresolver.Certificates[]'`
DOMAIN_CERTIFICATE=`echo $CERTIFICATES | jq 'select( .domain.main == "linux.livorno.it" )'`

KEY_B64=`echo $DOMAIN_CERTIFICATE | jq -r '.key'`
CERT_B64=`echo $DOMAIN_CERTIFICATE | jq -r '.certificate'`

echo $KEY_B64 | base64 --decode > certificates/privkey.pem
echo $CERT_B64 | base64 --decode > certificates/fullchain.pem

In questo breve guida non approfondirò l’utilizzo di jq, maggiori info qui.

Riga 5 – Lettura del file acme.json e salvataggio del contenuto in un variabile
Riga 6 – Salvo in una variabile la lista Certificates del dizionario myresolver
Riga 7 – Il comando select seleziona ogni elemento della lista Certificates che ha il valore linux.livorno.it nella chiave name del dizionario domain. Gli elementi selezionati vengono salvati in una variabile.
Righe 9-10 – Vengono salvate in due variabili i valori delle chiavi key e certificate.
Righe 12-13 – Vengono decodificate in base64 le variabili e salvato il contenuto in due file, privkey.pem e fullchain.pem.

Un ultimo passo

Traefik mantiene aggiornati i certificati e non li fa scadere, ma anche noi dovremo aggiornare i file pem generati dal nostro script affinché non scadano.
La soluzione migliore è usare crontab, tramite cui possiamo inserire un comando temporizzato.

# "crontab -e" è solitamente il comando modificare crontab
0 0 * * 0 /usr/bin/sh /srv/traefik/esporta-certificati.sh >/dev/null 2>&1

Il valore 0 0 * * 0 esegue il comando ogni domenica alla mezzanotte.

Analisi dataset THOR WWII : Bombardamenti su Livorno

Dati storici

Bombardamenti su Livorno (immagine da Wikipedia)

Livorno è stata ampiamente bombardata durante la seconda guerra mondiale. I primi bombardamenti degli alleati sono iniziati nel febbraio del 1941 e sono terminati nel luglio del 1944. 

L’archivio degli alleati riporta 175 missioni aeree per un totale di 3364,50 tonnellate di esplosivi impiegati nel solo periodo dal maggio 1943 al luglio 1944.

Molte missioni avevano come obiettivo il porto, ma sono stati rilevanti le incursioni sull’area cittadina e sulle linee ferroviarie (“R R Tracks”) in quanto Livorno era ed è tuttora nodo di scambio verso le direttrici nord (Genova) ed est (Firenze, adriatico):

ObiettivoMissioni subite
HARBOR72
CITY AREA36
SHIPPING18
R R TRACKS10
OIL STORAGE5
POWER STATION2
SHIP YARDS1

Fra i bombardamenti sulle linee ferroviare indichiamo quello del ponte di Calafuria, sulla costa immediatamente a sud di Livorno, a cui dedicheremo una analisi specifica.

Tipi di aerei

Molti dei bombardamenti impiegarano dei Mitchell B25, aerei che potevano caricare fino a 7 tonnellate di esplosivo.

(Mitchell B25 – immagine da Wikipedia)
Missioni compiute da ogni tipo di aereo

Furono comunque impiegati diversi Boeing B-17, le famose “Fortezze volanti”

Boeing B17 – immagine da Wikipedia

L’analisi dei dati

Il periodo dei bombardamenti è stato estratto dalla tabella storica dei bombardamenti [1]. L’elenco delle missioni aeree è estratto da [2] ricercando le locazioni che iniziano con ‘leghorn’:

SELECT *
FROM public.thor_wwii_data_clean
WHERE tgt_location ILIKE 'leghorn%'
ORDER by msndate

Il totale delle bombe impiegate è calcolato con

SELECT sum(total_tons)
FROM public.thor_wwii_data_clean
WHERE tgt_location ILIKE 'leghorn%'

La statistica delle missioni per tipologia di obiettivo è stata calcolata con

SELECT distinct tgt_type, count(*) as missions_count
FROM public.thor_wwii_data_clean
WHERE tgt_location ilike 'leghorn%'
AND tgt_type IS NOT NULL
AND NOT tgt_type ILIKE 'unidentified%'
GROUP BY tgt_type
ORDER BY missions_count DESC

Il conteggio dei tipi di aerei impiegati è stato calcolato con

SELECT aircraft_name, count (*) as mission_count
FROM public.thor_wwii_data_clean
WHERE tgt_location ILIKE 'leghorn%'
GROUP BY aircraft_name
ORDER BY mission_count DESC

E’ da notare comunque che 

SELECT distinct tgt_location, tgt_country, latitude, longitude
FROM public.thor_wwii_data_clean
WHERE tgt_location ILIKE ‘leghorn%’

riporta nomi che oltre alla indicazione geografica includono anche specifici obiettivi (harbour, shipping, etc…). Per alcune missioni la nazione di appartenenza è errata (Livorno non è in Grecia), ma le coordinate geografiche sono corrette e quindi risolvono un eventuale dubbio di omonimia di un obiettivo greco.

Riferimenti

[1] gulli_wwii_bombing_leghorn, tabella su database server PostgreSQL GULLi

[2] thor_wwii_data_clean, tabella su database server PostgreSQL GULLi

Questa analisi fa parte dell’iniziativa “Analisi del dataset ‘Theater History of Operations (THOR) Data: World War II’” del Gruppo Utenti Linux di Livorno.

Tool e strumenti

I database indicati nell’articolo sono disponibili sul database PostgreSQL del GULLi. Per l’accesso interattivo al DB ed alle tabelle inviare un messaggio a info [at] linux.livorno.it.

Pubblicato in Vari