Category Archives: Sysadmin

You need to load the kernel first (parte 2)

Dopo anni di modalità BIOS Legacy ho effettuato il passaggio a UEFI per sfruttarne alcune delle sue caratteristiche.
Andrà quindi reinstallato grub in modalità EFI, ma per mia paranoia maggiore sicurezza ho aggiunto anche altre due alternative “salva” boot:

  • refind: un Bootloader che può caricare kernel o EFI stub presenti nella partizione EFI di boot. Rinominandolo come /EFI/BOOT/bootx64.efi il sistema lo caricherà di default quando non trova altre immagini disponibili
  • EFI stub realizzata con Buildroot contenente kernel + ramdisk con varie utility di rescue. In meno di 30MB si riesce ad avere un sistema con driver ethernet, wifi, busybox completo, RAID, BTRFS…

    Occorre fare attenzione ad alcune cose: l’immagine Buildroot va creata in modo che l’initrd sia linkata nel kernel creando così un solo file all-inclusive.
    # make menuconfig
    Filesystem images —>
    seleziona initial RAM filesystem linked into the kernel (cpio)

    Nel kernel va abilitato il supporto all’EFI stub affinché l’immagine creata sia in formato .efi e dato che UEFI funziona via framebuffer anche questo va abilitato altrimenti lo schermo rimarrà fisso al logo del bootloader.
    # make linux-menuconfig
    Processor type and features —>
    EFI runtime service support —>
    EFI stub supportDevice Drivers —>
    Graphics support —>
    Frame buffer Devices —>
    Support for frame buffer devices —>
    EFI-based Framebuffer Support

You need to load the kernel first (parte 1)

Avete presente quella sensazione di sconforto che si prova quando, dopo un aggiornamento, il sistema si blocca su una misera shell di ripristino privandoci del nostro rassicurante login grafico? Incasinare l’avvio di Linux è un’eventualità piuttosto probabile: sovrascrittura del MBR, aggiornamenti di kernel e bootloader, apt-get dist-upgrade… In questi casi spesso non resta che dover recuperare un LiveCD, chrootarsi o addirittura reinstallare tutto.
Cosa si può fare per prevenirlo?

Svariati anni fa, ai tempi in cui “la mia vita fin lì, entrava tutta dentro uno Iomega ZIP”, nel tentativo compilare un nuovo kernel per una RedHat riuscii nell’impresa di cancellare tutti i file vmlinuz-* in /boot ad eccezione del mio. Risultato? Sistema bloccato perché mancavano i driver per montare il filesystem. Da allora tengo sempre almeno due kernel funzionanti e testati in /boot.

Per i successivi 22 anni ho dormito sogni tranquilli, tra snapshots di btrfs e kernel di scorta, finché dopo un aggiornamento di grub su Archlinux mi sono ritrovato con un sistema non avviabile. Tutto risolvibile con un LiveCD, arch-chroot e grub-install… ma è stato fastidioso e nel prossimo articolo vedremo qualche accorgimento per salvarci le chiappe il boot anche nei casi più disperati.

i486

Scrivendo l’articolo NO GRAPHIC NO PARTY mi sono accorto che non esistono distribuzioni moderne capaci di girare su un 486.

La soluzione più semplice è quella di costruirsi il proprio sistema Linux personalizzato con Buildroot, come descritto nella guida Linux minimale per PC i386/i486.

Con questo tool non è stato difficile realizzare un sistema Linux che supportasse PCI, ISA, IDE legacy, IPV4/6, le principali schede di rete ethernet dell’epoca e degli attuali emulatori, l’hotplug; che comprendesse busybox completo, svariati tool come iptables, nano, openssl, dropbear, ncftp, lynx, mutt, mpg123 e si accontentasse di un 486 con 24MB RAM ed un hard disk da 40MB.

Realizzare un sistema Linux recente per i386 è invece fuori discussione, anche usando l’ultimo kernel disponibile per 386 (3.7.10) ed un buildroot di una decina di anni fa è si fa molta fatica a stare sotto alle 16MB RAM. In questo caso conviene accontentarsi di una vecchia distro floppy minimale.

XMPP

I tuoi amici nerd ti bullizzano perché usi ancora software proprietario come Telegram e non sei migrato a Matrix?
Rilancia hostando con Prosody il tuo server XMPP personale! (Sì, il vecchio caro Jabber di fine anni ’90…)

Consumando solo una 40ina di MB di RAM e pochi MB di disco può girare su piccoli server virtuali, sistemi embedded, hardware di recupero…
Grazie alle librerie di gateway Slidge puoi creare dei bridge verso altri network come WhatsApp o Telegram proprio come fa Matrix.

Per rendere il server XMPP ancora più sicuro e far rosicare i tuoi amici consiglio di non renderlo disponibile in chiaro su Internet, ma tramite reti anonime come TOR, Yggdrasil o I2P.

Basterà installare il pacchetto “prosody” sulla vostra distro preferita e configurarlo come segue:

Se vogliamo lasciare che i nuovi utenti possano creare un account basterà scrivere nel file di configurazione /etc/prosody/prosody.cfg.lua

allow_registration = true

Altrimenti (scelta consigliata se vogliamo gestire una piattaforma per pochi intimi) possiamo creare manualmente gli utenti col comando

prosodyctl adduser

A seguire un esempio di file prosody.cfg.lua
È stata permessa la creazione di utenti e oltre al server principale su Yggdrasil ci sono due virtualhost su TOR e I2P.
Non ho abilitato tls perché non mi serve dato che lo uso su reti già cifrate, mentre il modulo “muc” serve per la creazione di stanze

/etc/prosody/prosody.cfg.lua

daemonize = true
pidfile = "/run/prosody/prosody.pid"

modules_enabled = {
"roster"; "saslauth";
-- "tls";
"dialback"; "disco";#/etc/prosody/prosody.cfg.lua
"carbons"; "pep";
"private"; "blocklist";
"vcard4"; "vcard_legacy";
"version"; "uptime";
"time"; "ping";
"admin_shell";
--"muc";
}

allow_registration = false
authentication = "internal_hashed"
storage = "internal"
log = {
info = "/var/log/prosody/prosody.log";
error = "/var/log/prosody/prosody.err";
}
c2s_require_encryption = false
s2s_secure_auth = false
interfaces = { "127.0.0.1", "::1" }
VirtualHost "blablablablabalbalblablablablabalblabalbalblablabalba.b32.i2p"
enabled = true
Component "conference.blablablablabalbalblablablablabalblabalbalblablabalba.b32.i2p" "muc"
muc_room_cache_size = 100
restrict_room_creation = "local"
VirtualHost "blablablablabalbalblablablablabalblabalbalblablabalbalbalb.onion"
enabled = true
Component "conference.blablablablabalbalblablablablabalblabalbalblablabalbalbalb.onion" "muc"
muc_room_cache_size = 100
restrict_room_creation = "local"

A seguire anche le modifiche sui file di configurazione di TOR e I2P

/etc/tor/torrc

HiddenServiceDir /var/lib/tor/xmpp/
HiddenServicePort 5222 127.0.0.1:5222

/etc/i2pd/tunnels.conf

[xmpp]
type = server
host = 127.0.0.1
port = 5222
keys = xmpp.dat

Yggdrasil, la rete a prova di futuro

L’ostacolo principale per l’affermazione di una nuova tecnologia non è la sua complessità, ma l’esistenza di una tecnologia precedente che riesca, sebbene in maniera parziale, a svolgerne funzioni simili.

Questo è il motivo per il quale, nonostante l’IPv6 e le connessioni Internet a banda larga esistano da oltre 20 anni, l’utente medio impreca ancora col NAT e non può godersi un IP statico.

La rete Yggdrasil, che non ha niente a che fare con la storica distribuzione Linux Plug&Play dei primi anni ’90, vi permetterà di sperimentare l’ebrezza di avere un IPv6 statico bypassando l’inerzia dei vostri provider!
Si tratta infatti di una rete mesh VPN IPv6 con cifratura end-to-end, praticamente una rete privata dove ogni partecipante è sia host che client, che si auto-organizza senza autorità centrale e che cifra tutte le connessioni.

Funzionalità

  • Mesh Networking: protocollo di routing distribuito basato su una Distributed Hash Table (DHT), simile a Kademlia. Ogni nodo si connette ad altri nodi formando una rete, a differenza di quanto accada con le normali reti geografiche.
  • Cifratura end-to-end: tutto il traffico è cifrato in maniera simile ad una VPN, ma integrato. Più o meno come era stata pensata la cifratura nativa di IPv6 con IPsec.
  • IPv6 nativo: Assegna indirizzi IPv6 univoci e permanenti, basati sull’hash di una chiave pubblica che genera al primo avvio

In pratica

1) Si installa il software Yggdrasil sul dispositivo
2) Ci si connette ad almeno un altro nodo Yggdrasil (un amico, un server pubblico) impostandolo su /etc/yggdrasil.conf
3) Il programma scopre automaticamente altri nodi e crea i percorsi ottimali
4) Viene creata una nuova interfaccia di rete tun0 alla quale è attribuito un indirizzo IPv6 univoco (es.: 200:x:x:x::/64)
5) Adesso si è pronti per comunicare con qualsiasi altro dispositivo presente sulla rete Yggdrasil

Casi d’uso principali

  • Alternativa (a prova di utonto) ai tradizionali software VPN come Wireguard o OpenVPN
  • Alternativa a VPN commerciali
  • Comunicazioni sicure senza dipendere dalla cifratura del protocollo di comunicazione (http, ftp, telnet, imap…)
  • Reti comunitarie in aree con internet limitato (es. università, laboratori, uffici…)
  • Creazione di servizi decentralizzati (chat, file sharing, hosting)

Indice delle principali pagine web su Yggdrasil
http://[21e:a51c:885b:7db0:166e:927:98cd:d186]/