Come limitare l'accesso degli utenti SSH a directory specifiche in Ubuntu 24.04

Il modo più sicuro per limitare gli utenti SSH a una directory specifica su Ubuntu 24.04 è utilizzare OpenSSH ChrootDirectorycon ForceCommand internal-sftp. Questa soluzione è ideale quando l'account necessita solo del trasferimento di file. Fornisce all'utente una vista SFTP la cui radice del filesystem è la directory scelta, bloccando al contempo una shell interattiva e l'inoltro SSH.

Se l'utente ha effettivamente bisogno di una shell normale, la decisione è diversa. Una shell interattiva in un ambiente chroot necessita di un proprio binario shell, librerie, nodi dispositivo e file di supporto all'interno del jail. OpenSSH lo documenta esplicitamente. Per la maggior parte degli account di upload, backup, agenzie, fornitori e hosting condiviso, un chroot con solo SFTP è molto più semplice e meno soggetto a errori. Per gli utenti non attendibili che necessitano di un ambiente di comando completo, un container o una macchina virtuale dedicata sono generalmente più facili da gestire rispetto alla creazione manuale di un chroot shell.

Questa guida utilizza Ubuntu 24.04 LTS e un utente di esempio chiamato alice. L'utente avrà accesso limitato /srv/sftp/alicee potrà scrivere solo all'interno di /files. Sostituisci i nomi e i percorsi in base alle esigenze del tuo server.

Prima di iniziare: comprendere la regola di proprietà

Il problema più comune con i chroot è causato dai permessi. OpenSSH richiede che ogni componente del ChrootDirectorypercorso sia di proprietà di root e non scrivibile da gruppi o altri utenti . Questo requisito viene verificato incondizionatamente. Ciò significa che non dovresti rendere /srv/sftp/alicescrivibile da alice.

Invece, rendi la directory principale del jail di proprietà di root e crea una sottodirectory scrivibile:

/srv/sftp/alice        root:root   755
└── files              alice:alice 755

Questa configurazione segue il comportamento documentato nel manuale di Ubuntu 24.04sshd_config(5) . Lo stesso manuale specifica che internal-sftpnon sono necessari file di runtime aggiuntivi all'interno del chroot, motivo per cui è la soluzione ideale per un account con restrizioni al trasferimento di file.

Passaggio 1: Verificare che OpenSSH Server sia installato

Terminale Ubuntu che mostra l'installazione del server OpenSSH e il servizio SSH in esecuzione.
Prima di modificare le regole di accesso , verifica che il server OpenSSH sia installato e ssh.servicein esecuzione.

Installare il pacchetto server se necessario:

sudo apt update
sudo apt install openssh-server
sudo systemctl status ssh.service

La documentazione ufficiale di Ubuntu per OpenSSH utilizza openssh-serveril pacchetto daemon e ssh.servicela gestione dei servizi. Vedi la guida di Ubuntu Server per OpenSSH .

Se si tratta di una macchina remota e SSH è l'unico accesso amministrativo disponibile, mantieni aperta la sessione amministrativa corrente mentre apporti le modifiche. Una configurazione SSH errata può bloccare l'accesso.

Passaggio 2: crea un gruppo e aggiungi l'utente con restrizioni

Terminale Ubuntu: creazione del gruppo sftpusers e aggiunta dell'utente alice
Crea un gruppo dedicato in modo che la restrizione possa essere applicata in modo coerente a uno o più account che utilizzano solo SFTP.

Crea un gruppo per gli utenti con restrizioni. Se aliceesiste già, aggiungila semplicemente al gruppo:

sudo groupadd sftpusers
sudo adduser alice
sudo usermod -aG sftpusers alice
id alice

Se utilizzi già le chiavi pubbliche SSH, continua a farlo. La configurazione chroot controlla ciò che accade dopo l'autenticazione ; non è necessario passare dall'autenticazione tramite chiave a quella tramite password.

Una regola basata sui gruppi è generalmente preferibile a un Match Userblocco separato per ogni account. Permette di centralizzare le policy. Una regola per singolo utente rimane comunque utile quando è necessario limitare l'accesso a layout diversi e non correlati.

Passaggio 3: Creare una prigione di proprietà di root e una sottocartella scrivibile

Il terminale Ubuntu crea la directory /srv/sftp/alice e una sottodirectory per i file scrivibili dall'utente con proprietari separati.
La directory radice chroot rimane di proprietà di root; solo la filessottodirectory è scrivibile dall'utente con privilegi limitati.

Crea la gerarchia delle directory:

sudo mkdir -p /srv/sftp/alice/files
sudo chown root:root /srv/sftp/alice
sudo chmod 755 /srv/sftp/alice
sudo chown alice:alice /srv/sftp/alice/files
sudo chmod 755 /srv/sftp/alice/files

Verificare la proprietà:

ls -ld /srv /srv/sftp /srv/sftp/alice /srv/sftp/alice/files
namei -l /srv/sftp/alice

Se /srvla /srv/sftpdirectory è scrivibile dal gruppo o dall'utente, correggi anche quello. OpenSSH controlla tutti i componenti del percorso, non solo la directory finale.

Passaggio 4: Aggiungere una regola di corrispondenza in sshd_config.d

Nano editor che mostra un blocco Match Group sftpusers con restrizioni ChrootDirectory e internal-sftp
Un Match Groupblocco applica la policy chroot e SFTP-only solo ai membri di sftpusers.

La documentazione attuale di Ubuntu Server consiglia di mantenere le impostazioni SSH personalizzate /etc/ssh/sshd_config.d/anziché integrarle nel file principale del pacchetto. Crea uno snippet:

sudo nano /etc/ssh/sshd_config.d/90-sftp-restricted.conf

Aggiungere:

Match Group sftpusers
    ChrootDirectory /srv/sftp/%u
    ForceCommand internal-sftp -d /files
    DisableForwarding yes
    PermitTTY no

Match all

%usi espande al nome utente autenticato, quindi aliceviene posizionato in /srv/sftp/alice. L' -d /filesargomento indica al server SFTP interno di avviarsi all'interno della directory figlio scrivibile. DisableForwarding yesdisabilita l'inoltro di X11, agente, TCP e StreamLocal in un'unica direttiva; è specificamente documentato per semplificare le configurazioni con restrizioni.

La parte finale Match allè importante in un frammento di codice perché termina il contesto condizionale prima che la configurazione successiva venga analizzata.

Passaggio 5: Decidere tra restrizioni basate sui gruppi e restrizioni per singolo utente

Terminale Ubuntu per la creazione di un utente SFTP dedicato con restrizioni e della directory /srv/sftp/uploads-style
Utilizzare un account dedicato quando un fornitore, un processo di backup o un utente esterno non deve avere accesso normale alla shell.

Per più utenti con lo stesso layout, mantieni la regola di gruppo mostrata sopra. Per un singolo account eccezionale, utilizza invece un blocco specifico per l'utente:

Match User vendor1
    ChrootDirectory /srv/vendor/vendor1
    ForceCommand internal-sftp -d /incoming
    DisableForwarding yes
    PermitTTY no

Match all

Scegli in base ai costi amministrativi:

ScenarioLa regola migliorePerché
Molti utenti che effettuano solo caricamenti con la stessa strutturaMatch GroupUn'unica politica si applica a tutti i membri.
Un fornitore necessita di un elenco univocoMatch UserIl percorso e le restrizioni possono variare senza per questo pregiudicare gli altri.
L'utente necessita di una normale shell interattivaNon utilizzare questa ricetta solo SFTPUn ambiente chroot interattivo necessita di un ambiente di runtime completo.
L'utente non attendibile necessita di comandi e di un forte isolamento.Prendi in considerazione un container o una macchina virtualePiù semplice definire e aggiornare un ambiente di esecuzione completo.

Passaggio 6: Convalidare la configurazione SSH prima del riavvio

L'editor di Ubuntu mostra un blocco ChrootDirectory e ForceCommand internal-sftp per un utente con restrizioni
Prima di applicare una regola chroot, è necessario convalidare sia la sintassi che le impostazioni effettive per ciascun utente.

Non riavviare mai SSH immediatamente dopo aver modificato il file. Esegui prima il test di sintassi consigliato da Ubuntu:

sudo sshd -t

L'assenza di output indica che il controllo della sintassi è andato a buon fine. È inoltre possibile verificare la configurazione effettiva per un utente specifico:

sudo sshd -T -C user=alice,host=localhost,addr=127.0.0.1   | grep -E 'chrootdirectory|forcecommand|disableforwarding|permittty'

Dovresti visualizzare il percorso chroot previsto e il comando SFTP forzato. Questo è particolarmente utile su Ubuntu perché le impostazioni possono provenire da entrambi /etc/ssh/sshd_configi file presenti in /etc/ssh/sshd_config.d/. Ubuntu fa notare che OpenSSH generalmente utilizza il primo valore ottenuto per la maggior parte delle direttive, quindi verificare la configurazione effettiva è più sicuro che presumere quale file prevalga.

