Il mio backlog di cose da scrivere fa spavento e so benissimo che parlarti di prodotti Self-hosted senza un minimo di introduzione può sembrare cosa stupida e insensata, ma ho bisogno di mettere a terra degli appunti che sicuramente mi torneranno comodi nuovamente in futuro. Voglio davvero parlarti di self-hosting e del mondo Docker (che fa il paio con quell’ormai vecchio articolo Cloudflare Tunnel: cos’è e come usarlo con Docker), spero di poterci mettere un po’ di testa e dita sulla tastiera entro un tempo ragionevole.
Protagonista di questo articolo d’appunti è PrivateBin (sto parlando di lui: privatebin.info), che io personalmente adoro e “tengo in casa” a disposizione di chiunque lo voglia, raggiungibile tramite l’URL privatebin.cerbero.cc. In breve, si tratta di un software pastebin open source con cifratura lato client, estremamente comodo per condividere appunti o log. E dato che ultimamente sto aiutando lo sviluppatore di Mail Archiver (mail-archiver.org) a risolvere una bega con le caselle Gmail “molto nutrite“, mi tocca spesso prendere dei log dal container in cui faccio girare la sua immagine, ripulirli da dati sensibili e poi metterglieli a disposizione. Ecco: per farlo mi sto appoggiando, tra le varie cose, a PBinCLI (pypi.org/project/PBinCLI).
PrivateBin da riga di comando
PrivateBin offre diversi vantaggi interessanti:
- cifratura end-to-end
- scadenza automatica dei contenuti
- possibilità di autodistruzione del paste dopo la lettura
Usarlo da CLI permette di automatizzare il flusso di lavoro, integrarlo (volendo) all’interno di script e condividere velocemente contenuti testuali senza uscire dal terminale. Dato che lo script di pulizia del log originale è già scritto in Python e gira su macchina Linux, ho solo completato l’opera affiancando PBinCLI in un virtualenv di Python.
Perché virtualenv?
Perché installare pacchetti Python globalmente mi ha già causato problemi o conflitti con il Python di sistema, e in generale perché mi sta notevolmente sul fondoschiena sporcare il sistema di base.
La soluzione più pulita è usare un ambiente virtuale, tanto costa zero ed è già assolutamente previsto in maniera nativa, perciò:
python3 -m venv cli source cli/bin/activate pip install pbincli
E il primo step è andato.
Configurazione personalizzata
Di default, PBinCLI utilizza un suo endpoint pubblico (disponibile all’indirizzo paste.i2pd.xyz, un “pelo tanto” indietro rispetto alla versione più aggiornata di PrivateBin). Considerato che ho la mia istanza, ho quindi preferito creare un file di configurazione personalizzato che PBinCLI rileverà sul sistema e andrà a utilizzare ogni volta che viene eseguito.
mkdir -p ~/.config/pbincli nano ~/.config/pbincli/pbincli.conf
Le opzioni utilizzabili sono tutte raccolte nella pagina ufficiale della libreria (sempre pypi.org/project/PBinCLI), nel mio caso ho semplicemente specificato questo:
server=https://privatebin.cerbero.cc/ expire=1week format=syntaxhighlighting
In questo modo ogni invio verrà eseguito verso la mia istanza senza dover specificare ogni volta l’URL completo o le opzioni che voglio tenere come predefinite (anche perché la scadenza di default è impostata a un giorno, cosa poco fattibile quando due persone devono lavorare insieme, e in tempi differenti, a un problema).
Inviare un file di testo
A questo punto non resta che prendere il file di testo e inviarlo direttamente tramite PBinCLI:
pbincli send file.txt
Il file non viene trattato come allegato: il suo contenuto viene caricato come testo, cifrato e pubblicato su PrivateBin. Il comando restituisce direttamente il link finale pronto da condividere (insieme a un set di altre informazioni utili eventualmente per la gestione / cancellazione prima del previsto):
(cli) hello@World:/# pbincli send helloworld.txt Reading text from stdin… Preparing paste… Uploading paste… Paste uploaded! PasteID: 8e54e66440a8a00f Password: DJZRTYSn7FgtCfZwAY3oar9p43jYHTxn4EkFCSu6a17G Delete token: ab16ee6c5750d2cddd0d0cbb14bd2b46214542f85c6422b5da5ffbe437f64f19 Link: https://privatebin.cerbero.cc/?8e54e66440a8a00f#DJZRTYSn7FgtCfZwAY3oar9p43jYHTxn4EkFCSu6a17G Delete Link: https://privatebin.cerbero.cc/?pasteid=8e54e66440a8a00f&deletetoken=ab16ee6c5750d2cddd0d0cbb14bd2b46214542f85c6422b5da5ffbe437f64f19
Inviare contenuto da stdin
In alternativa si può usare comunque lo standard input, comodo per l’utilizzo tramite pipe e automazioni:
cat file.txt | pbincli send -
O ancora puoi scegliere di inviare le ultime righe di un log:
tail -n 100 /var/log/syslog | pbincli send -
Questa modalità torna particolarmente utile quando vuoi condividere output generato al volo da uno script o da un comando di diagnostica.
Extra: Integrazione negli script
Paragrafo non vitale ma te lo lascio comunque qui perché vorrei evitare di tornare a parlare di questo argomento solo per aggiungere casi d’uso. Pensa potenzialmente alla pubblicazione automatica di un log al termine di uno script:
LOGFILE="/tmp/output.log" some_command > "$LOGFILE" 2>&1 URL=$(pbincli send "$LOGFILE" | grep -o 'https://.*') echo "Log disponibile qui: $URL"
In questo modo ottieni direttamente il link da allegare a notifiche, ticket o messaggi di supporto.
Richiamarlo tramite alias
Per rendere il comando ancora più rapido da usare, puoi sempre pensare di aggiungere un alias al terminale: alias pbpush='pbincli send' e poi usarlo così:
pbpush file.txt cat log.txt | pbpush -
Una rapida nota sulla sicurezza
Il vantaggio principale rispetto a un invio artigianale con strumenti generici come curl è che PBinCLI gestisce correttamente il modello di PrivateBin, inclusa la cifratura lato client. Questo aspetto è particolarmente importante quando si condividono log sensibili, configurazioni o output tecnici che non dovrebbero essere pubblicati in chiaro.
Conclusione
La combinazione tra virtualenv, PBinCLI e una propria istanza PrivateBin è una soluzione per me ideale, ma considera che l’ultimo tassello non è assolutamente fondamentale (potresti usare qualsiasi istanza di PrivateBin pubblicamente disponibile su Internet), soprattutto in ambienti server e in tutti quei casi in cui serve condividere rapidamente output testuali in modo ordinato e sicuro.
Se poi sei curioso come una faina, anche tu utilizzi Mail Archiver e dovessi avere necessità di condividere il log del container, allora ti ho pubblicato su GitHub lo script che sto usando per anonimizzare il log e togliere di mezzo le informazioni più sensibili: gist.github.com/gioxx/785b93b9a0adc747d1d0f5541f3c0ed7 :-)
#KeepItSimple