cd ../blue-team cybersecurity/blue-team
[ blue team :: superficie d'attacco ]

OpenRC o systemd

Che cosa fa un init system, quanto costa la centralizzazione e che cosa resta a chi vuole farne a meno.

Blue Team 2026-10-08

In breve

systemd non è «solo» il primo processo del sistema: è un progetto che ha assorbito log, sessioni, rete, DNS, timer e avvio. Funziona, ed è comodo. Il prezzo è che molte cose dipendono da un unico fornitore di codice, e che chi vuole farne a meno perde ogni anno un pezzo di desktop. OpenRC fa meno, lo fa con script leggibili e lascia il resto ad altri programmi. Semplice non vuol dire facile: la bicicletta richiede più gambe dell’automobile, ma la si ripara da soli.


1. Che cos’è un init system

Quando il kernel ha finito di inizializzare l’hardware avvia un solo programma, a cui assegna l’identificativo di processo numero 1. Tutto il resto discende da lì. Questo primo processo, l’init, ha tre compiti che non può delegare:

Se il PID 1 termina, il kernel va in panic e la macchina si ferma. È il motivo per cui la tradizione Unix ha sempre voluto questo programma piccolo: meno codice gira in quella posizione, meno cose possono rompersi dove non ci si può permettere una rottura.

Attorno all’init vero e proprio c’è il gestore dei servizi, cioè la parte che sa come si avvia un demone, da che cosa dipende, come lo si ferma. In molti sistemi le due cose sono programmi distinti. È una distinzione che torna utile più avanti, perché systemd le unisce e OpenRC no.


2. Da SysV a systemd: breve storia

Per vent’anni le distribuzioni GNU/Linux hanno usato SysVinit, ereditato da Unix System V: un init minimo che esegue, uno dopo l’altro, gli script di shell contenuti in /etc/init.d. Era lento all’avvio, perché procedeva in serie, e ogni distribuzione scriveva i propri script a modo suo.

Le tappe principali: in giallo i progetti alternativi a systemd, in rosso l’incidente di sicurezza del 2024.

I tentativi di superarlo furono diversi. OpenRC nacque nel 2007 dentro Gentoo, per mano di Roy Marples, come riscrittura in C del vecchio sistema di script della distribuzione. Ubuntu sviluppò Upstart, basato sugli eventi. Nel 2010 Lennart Poettering e Kay Sievers, allora dipendenti di Red Hat, pubblicarono systemd, con un’idea più ambiziosa: avviare i servizi in parallelo, descriverli con file dichiarativi anziché con script, e tenerli sotto controllo tramite i cgroup del kernel.

Lennart Poettering, coautore di systemd, nel 2012. Foto di Harald Hoyer, CC BY-SA 3.0 (Wikimedia Commons).

L’adozione fu rapida: Fedora nel 2011, Arch Linux nel 2012, Red Hat Enterprise Linux nel 2014, Debian e Ubuntu nel 2015. In Debian la scelta passò per un voto del comitato tecnico, nel febbraio 2014, e provocò una spaccatura: un gruppo di sviluppatori se ne andò e fondò Devuan, una Debian senza systemd.

Due precisazioni rispetto a quello che si legge di solito. systemd non è un prodotto di Red Hat in senso stretto: è un progetto libero, pubblicato con licenza LGPL, nato da suoi dipendenti e a lungo sostenuto dall’azienda. Poettering è poi passato a Microsoft nel 2022 e nel gennaio 2026 l’ha lasciata per fondare una propria società, Amutable. Non è quindi l’essere open source a distinguere OpenRC da systemd: lo sono entrambi. Li distingue quanto codice bisogna leggere per capire che cosa fanno.

Quanto al perché abbia vinto, l’abitudine di chi comincia con Fedora o Ubuntu conta, ma non basta a spiegarlo. systemd risolveva problemi reali: dava a chi scrive software un’interfaccia unica al posto di dieci dialetti di script, e a chi mantiene una distribuzione molto meno lavoro. Chi lo critica deve partire da qui, altrimenti critica una caricatura.


3. Che cosa fa systemd oggi

Il nome inganna. systemd non è un singolo programma ma una raccolta di alcune decine di eseguibili, sviluppati nello stesso repository e rilasciati insieme. Il PID 1 è uno di questi. Gli altri si occupano di:

Le stesse funzioni, con systemd e con OpenRC: a sinistra un solo progetto, a destra programmi indipendenti.

Dire che systemd è «monolitico» è quindi impreciso, e i suoi sviluppatori lo fanno notare da anni: i componenti sono processi separati e molti sono facoltativi. L’obiezione seria è un’altra. Questi componenti parlano tra loro tramite interfacce interne, che cambiano da una versione all’altra, e sono pensati per funzionare insieme. Sostituirne uno con un programma esterno è possibile sulla carta e faticoso in pratica. È un accoppiamento stretto più che un monolite, ma per chi deve mantenere il sistema la conseguenza è simile: si prende tutto, o si lavora molto per prendere di meno.

Chi controlla systemd su una macchina controlla i servizi, l’avvio, i log, le sessioni, l’alimentazione e, se sono attivi i moduli relativi, la rete e i nomi di dominio. È una concentrazione di responsabilità che nessun altro software di sistema ha mai avuto su GNU/Linux, kernel escluso.


4. OpenRC: che cos’è e che cosa non è

OpenRC è un gestore di servizi basato sulle dipendenze. A rigore non è nemmeno un init: per anni ha lavorato sopra SysVinit, che restava il PID 1, e solo dal 2017 include un proprio init minimo, openrc-init, che si può usare al suo posto.

Che cosa offre:

Che cosa non offre, ed è bene saperlo prima:

Quest’ultimo punto va detto con onestà, perché riguarda la sicurezza: su una macchina con systemd ben configurato un servizio compromesso può fare meno danni che sulla stessa macchina con OpenRC lasciato com’è. Il vantaggio di OpenRC è altrove: nella quantità di codice privilegiato che gira, e nella possibilità di capire per intero che cosa fa.


5. Lo stesso servizio, due scritture

Un esempio vale più della descrizione. Ecco un demone inventato, prima come unit di systemd:

# /etc/systemd/system/miodemone.service
[Unit]
Description=Il mio demone
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/bin/miodemone --config /etc/miodemone.conf
Restart=on-failure
NoNewPrivileges=yes
ProtectSystem=strict

[Install]
WantedBy=multi-user.target

E come script di OpenRC:

#!/sbin/openrc-run
# /etc/init.d/miodemone
description="Il mio demone"
command="/usr/bin/miodemone"
command_args="--config /etc/miodemone.conf"
command_background=true
pidfile="/run/miodemone.pid"

depend() {
    need net
    after firewall
}

I comandi di tutti i giorni si corrispondono quasi uno a uno:

Operazione systemd OpenRC
Avviare un servizio systemctl start miodemone rc-service miodemone start
Attivarlo all’avvio systemctl enable miodemone rc-update add miodemone default
Vedere lo stato systemctl status miodemone rc-service miodemone status
Elenco dei servizi systemctl list-units rc-status --all
Leggere i log journalctl -u miodemone il file in /var/log scelto dal demone o da syslog

Le due scritture sono lunghe uguali. La differenza sta in ciò che c’è dietro. La unit è un elenco di direttive interpretate da un programma grande, di cui bisogna conoscere il manuale. Lo script è codice di shell: se qualcosa non va, lo si apre e lo si esegue riga per riga. Il primo modello chiede fiducia, il secondo chiede competenza.


6. Semplice non vuol dire facile

Il confronto che mi sembra più chiaro è quello tra una bicicletta e un’automobile di ultima generazione. Quale delle due è più comoda? L’automobile, senza dubbio: porta più lontano con meno fatica. Ma per dare quella comodità è una macchina enormemente più complessa. E se dovessi ripararle entrambe, da solo, con gli attrezzi che ho in casa? La bicicletta la sistemo in un pomeriggio. L’automobile la porto in officina, dove la collegano a un computer del produttore.

Un’officina di biciclette: ogni pezzo è visibile e si sostituisce senza toccare gli altri. Foto di Alextredz, CC BY-SA 4.0 (Wikimedia Commons).

Semplicità e facilità sono due cose diverse. Lo ha detto bene il programmatore Rich Hickey in una conferenza del 2011, Simple Made Easy: facile è ciò che ho sotto mano e mi costa poco sforzo; semplice è ciò che non è intrecciato con altro. Un sistema può essere facile da usare e complicatissimo dentro, e viceversa. systemd è facile. OpenRC è semplice.

La distinzione ha una storia lunga. Il principio KISS (keep it simple, stupid) viene dall’aeronautica: lo si attribuisce a Kelly Johnson, capo progettista della Lockheed, che voleva aerei riparabili sul campo da un meccanico qualunque con pochi attrezzi. La filosofia Unix dice una cosa vicina con parole proprie. Nel 1978 Doug McIlroy la riassunse così: ogni programma faccia una cosa sola e la faccia bene, e i programmi siano scritti per lavorare insieme. Nella programmazione a oggetti lo stesso criterio si chiama principio di singola responsabilità: se una classe ha più di un motivo per cambiare, vanno fatte due classi.

L’idea comune è che la complessità si paga. Un sistema complesso è più difficile da capire, nasconde più errori, offre più appigli a chi lo attacca ed è più costoso da mantenere. Vale per una classe di cinquanta righe e vale per il primo processo di un sistema operativo.

Su GNU/Linux questa non è una posizione di nicchia. Il kernel e gli strumenti di base non sono nati per essere comodi all’utente finale, ma per restare robusti e mantenibili nel tempo; la comodità è arrivata dopo, con le distribuzioni che ci hanno costruito sopra. systemd rovescia la priorità: parte dalla comodità di chi integra il sistema e accetta la complessità che ne deriva.


7. Il costo della centralizzazione

Centralizzare vuol dire far dipendere molte cose da un anello della catena. Se quell’anello cede, cede ciò che vi è appeso. Non serve immaginarlo: è successo.

La backdoor di xz (2024). Nel marzo 2024 lo sviluppatore Andres Freund scoprì che le versioni 5.6.0 e 5.6.1 della libreria di compressione xz contenevano una backdoor, inserita con pazienza da un collaboratore che si era guadagnato la fiducia del manutentore in oltre due anni. Il bersaglio era il server SSH. OpenSSH non usa xz. Ma Debian, Fedora e altre distribuzioni lo modificavano per collegarlo a libsystemd, così da notificare a systemd l’avvenuto avvio; e libsystemd dipendeva da liblzma, cioè da xz. Per una funzione di poche righe, il demone più esposto di un server caricava una libreria con cui non aveva nulla a che fare. L’attacco fu fermato per caso prima di arrivare alle versioni stabili. Le distribuzioni senza systemd non erano raggiungibili per quella via.

Le falle nel codice privilegiato. Nel 2019 la società Qualys pubblicò tre vulnerabilità di journald, due delle quali permettevano a un utente locale di diventare root. Nel 2021 la stessa società ne trovò una nel PID 1: un percorso di montaggio abbastanza lungo mandava in crash systemd, e con lui l’intero sistema (CVE-2021-33910). Tutte corrette in fretta, e nessun software è esente da errori. Ma un errore pesa in proporzione a dove sta, e qui sta nel processo da cui dipende ogni altro.

La superficie d’attacco. Più codice gira con privilegi elevati e ascolta input esterni (pacchetti di rete, risposte DNS, nomi di file, messaggi su D-Bus), più punti ci sono da cui entrare. Un sistema con OpenRC, un demone di log e un client DHCP espone meno codice, scritto da gruppi diversi, che non condividono gli stessi errori.

A onor del vero, il bilancio non è a senso unico. Ho già detto dell’isolamento dei servizi, che systemd rende alla portata di tutti. Dopo il caso xz, inoltre, libsystemd carica le librerie di compressione solo quando servono, e OpenSSH ha imparato a notificare l’avvio senza collegarsi a libsystemd. Il sistema si corregge. Resta il fatto che la dipendenza esisteva, e che nessuno l’aveva considerata un rischio finché non è stata sfruttata.


8. Quando il desktop pretende l’init

C’è un secondo costo, meno tecnico e più politico. Quando un componente diventa lo standard di fatto, il software costruito sopra smette di prevedere le alternative. Non per ostilità: mantenere due strade costa lavoro, e i volontari sono pochi. L’effetto però è che la scelta dell’init, che dovrebbe riguardare solo l’amministratore, finisce per decidere quale desktop si può usare.

Gli ultimi dodici mesi lo mostrano bene.

Va riconosciuto un movimento in senso contrario: systemd 259 (dicembre 2025) ha aggiunto un supporto sperimentale a musl, la libreria C usata da Alpine e postmarketOS, con una lunga lista di funzioni che non vanno e nessuna garanzia per il futuro.

La tendenza resta leggibile. Ogni anno chi non usa systemd deve rinunciare a qualcosa in più, o mantenerlo da sé.


9. E la privacy?

Sull’argomento circolano accuse più grandi dei fatti, e conviene separare le une dagli altri.

I fatti. journald raccoglie in un unico archivio i messaggi di tutti i servizi e del kernel. resolved, se attivo, vede ogni nome di dominio che la macchina risolve. Sono dati che restano sul disco locale: systemd non invia telemetria a nessuno. Il problema è un altro. Un archivio unico e ben strutturato è comodo per l’amministratore ed è altrettanto comodo per chi mette le mani sulla macchina, che sia un intruso o chi la sequestra. Ridurre ciò che si registra e per quanto tempo lo si conserva è una misura di igiene che vale con qualunque init, ma che con systemd va fatta in modo esplicito (Storage=volatile, SystemMaxUse=, limiti di conservazione).

Il caso del 2026. In marzo è stata accettata in systemd una modifica che aggiunge all’anagrafica degli utenti (userdb) un campo facoltativo birthDate, la data di nascita. La motivazione dichiarata sono le leggi sulla verifica dell’età approvate in California, in Colorado e in Brasile, che impongono ai sistemi operativi di comunicare alle applicazioni la fascia d’età di chi li usa. L’autore della modifica ha precisato che si tratta di un dato dichiarato dall’amministratore, senza alcun controllo d’identità; Poettering ha sostenuto che systemd è uno strumento neutro e che la tutela spetta all’isolamento delle applicazioni. I critici hanno parlato di piano inclinato, ed è nato un fork che rimuove il campo.

Il campo, in sé, è poca cosa. Quello che l’episodio mostra è il meccanismo: quando un solo progetto gestisce l’identità degli utenti su quasi tutte le distribuzioni, una legge approvata in uno Stato americano diventa una riga di codice presente ovunque. Con componenti separati e sostituibili, la stessa richiesta avrebbe dovuto convincere molti progetti, uno alla volta.

Di init e di comunicazione tra processi parlo anche nella documentazione di Tutanum, dove la scelta fa parte di un progetto di sistema più ampio.


10. Le distribuzioni che ne fanno a meno

Sono poche rispetto al totale, ma non sono marginali: Alpine da sola regge una parte enorme dei container in produzione.

Distribuzione Init e servizi Note
Gentoo OpenRC (predefinito), systemd a scelta Si compila quasi tutto dai sorgenti; documentazione eccellente
Alpine init di BusyBox + OpenRC Usa musl al posto di glibc; minuscola, pensata per server e container
Artix OpenRC, runit, s6 o dinit Derivata di Arch; accesso ad AUR; senza GNOME dal 2025
Devuan SysVinit, OpenRC o runit Derivata di Debian, nata nel 2014 dalla disputa su systemd
Void runit Indipendente; versione con glibc e versione con musl
Guix System GNU Shepherd Init scritto e configurato in Scheme; sistema dichiarativo
Slackware SysVinit con script in stile BSD La più vecchia distribuzione ancora attiva
Chimera dinit Recente; strumenti di base presi da FreeBSD, libreria musl

Fuori da Linux la questione non si pone: FreeBSD, OpenBSD e NetBSD usano il proprio sistema rc, configurato in /etc/rc.conf, e systemd non è portabile perché dipende da funzioni specifiche del kernel Linux.

Un limite comune alle derivate, Artix e Devuan in testa, è la documentazione: per quasi tutto rimandano a quella della distribuzione madre, che dà per scontato systemd. Chi le usa impara presto a tradurre.


11. La mia esperienza: Artix, Arch e Gentoo

Uso Artix con OpenRC. La gestione dei servizi è lineare: si installa il pacchetto del programma, si installa il pacchetto con lo script (programma-openrc), lo si aggiunge al runlevel. Il caso scomodo è il software preso da AUR, che di solito porta con sé solo la unit di systemd: lo script di OpenRC bisogna scriverselo. Di rado sono più di quindici righe, ma è tempo che con systemd non si spende. È il costo della bicicletta.

Ho provato anche la strada più ripida, togliere systemd da Arch Linux. Non la consiglio. Arch non la prevede e non la documenta: systemd è una dipendenza diretta o indiretta di una grande quantità di pacchetti, a cominciare dal gestore dei dispositivi, udev, che ne fa parte. L’alternativa storica è eudev, un fork di udev creato nel 2012 dagli sviluppatori di Gentoo proprio per usarlo senza il resto. Su AUR il pacchetto era fermo da anni, e mi sono trovato a scaricare i sorgenti dal repository, compilarli e impacchettarli da me. C’era una ragione: Gentoo ha annunciato nel 2021 di non voler più mantenere eudev, che è passato a un gruppo di contributori di Alpine, Devuan e Gentoo e da allora procede lentamente.

Su questo punto devo correggere un’idea che mi ero fatto. Artix usa udev, e non una sua alternativa: nel 2021 è passata da eudev alla versione originale, compilata da sola a partire dai sorgenti di systemd, senza il resto del progetto. È una soluzione pragmatica, e dice qualcosa: nemmeno le distribuzioni nate per evitare systemd riescono a fare a meno di tutto il suo codice.

Resterebbe Gentoo, che è la casa di OpenRC e la scelta più coerente. Richiede però conoscenze più profonde, tempi di compilazione lunghi, e non ha un deposito ricco come AUR. Per l’uso di tutti i giorni Artix è il compromesso che mi permette di lavorare.

La regola che ne ricavo è che, a parità di obiettivo, un sistema più controllabile chiede più tempo. Non è una legge: è il prezzo corrente, finché la strada meno battuta resta meno battuta.


12. Conclusioni

systemd è diventato lo standard perché ha risolto problemi veri a chi costruisce distribuzioni, e non c’è bisogno di immaginare altro per spiegarne il successo. Le obiezioni reggono lo stesso: concentra in un progetto solo funzioni che la tradizione Unix teneva separate, mette molto codice in posizione privilegiata, e trascina con sé il software che gli sta sopra fino a rendere le alternative impraticabili per chi vuole un desktop moderno.

OpenRC non è migliore in assoluto. Fa meno, isola meno, chiede più lavoro manuale. È preferibile per chi dà valore a tre cose: capire per intero che cosa gira sulla propria macchina, poter sostituire un pezzo senza cambiare tutto, e dipendere dal minor numero possibile di decisioni prese altrove.

Mi ero chiesto, scrivendo la prima versione di queste note, se in futuro per garantirci privacy e anonimato saremmo stati costretti a reinventare la ruota, compilando un sistema da zero con Linux From Scratch. Nel frattempo la domanda ha avuto una risposta ironica: dal 2026 anche Linux From Scratch insegna a costruire soltanto sistemi con systemd. La ruota, se servirà, andrà reinventata un po’ più in basso. Per ora esistono ancora Gentoo, Alpine, Artix, Devuan, Void e i BSD: conviene usarli, documentarli e contribuirvi, perché un’alternativa che nessuno mantiene smette di esistere.

Sul rapporto tra controllo del software e libertà di chi lo usa rimando a Come preferire il software libero al software proprietario; sulla protezione dei dati a macchina spenta, a Cifratura delle memorie.


Riferimenti

Contenuto a scopo didattico e di documentazione tecnica. Le notizie sulle versioni e sulle distribuzioni sono aggiornate all'ottobre 2026.

↑ cd ../blue-team cd ~/portfolio