Passaggio 7: riavviare SSH e testare con SFTP

Terminale Ubuntu che mostra ssh.service attivo e un login SFTP la cui directory di lavoro remota è /uploads
Dopo un test di configurazione pulito, riavvia SSH e verifica che l'account acceda solo al filesystem SFTP isolato.

Applica la modifica:

sudo systemctl restart ssh.service
sudo systemctl status ssh.service

Quindi, connettiti da un altro terminale:

sftp alice@server.example.com

All'interno di SFTP, eseguire il test:

pwd
ls
put test.txt
ls -l

Con la configurazione sopra descritta, la directory SFTP iniziale dovrebbe essere /files. La barra mostrata da SFTP è la radice del chroot, non la radice reale del server.

Un normale tentativo di accesso alla shell non dovrebbe produrre una shell senza restrizioni:

ssh alice@server.example.com

Poiché ForceCommand internal-sftpsostituisce la sessione richiesta con il server SFTP in-process, questo account è destinato intenzionalmente al trasferimento di file piuttosto che all'esecuzione di comandi.

Passaggio 8: Verificare che l'utente non possa evadere dalla prigione

Il terminale SFTP tenta di accedere ai percorsi parent, /etc e /root e visualizza il messaggio "accesso negato".
Verifica esplicitamente il confine: percorsi come quello dell'host /etce /rootnon devono diventare visibili all'esterno del chroot.

Provate a spostarvi al di sopra della radice apparente e a ispezionare i percorsi host sensibili:

cd ..
ls /
ls /etc
ls /root

All'interno del chroot, /rappresenta /srv/sftp/alicesull'host. Se non hai creato alcuna directory etco rootall'interno di quel jail, l'utente non può raggiungere il reale /etco /root.

Prova anche a caricare qualcosa in /files. Una configurazione che blocca l'escape ma che accidentalmente rende l'intera jail di sola lettura è sicura ma non utile per un account di caricamento.

Risoluzione dei problemi: "proprietà o permessi errati per la directory chroot"

Se l'accesso fallisce immediatamente, controlla il registro del servizio SSH:

sudo journalctl -fu ssh.service

La guida OpenSSH di Ubuntu consiglia di utilizzare il journal del servizio SSH per la risoluzione dei problemi. Se si riscontra un errore di proprietà o di permessi, controllare ogni directory padre:

namei -l /srv/sftp/alice

Il percorso chroot deve essere di proprietà di root e non deve essere scrivibile dal gruppo o da altri. Un errore comune è questo:

sudo chown alice:alice /srv/sftp/alice

Non risolvete il problema indebolendo i controlli di OpenSSH. Posizionate invece l'area scrivibile dell'utente al di sotto della directory root di chroot:

sudo chown root:root /srv/sftp/alice
sudo chmod 755 /srv/sftp/alice
sudo chown alice:alice /srv/sftp/alice/files

E se l'utente avesse bisogno di accedere alla shell SSH, e non solo tramite SFTP?

ChrootDirectoryPuò essere utilizzato anche con una shell interattiva, ma la configurazione è sostanzialmente più complessa. OpenSSH afferma che un chroot interattivo necessita almeno di una shell e /devdi nodi di base, oltre a tutti i binari, le librerie, i file di risoluzione dei nomi e le altre dipendenze richieste dai comandi consentiti.

Per un account di un dispositivo strettamente controllato, la creazione di un ambiente isolato (jail) può essere giustificata. Per l'accesso generico ai comandi Linux, spesso comporta un onere di manutenzione: gli aggiornamenti di sicurezza per strumenti e librerie devono essere implementati anche all'interno dell'ambiente isolato. Se l'esigenza effettiva è "consentire a questa persona di eseguire comandi, ma isolandola dall'host", un container, una macchina virtuale o un servizio con restrizioni appositamente creato sono generalmente più facili da controllare.

Miglioramenti alla sicurezza che vale la pena aggiungere

La restrizione delle directory è solo un livello di protezione. Per i server esposti a Internet, è necessario considerare anche:

  • Laddove possibile, utilizzare l'autenticazione tramite chiave pubblica SSH per gli account umani e automatizzati.
  • Non concedere agli utenti con permessi limitati di trasferimento file sudol'accesso.
  • Da utilizzare DisableForwarding yesesclusivamente per account SFTP, in modo che la connessione SSH non possa essere riutilizzata per tunnel o inoltro di agenti.
  • Limita le directory scrivibili all'area minima necessaria al flusso di lavoro.
  • Revisione journalctl -u ssh.servicee proprietà dei file dopo l'aggiunta degli utenti.
  • Mantieni aperta una sessione amministrativa durante il test delle modifiche alla configurazione SSH remota.

