Come posso chroot gli utenti SSH solo sftp nelle loro case?


124

Voglio dare a un client l'accesso al mio server, ma voglio limitare quegli utenti alle loro home directory. Legherò-mount in tutti i file che voglio che siano in grado di vedere.

Ho creato un utente chiamato bobe l' ho aggiunto a un nuovo gruppo chiamato sftponly. Hanno una home directory su /home/bob. Ho cambiato la shell /bin/falseper arrestare gli accessi SSH. Ecco la loro /etc/passwdlinea:

bob:x:1001:1002::/home/bob:/bin/false

Ho anche modificato il /etc/ssh/sshd_configper includere quanto segue:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

Quando provo ad accedere come loro, ecco cosa vedo

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

Se commento la ChrootDirectoryriga in cui posso inserire SFTP, ma hanno libero sfogo sul server. Ho scoperto che ChrootDirectory /homefunziona, ma dà comunque accesso a qualsiasi home directory. Ho esplicitamente provato, ChrootDirectory /home/bobma non funziona neanche.

Che cosa sto facendo di sbagliato? Come posso limitarmi boba /home/bob/?

----MODIFICARE-----

Va bene, quindi ho appena dato un'occhiata /var/log/auth.loge ho visto questo:

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

Non sono del tutto sicuro di cosa stia succedendo lì, ma suggerisce che qualcosa non va nella directory dell'utente. Ecco l' ls -h /homeoutput:

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob

2
Credo che ChrootDirectory /home/%upossa essere sostituito ChrootDirectory %h.
Franck Dernoncourt,

Risposte:


120

Tutto questo dolore è dovuto a diversi problemi di sicurezza come descritto qui . Fondamentalmente la directory chroot deve essere di proprietà di roote non può essere alcun accesso in scrittura di gruppo. Bello. Quindi è essenzialmente necessario per trasformare il vostro chroot in una cella di detenzione e all'interno di che si può avere il contenuto modificabile.

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

E bam, puoi accedere e scrivere /writable.


3
Grazie davvero utile. Due problemi però. 1.) Anche se non riesco a scrivere, posso comunque sfogliare l'intero filesystem. 2.) La modifica della shell in / bin / false impedisce completamente l'SFTP. Sto facendo qualcosa di sbagliato?
kim3er

