Wie kann ich SSH-Benutzer, die nur SFTP verwenden, in ihre Häuser chrooten?

124

Ich möchte einem Client Zugriff auf meinen Server gewähren, möchte diese Benutzer jedoch auf ihre Home-Verzeichnisse beschränken. Ich werde alle Dateien binden, die sie sehen sollen.

Ich habe einen Benutzer mit dem Namen erstellt bobund ihn zu einer neuen Gruppe mit dem Namen hinzugefügt sftponly. Sie haben ein Home-Verzeichnis bei /home/bob. Ich habe ihre Shell geändert /bin/false, um SSH-Anmeldungen zu stoppen. Hier ist ihre /etc/passwdLinie:

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

Ich habe auch das geändert /etc/ssh/sshd_config, um das folgende mit einzuschließen:

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

Wenn ich versuche, mich als sie einzuloggen, sehe ich Folgendes

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

Wenn ich die ChrootDirectoryZeile auskommentiere, kann ich SFTP einschalten, aber dann haben sie freien Lauf über den Server. Ich habe festgestellt, dass das ChrootDirectory /homefunktioniert, aber es gibt ihnen immer noch Zugriff auf jedes Basisverzeichnis. Ich habe es explizit versucht, ChrootDirectory /home/bobaber das funktioniert auch nicht.

Was mache ich falsch? Wie kann ich mich beschränken bobauf /home/bob/?

----BEARBEITEN-----

Okay, also habe ich mir das mal angesehen /var/log/auth.logund gesehen:

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

Ich bin nicht ganz sicher, was dort vor sich geht, aber es deutet darauf hin, dass etwas mit dem Benutzerverzeichnis nicht stimmt. Hier ist die ls -h /homeAusgabe:

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
Oli
quelle
2
Ich glaube, ChrootDirectory /home/%ukann ersetzt werden ChrootDirectory %h.
Franck Dernoncourt

Antworten:

120

All diese Schmerzen sind auf verschiedene Sicherheitsprobleme zurückzuführen, die hier beschrieben werden . Grundsätzlich muss das chroot-Verzeichnis im Besitz von sein rootund darf keinen Schreibzugriff für Gruppen enthalten. Schön. Sie müssen Ihre Chroot also im Wesentlichen in eine Haltezelle verwandeln , in der Sie Ihren bearbeitbaren Inhalt haben können.

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

Und bam, du kannst dich einloggen und schreiben /writable.

Oli
quelle
3
Vielen Dank wirklich nützlich. Zwei Probleme. 1.) Auch wenn ich nicht schreiben kann, kann ich das gesamte Dateisystem durchsuchen. 2.) Durch Ändern der Shell in / bin / false wird SFTP vollständig verhindert. Mache ich etwas falsch?
Kim3er,
1
Danke! In vielen anderen Artikeln zu diesem Thema fehlt dieses Detail, und einige machen es so, dass der Server keine ssh-Verbindungen akzeptieren kann (was scheiße ist, wenn Sie sich auf EC2 befinden und ... das ist der einzige Weg).
Tom Harrison Jr.
4
kim3er: dies liegt daran, dass Sie die Shell des Benutzers auf / sbin / nologin - / bin / false setzen müssen, um jegliche Art von Zugriff zu deaktivieren.
8
Ich möchte auch darauf hinweisen, dass alle Ordner, die zu Ihrem Chroot-Ordner führen, Eigentum von sein sollten root. In diesem Beispiel /homesollte auch root Eigentümer sein.
Shiki
2
Am 14.04 musste ich auch die Subsystem sftp /usr/lib/openssh/sftp-serverLeitung umstellen, Subsystem sftp internal-sftp -f AUTH -l VERBOSEbevor dies funktionierte.
etwas
57

Um ein SFTP-Verzeichnis zu chrooten, müssen Sie

  1. Erstellen Sie einen Benutzer und erzwingen Sie, dass root Eigentümer des Benutzers ist

    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. Ändern Sie den Speicherort des Subsystems in / etc / ssh / sshd_config:

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

    und erstelle einen User-Bereich am Ende der Datei

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    
josircg
quelle
3
das scheint nicht zu funktionieren. In Ihrem Beispiel ist der Benutzer johnan das /home/johnVerzeichnis gebunden . Sie haben 755Berechtigungen für das Verzeichnis erteilt . Der Eigentümer hat also gelesen (4), geschrieben (2) und ausgeführt (1), und die Gruppe hat gelesen (4) und ausgeführt (1). Sie haben auch den Eigentümer und die Gruppe als festgelegt root, johngehört also zu anderen. er hat dann auch gelesen und ausgeführt (4 + 1 = 5). Sie haben John also in ein Verzeichnis gesperrt, in dem er keine Schreibrechte hat. Wie kann man das beheben? Ändern von Berechtigungen 757oder sogar 777das Login zu unterbrechen. Wenn Sie die Gruppe oder den Besitzer in John ändern, wird auch die Anmeldung unterbrochen.
Daniel
auch zu beachten: in / etc / ssh / sshd_config werden die configs der reihenfolge nach gelesen. Wenn Sie also eine Regel für Benutzer im Allgemeinen haben und eine davon überschreiben möchten, platzieren Sie die benutzerspezifische Regel ganz oben.
rwenz3l
Ich möchte ein SFTP-Verzeichnis im Basisordner eines anderen Benutzers chrooten. Ich habe userx bei /home/userx/sftproot/uploadsund sftpuser bei / home / sftpuse. Ich habe chroot auf /home/usex/sftprootden Besitz von root: root und chmod /home/usex/sftproot/uploads755 gesetzt. Das wird von sftpuser: sftpuser chown-ed. Ich erhalte den gleichen Fehler wie bei der ersten Frage oben. Müssen sich die chroot und alle übergeordneten Ordner im Besitz von root: root befinden, damit sftp funktioniert?
Primoz Rom
6