Per il comportamento definitivo di ChrootDirectory, Match, ForceCommand, e DisableForwarding, consultare il manuale di configurazione del server OpenSSH di Ubuntu 24.04 . Per la configurazione specifica di Ubuntu, la convalida, i comandi di riavvio e la registrazione, fare riferimento alla documentazione ufficiale del server OpenSSH di Ubuntu .

In conclusione

Se l'obiettivo è "questo account SSH può caricare e scaricare file solo all'interno di una directory", usa un chroot di proprietà di root ChrootDirectory, posiziona il contenuto scrivibile in una sottocartella di proprietà dell'utente e forza l'accesso internal-sftp. Convalida con sshd -tprima di riavviare, quindi testa sia il percorso di caricamento consentito sia il tentativo di accesso dall'esterno del jail. Questo ti fornisce un piccolo e comprensibile confine di sicurezza senza dover costruire un ambiente Linux completo all'interno del chroot.

Lascia un commento

Come recuperare in modo sicuro partizioni e dati del disco rigido persi

Come recuperare in modo sicuro partizioni e dati del disco rigido persi

Scopri come recuperare partizioni e file persi con TestDisk e PhotoRec. Proteggi l'unità di origine, esegui una scansione sicura e salva i dati recuperati su un altro disco.

Come scansionare i codici QR su un computer desktop Linux

Come scansionare i codici QR su un computer desktop Linux

Scansiona i codici QR su Linux con CoBang utilizzando una webcam o un file immagine. Consulta le opzioni di installazione, i passaggi di configurazione e le soluzioni per l'accesso alla fotocamera tramite Flatpak.

Come modificare le impostazioni della webcam su Linux con Cameractrls

Come modificare le impostazioni della webcam su Linux con Cameractrls

Modifica le impostazioni della webcam su Linux con Cameractrls: regola l'esposizione, il colore, la riduzione dello sfarfallio e altri controlli supportati, quindi verifica le modalità video compatibili.

Come installare PhpStorm su Linux: Toolbox, Tar.gz, Snap e AUR

Come installare PhpStorm su Linux: Toolbox, Tar.gz, Snap e AUR

Installa PhpStorm su Linux con JetBrains Toolbox o con l'archivio tar.gz autonomo, oltre alle opzioni Snap e Arch AUR. Java è già incluso.

Come eseguire il backup di un CD-ROM come immagine ISO su Linux

Come eseguire il backup di un CD-ROM come immagine ISO su Linux

Crea un'immagine ISO di un CD-ROM su Linux con GNOME Disks o dd. Identifica l'unità ottica, monitora la copia, verifica l'immagine e scopri quando un disco danneggiato o un disco audio richiede uno strumento aggiuntivo.

Come installare Cisco Packet Tracer su Linux

Come installare Cisco Packet Tracer su Linux

Scarica Cisco Packet Tracer 9.0.1 per Ubuntu a 64 bit, installa il pacchetto DEB con APT, accetta la licenza nel Terminale ed effettua l'accesso per avviare un laboratorio.

Come configurare due pannelli su XFCE 4

Come configurare due pannelli su XFCE 4

Crea un pannello XFCE 4 separato per ogni schermo, assegna il secondo pannello all'uscita corretta, posizionalo e ridimensionalo, e aggiungi i launcher e gli elementi di stato necessari.

Come ritagliare un'immagine su Linux con GIMP

Come ritagliare un'immagine su Linux con GIMP

Rimuovere lo sfondo di una foto su Linux con GIMP: traccia il soggetto, elimina lo sfondo selezionato, mantieni la trasparenza ed esporta un file PNG riutilizzabile.

Applicazione desktop Google Tasks: come utilizzarla su un computer

Applicazione desktop Google Tasks: come utilizzarla su un computer

Apri Google Tasks in un browser, aggiungi un collegamento a Chrome o avvialo come un'app e gestisci le attività con data tramite Calendar e Gmail.

OKSampler: un campionatore musicale gratuito e semplice per creare ritmi da tastiera.

OKSampler: un campionatore musicale gratuito e semplice per creare ritmi da tastiera.

OKSampler associa i file MP3 ai tasti della tastiera e permette la riproduzione in loop dell'audio. Scopri cosa fa questo software gratuito ormai datato, dove finiscono le sue vecchie funzionalità e cosa controllare prima di scaricarlo.