Come isolare in modo sicuro gli utenti di hosting su Linux
Pubblicato il 12 novembre 2026

Un server condiviso può funzionare alla perfezione per mesi, finché un sito web compromesso non legge un file che non dovrebbe mai poter vedere. Ecco perché i team devono isolare in modo sicuro gli utenti di hosting: non come un lusso riservato alle grandi aziende di hosting, ma come regola fondamentale per ogni server che ospita più di un sito, cliente o progetto.
L’isolamento degli utenti limita i danni quando un’applicazione ha un plugin vulnerabile, una password debole o un file caricato che si rivela dannoso. Inoltre, impedisce che un account molto attivo rallenti i siti web di tutti gli altri. L’obiettivo è semplice: ogni cliente deve avere il controllo sufficiente per gestire i propri siti web, mentre il server mantiene confini chiari intorno a tutto il resto.
Che cosa significa davvero isolare gli utenti di hosting
L’isolamento non si ottiene con una sola impostazione. È un insieme di livelli che lavorano insieme. Come minimo, un account di hosting ha bisogno di un proprio utente Linux, una directory home, autorizzazioni sui file, credenziali del database, un processo PHP e regole di accesso. Un problema su un sito web non dovrebbe dare automaticamente accesso a tutti gli altri siti presenti sul server.
Immagina un server condiviso come un condominio. Un utente Linux distinto è la porta dell’appartamento. Le autorizzazioni corrette sui file sono la serratura. Pool PHP-FPM distinti, utenti del database e limiti delle risorse sono le pareti, le utenze e gli interruttori automatici. Un singolo livello è utile, ma affidarsi solo a quello è il modo in cui piccoli incidenti si trasformano in lunghe serate di lavoro.
Il livello di isolamento appropriato dipende da ciò che ospiti. Alcuni siti interni gestiti da un unico amministratore fidato hanno esigenze diverse da quelle di un server di un’agenzia con 80 account cliente. Per clienti senza rapporti tra loro, una separazione più rigorosa vale la configurazione aggiuntiva e il leggero aumento del consumo di memoria.
Inizia con un utente Linux per ogni account di hosting
Non eseguire mai tutti i siti web con lo stesso account di sistema. Se tutti i file web appartengono a un utente web generico, come `www-data`, qualsiasi script vulnerabile in grado di scrivere file potrebbe riuscire a modificare anche il sito di un altro cliente.
Crea un utente Linux dedicato per ogni account di hosting e assegnagli la proprietà della propria document root, dei log, dei file temporanei e dei file dell’applicazione. Evita, ove possibile, le directory condivise scrivibili. Una directory scrivibile da tutti gli account prima o poi diventa un luogo in cui si annidano i problemi.
Imposta autorizzazioni restrittive come configurazione predefinita. In genere, le directory dei siti web richiedono `755`, mentre per i file normali è possibile usare `644`. I file di configurazione che contengono dati riservati dovrebbero avere autorizzazioni più restrittive, spesso `600` o `640`, a seconda dell’account di servizio che deve poterli leggere. Non ricorrere a `777` solo perché una cartella di caricamento non funziona. Così si elimina il sintomo togliendo la serratura dalla porta.
La proprietà dei file è importante quanto le autorizzazioni numeriche. Un sito WordPress, ad esempio, potrebbe aver bisogno dell’accesso in scrittura a `wp-content/uploads`, ma il servizio web non dovrebbe poter riscrivere l’intera applicazione. Concedi l’accesso in scrittura solo alle directory che ne hanno effettivamente bisogno.
Evita percorsi condivisi che oltrepassano i confini degli account
Può essere allettante archiviare backup, sessioni, cache o file di distribuzione in una posizione comune. La soluzione è comoda finché le autorizzazioni non cambiano o un’attività di pulizia non elimina i file sbagliati. Conserva i dati delle applicazioni di ciascun utente nella directory home dell’account o in un’altra posizione appartenente specificamente a quell’account.
Se non è possibile evitare un servizio condiviso, definisci esplicitamente gli accessi. Usa un gruppo dedicato con le autorizzazioni minime necessarie, documentane lo scopo e riesaminalo dopo ogni modifica. L’accesso condiviso «temporaneo» tende a diventare permanente.
Esegui PHP separatamente per ogni account
Per i siti web PHP, il modello di esecuzione è una delle scelte più importanti che dovrai fare. Eseguire PHP tramite un processo condiviso significa che un sito vulnerabile potrebbe ereditare un accesso ben più ampio dei propri file. Usare un pool PHP-FPM separato per ogni utente di hosting crea un confine più netto: il worker PHP viene eseguito come utente Linux dell’account, con impostazioni e limiti di processo propri.
Un pool PHP-FPM per utente semplifica anche la risoluzione dei problemi. Se l’applicazione di un cliente inizia a consumare worker o memoria, puoi individuare il pool responsabile invece di considerare il server un unico grande mistero. Imposta limiti a livello di pool, come il numero massimo di processi figlio e i timeout delle richieste, in base al piano dell’account e alle reali esigenze dell’applicazione.
C’è un compromesso. Più pool PHP-FPM consumano più memoria di un unico pool condiviso, soprattutto su un piccolo server virtuale. Per un server con pochi siti a basso traffico, scegli limiti ragionevoli invece di creare pool sovradimensionati. Ma non rinunciare alla separazione degli account solo per risparmiare una modesta quantità di RAM. Aumenta la capacità prima di riunire tutti i tenant in un’unica zona di sicurezza.
Per le applicazioni non PHP, segui lo stesso principio. Esegui Node.js, Python, Ruby o servizi personalizzati con utenti dedicati. Usa servizi di sistema e file di ambiente separati, anziché un unico account applicativo condiviso che può accedere a ogni progetto.
Separa database, credenziali e dati riservati
Spesso è proprio sul server di database che l’isolamento viene meno senza che nessuno se ne accorga. Usare lo stesso account di amministratore del database per tutte le applicazioni è comodo durante la configurazione, ma resta rischioso per sempre. Ogni sito dovrebbe avere un proprio database e un proprio utente del database, con autorizzazioni limitate a quel database.
Non concedere agli utenti delle applicazioni privilegi globali, l’autorizzazione a creare nuovi utenti o l’accesso a ogni schema, a meno che non vi sia una specifica necessità operativa. La compromissione delle credenziali di un CMS dovrebbe esporre i dati di una sola applicazione, non i dati dei clienti di tutto il server.
Tratta i dati riservati con la stessa attenzione. Conserva le password dei database, le chiavi API e le credenziali di posta in file di configurazione appartenenti all’account. Tienili fuori dalle directory web pubbliche, dalle cartelle di controllo versione e dalle posizioni condivise dei backup. Quando un dipendente, collaboratore o cliente non ha più bisogno di accedere, revoca l’accesso invece di presumere che le vecchie credenziali restino innocue.
Controlla l’accesso alla shell, a SSH e alle attività pianificate
Non tutti gli utenti di hosting hanno bisogno di SSH. Per un cliente che gestisce solo un sito web di base, la gestione dei file tramite il pannello o SFTP potrebbe essere sufficiente. Per sviluppatori e agenzie, SSH può essere davvero utile per le distribuzioni, Composer, WP-CLI e il controllo dei log. La soluzione pratica non è bloccarlo ovunque, ma concederlo in modo mirato.
Quando possibile, usa chiavi SSH invece delle password. Disabilita l’accesso diretto di root, evita gli account amministratore condivisi e assegna al personale account distinti con nomi individuali, in modo da poter tracciare le azioni. Se un utente ha bisogno solo di trasferire file, valuta di limitare l’account a SFTP. Se ha bisogno di una shell, assicurati che non possa leggere le directory home degli altri utenti né sfruttare percorsi rischiosi di escalation dei privilegi.
Anche i cron job richiedono la stessa attenzione. Esegui ogni attività pianificata come utente proprietario, non come root e non con un account web condiviso. Un cron job difettoso può riempire un disco, inviare migliaia di email o eseguire ripetutamente uno script costoso. Imposta limiti chiari e controlla i job che non vengono modificati da molto tempo.
Imposta limiti alle risorse per ogni account
La sicurezza e la stabilità si incontrano nel controllo delle risorse. Un account può influire su tutti gli altri senza accedere ai loro file, semplicemente esaurendo CPU, memoria, processi, spazio su disco o inode. I limiti delle risorse circoscrivono al solo account responsabile i picchi di traffico, le query errate o i cicli involontari.
Usa i controlli supportati dal tuo ambiente Linux, come i limiti dei processi, le impostazioni dei pool PHP-FPM, le quote disco e i cgroups a livello di sistema. Monitora l’utilizzo effettivo prima di impostare i valori. Un limite troppo basso può compromettere il traffico legittimo di un sito e-commerce, le importazioni in background o i backup. Un limite troppo alto non è poi un gran limite.
Come minimo, monitora per ogni account, ove possibile, il carico della CPU, la pressione sulla memoria, l’utilizzo del disco e degli inode, il numero di processi, gli accessi non riusciti e il volume della posta in uscita. Il monitoraggio in tempo reale trasforma «il server sembra lento» in una risposta utile: quale utente, quale processo e da quando.
Aggiungi misure di contenimento, ma non confonderle con una soluzione
Gli ambienti chroot, i container e la virtualizzazione possono creare confini più solidi tra gli utenti. I container sono particolarmente utili quando i clienti hanno bisogno di ambienti di esecuzione, dipendenze o controlli a livello di servizio personalizzati, che altrimenti entrerebbero in conflitto su un unico sistema operativo. Le macchine virtuali offrono una separazione ancora più solida, con costi operativi maggiori.
Questi strumenti sono utili, ma non sostituiscono autorizzazioni, applicazione delle patch e credenziali sicure. Un container eseguito come root con un mount dell’host scrivibile non costituisce un confine sicuro tra tenant. Allo stesso modo, una jail chroot può limitare l’accesso visibile al file system, ma potrebbe non contenere ogni problema a livello di applicazione. Scegli il livello adeguato al rischio e configurarlo con attenzione.
Una lista di controllo pratica per l’isolamento
Prima di aggiungere un nuovo account di hosting, verifica questi elementi essenziali:
- L’account ha un proprio utente Linux, una directory home, i file del sito web, i log e i percorsi temporanei.
- PHP o un altro ambiente di esecuzione dell’applicazione viene eseguito con quell’utente, anziché con un’identità di servizio condivisa.
- L’account dispone di credenziali del database distinte, con accesso esclusivamente al proprio database.
- La proprietà e le autorizzazioni dei file impediscono letture e scritture tra account diversi.
- SSH, SFTP, cron job, backup e limiti delle risorse sono concessi e configurati per quell’account specifico.
Un pannello di controllo dovrebbe rendere visibili questi confini, anziché nasconderli dietro il gergo dei server. FASTPANEL aiuta gli amministratori a gestire account, domini, database e attività del server distinti da un’unica area di lavoro chiara, facilitando il mantenimento di un buon isolamento man mano che il server cresce.
Continua a verificare anche dopo la configurazione
L’isolamento non è un’attività da completare una volta per poi dimenticarsene. Nuovi plugin, script di migrazione, modifiche manuali alle autorizzazioni e interventi di assistenza frettolosi possono indebolirlo col tempo. Dopo le migrazioni dei siti, verifica la proprietà degli account, cerca i file scrivibili da tutti, rimuovi gli utenti inattivi, applica gli aggiornamenti di sicurezza e verifica i backup senza concedere ai processi di backup accessi non necessari a tutti gli account.
La configurazione migliore è quella che il tuo team riesce a comprendere e mantenere anche sotto pressione. Definisci confini chiari per ogni utente, rendi rare e documentate le eccezioni e lascia che il server svolga in silenzio il lavoro di impedire che una brutta giornata per un sito web diventi un problema per tutti.