Ich habe den ganzen Tag versucht, eine Netzwerkfreigabe für meine Himbeere zu erhalten. Ich wollte den Benutzer sperren, damit er nicht durch das gesamte Dateisystem navigieren kann, keinen SSH-Login-Zugriff und Schreibzugriff auf die Netzwerkfreigabe haben möchte.

Und so habe ich es geschafft:

Zuerst habe ich einen Benutzer angelegt:

sudo useradd netdrive

Dann bearbeitete /etc/passwdund stellte sicher, dass es /bin/falsefür den Benutzer so war die Zeile:

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

Ich habe bearbeitet /etc/ssh/sshd_config, um Folgendes einzuschließen:

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

Eigentümer und Berechtigungen des Basisverzeichnisses geändert:

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

Ok, nach all dem konnte ich eine Verbindung herstellen, sshfsaber im schreibgeschützten Modus. Was ich tun musste, um einen beschreibbaren Ordner zu erhalten:

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

Das wars, es hat ohne weitere Änderungen geklappt. Beachten Sie, dass ich nur schreibbare Berechtigungen für den Benutzer und nicht für die Gruppe habe, wie bei vielen anderen Online-Lösungen. Ich konnte ohne Probleme Dateien / Ordner erstellen / löschen / bearbeiten / umbenennen.

Beim Zugriff sshfsmit dem Netdrive- Benutzer aufgrund der Chroot-Konfiguration würde ich nur Dinge sehen, die im Serververzeichnis gespeichert sind /home/netdrive/, perfekt. Die wiederholte /home/netdrive/home/netdrive/Verzeichnisstruktur hat es mir ermöglicht, eine saubere, mit chroot ssh beschreibbare Lösung zu haben.

Jetzt erkläre ich die Probleme, die ich hatte:

Sie sollten die folgenden Absätze wahrscheinlich nicht ausführen :

Nachdem ich mir die obigen Lösungen angeschaut hatte (und viele andere im Internet, die sogar acl (Access Control Lists) verwendeten), war ich immer noch nicht in der Lage, es zum Laufen zu bringen, weil das, was ich als nächstes tat, war:

Folgendes hat bei mir NICHT funktioniert:

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

Weil der Netdrive- Benutzer /home/netdrive/writable/trotz Besitz des Ordners und der Berechtigungen immer noch nicht in dieses Verzeichnis schreiben konnte . Dann tat ich: sudo chmod 775 / home / netdrive / writable / Und jetzt konnte ich ein Verzeichnis erstellen und es löschen, aber ich war nicht in der Lage, es zu bearbeiten, weil es ohne Gruppen-Schreibrechte erstellt wurde. Hier von dem, was ich im Netz gesehen habe, verwenden die Leute acl, um es zu reparieren. Aber ich war damit nicht zufrieden, da ich es installieren acl, dann Mount-Punkte konfigurieren usw. musste. Außerdem habe ich keine Ahnung, warum ich eine Gruppenberechtigung benötigen würde , um in einen Ordner zu schreiben, der demselben Benutzer gehört.

Es scheint, dass ich aus irgendeinem Grund, /home/netdrive/home/netdriveindem netdriveich den letzten Ordner erstellte und ihm den Besitzer gab, in der Lage war, alles zum Laufen zu bringen, ohne die Gruppenberechtigungen zu beeinträchtigen.

mihai.ile
quelle
1

Ich bin diesem Artikel gefolgt, aber es hat nicht funktioniert. Es begann zu funktionieren, nachdem ich diese Änderung vorgenommen hatte (empfohlen in den obigen Antworten):

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

Außerdem habe ich das Root-Home-Verzeichnis erstellt, unter dem ich ein vom Benutzer beschreibbares Unterverzeichnis hatte (wie oben beschrieben).

Das Neue und Nützliche, das ich mit dieser Antwort hinzufügen möchte, ist, dass Sie die Konfiguration einfach vereinfachen können, indem Sie% h als Benutzer-Ausgangsverzeichnis angeben:

ChrootDirectory %h

Ich habe es dank dieses Links entdeckt.

user109764
quelle