1
Grazie! Molti altri articoli su questo argomento mancano questo dettaglio, e alcuni lo fanno in modo che il server non possa accettare connessioni ssh (che tipo di schifo quando sei su EC2 e ... questo è l'unico modo).
Tom Harrison Jr

4
kim3er: questo perché è necessario impostare la shell dell'utente su / sbin / nologin - / bin / false disabilita qualsiasi tipo di accesso.

8
Vorrei anche notare che tutte le cartelle che portano alla tua cartella chroot dovrebbero essere di proprietà di root. In questo esempio, /homedovrebbe anche essere di proprietà di root.
Shiki,

2
Il 14.04, ho anche dovuto cambiare la Subsystem sftp /usr/lib/openssh/sftp-serverlinea Subsystem sftp internal-sftp -f AUTH -l VERBOSEprima che funzionasse.
Partofthething,

57

Per chroot una directory SFTP, è necessario

  1. Crea un utente e imponi a root di esserne il proprietario

    cd /home
    mkdir john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
  2. Cambia la posizione del sottosistema su / etc / ssh / sshd_config:

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    

    e crea una sezione utente alla fine del file (ssh può morire rigenerando se posizionato dopo la riga del sottosistema):

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    

3
questo non sembra funzionare. nel tuo esempio, l'utente johnè bloccato nella /home/johndirectory. hai concesso le 755autorizzazioni alla directory. quindi il proprietario ha letto (4), scrive (2) ed esegue (1) e il gruppo ha letto (4) ed esegue (1). hai anche impostato il proprietario e il gruppo come root, quindi johnappartiene ad altri. poi ha anche letto ed eseguito (4 + 1 = 5). quindi hai bloccato John in una directory in cui non ha privilegi di scrittura. come risolvere questo? cambiando i privilegi 757o addirittura si 777interrompe il login. la modifica del gruppo o del proprietario in john interrompe anche l'accesso.
Daniel,

anche da notare: in / etc / ssh / sshd_config le configurazioni vengono lette in ordine. Quindi, se hai una regola per gli utenti in generale e vuoi sovrascriverne una, metti in cima la regola specifica dell'utente.
rwenz3l,

Voglio chroot una directory SFTP nella cartella home di qualche altro utente. Ho userx su /home/userx/sftproot/uploadse sftpuser su / home / sftpuse. Ho impostato chroot in /home/usex/sftprootmodo che appartenga a root: root e chmod 755. Il file /home/usex/sftproot/uploadsè gestito da sftpuser: sftpuser. Ottengo lo stesso errore della domanda iniziale sopra. Il chroot e tutte le cartelle principali devono essere di proprietà di root: root per far funzionare sftp?
Primoz, Roma,

6

Ho trascorso l'intera giornata cercando di ottenere una condivisione di rete sul mio lampone. Volevo bloccare l'utente in modo che non fosse in grado di navigare attraverso l'intero file system, nessun accesso di accesso ssh e volevo avere accesso in scrittura alla condivisione di rete.

Ed ecco come l'ho fatto funzionare:

Per prima cosa ho creato un utente:

sudo useradd netdrive

Quindi modificato /etc/passwde verificato che abbia /bin/falseper l'utente quindi la linea era:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

Ho modificato /etc/ssh/sshd_configper includere:

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

Proprietario e autorizzazioni della directory home modificati:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

Ok, dopo tutto questo sono stato in grado di connettermi utilizzando sshfsma in modalità di sola lettura. Cosa ho dovuto fare per ottenere una cartella scrivibile:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

Ecco fatto, ha funzionato senza ulteriori cambiamenti. Si noti che ho solo autorizzazioni scrivibili per l' utente , non per il gruppo come molte altre soluzioni online. Sono stato in grado di creare / eliminare / modificare / rinominare file / cartelle senza problemi.

Quando accedo usando sshfscon l' utente netdrive a causa della configurazione chroot vedrei solo cose memorizzate nella /home/netdrive/directory del server , perfetto. La /home/netdrive/home/netdrive/struttura delle directory ripetute è ciò che mi ha permesso di avere una soluzione scrivibile chroot ssh pulita .

Ora spiegherò di seguito i problemi che ho avuto:

Probabilmente non dovresti eseguire i seguenti paragrafi :

Dopo aver esaminato le soluzioni di cui sopra (e molte altre in rete che hanno persino usato acl (liste di controllo degli accessi)) non sono ancora riuscito a farlo funzionare perché quello che ho fatto dopo è stato:

Quanto segue NON ha funzionato per me:

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

Perché l' utente netdrive non era ancora in grado di scrivere in quella /home/netdrive/writable/directory nonostante fosse proprietario della cartella e avesse i permessi. Poi l'ho fatto: sudo chmod 775 / home / netdrive / writable / E ora potevo creare una directory ed eliminarla ma non ero in grado di modificarla perché era stata creata senza autorizzazioni scrivibili di gruppo. Qui da quello che ho visto in rete la gente usa aclper ripararlo. Ma non ero contento di questo, poiché dovevo installare acl, quindi configurare i punti di montaggio, ecc. Inoltre, non ho idea del motivo per cui avrei bisogno del permesso di gruppo per scrivere in una cartella di proprietà dello stesso utente.

Sembra che per qualche motivo, creando /home/netdrive/home/netdrivee dando la proprietà all'ultima netdrivecartella, sono stato in grado di far funzionare tutto senza interferire con le autorizzazioni di gruppo .


1

Ho seguito questo articolo ma non ha funzionato. Ha iniziato a funzionare dopo che ho apportato questa modifica (suggerito nelle risposte sopra):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Inoltre ha creato la directory home di root in cui avevo la sottodirectory scrivibile dall'utente (come descritto sopra).

La cosa nuova e utile che voglio aggiungere con questa risposta è che puoi semplificare la configurazione semplicemente specificando% h come home directory dell'utente:

ChrootDirectory %h

L'ho scoperto grazie a questo link.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.