GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Binden Sie einen SFTP-Benutzer ein, nachdem Sie Chroot verwendet haben

Dieser Artikel richtet sich an Administratoren oder Entwickler.

Das Bind-Mounting eines Secure File Transfer Protocol (SFTP)-Benutzers, auf dem die Chroot-Operation auf Ihren Red Hat® Enterprise Linux® (RHEL®)- und CentOS® 6-Servern (OpenSSH ist 4.9p1 oder höher) ausgeführt wurde, erstellt die folgenden Bedingungen:

  • Der Benutzer kann nur SFTP verwenden und hat keinen vollständigen Shell-Zugriff über Secure Shell (SSH).
  • Der Benutzer ist in seinem Home-Verzeichnis eingesperrt und hat keine Möglichkeit, daraus auszubrechen.
  • Aus Sicht des Benutzers befindet sich sein Home-Verzeichnis auf dem Server.
  • Dieses Bind-Mounting wird häufig von Entwicklern benötigt, die möglicherweise Schreibzugriff auf ein (oder mehrere) Apache®-Dokumentstammverzeichnis oder -stammverzeichnisse oder ein anderes Verzeichnis benötigen, um Webinhalte hochzuladen oder zu bearbeiten.

Dieser Artikel beschreibt, wie man die Chroot-Operation verwendet, um das Home-Verzeichnis für den Benutzer festzulegen und innerhalb dieses Home-Verzeichnisses ein Bind-Mount für jedes der externen (Dokumentenstamm-)Verzeichnisse zu erstellen, auf die er Zugriff benötigt. Ein Bind-Mount ist die einzige Möglichkeit, dem Benutzer Zugriff auf Daten außerhalb seines Chroot-Verzeichnisses zu geben. Sie können keinen symbolischen Link (Symlink) zu Daten außerhalb des Chroot-Verzeichnisses verwenden (zum Beispiel ln -s /home/user/http /var/www/http). ). Nach der Chroot-Operation hat das Dateisystem keine Kenntnis von irgendwelchen Daten außerhalb des Chroot-Verzeichnisses. Dieser Mangel an Wissen unterbricht den symbolischen Link. Als Alternative können Sie das Stammverzeichnis des Dokuments in das Home-Verzeichnis des Benutzers verschieben und es dann per Symlink mit dem ursprünglichen Speicherort verknüpfen (z. B. ln -s /var/www/html /home/user1/html ).

Der SSH-Daemon (SSHD) bietet einige dynamische Variablen in der Konfiguration für den Chroot-Betrieb an:

  • %u :Benutzername des Benutzers, der sich anmeldet
  • %h :$HOME des Benutzers, der sich anmeldet

SSHD ist sehr streng darin, wie Sie Berechtigungen festlegen müssen. Eine dieser Einschränkungen besteht darin, dass der Benutzer nicht auf die oberste Ebene des Chroot-Verzeichnisses schreiben kann. Sie müssen eine geeignete oberste Ebene für das Chroot-Verzeichnis auswählen, wie zum Beispiel die folgenden Einstellungen:

  • Setzen Sie ChrootDirectory auf %h :Der Benutzer kann nicht in seinen Home-Pfad schreiben. Sie benötigen entweder einen Unterordner, in den sie schreiben können (z. B. Uploads), oder einen Bind-Mount an einen anderen Ort, an den sie schreiben können (z. B. /var/www/html). ).
  • Setzen Sie ChrootDirectory auf /home/chroot :Der Benutzer kann in seinen Home-Pfad schreiben, aber die oberste Ebene des Chroot-Verzeichnisses ist durch Dateisystemberechtigungen geschützt, nicht durch das Chroot-Gefängnis.

Die erste Option verwendet das Chroot-Verzeichnis, um Sicherheit zu gewährleisten, anstatt sich auf Dateisystemberechtigungen zu verlassen. Die zweite Option erlaubt das Schreiben in das Home-Verzeichnis, bedeutet aber, dass das Chroot-Verzeichnis mit anderen Benutzern geteilt wird und nur Dateisystemberechtigungen die Offenlegung von Informationen verhindern. Die richtige Option hängt von Ihren Anforderungen ab.

Binden Sie einen SFTP-Benutzer nach einer Chroot-Operation per Bind-Mount

Führen Sie die folgenden Schritte aus, um den Benutzer zu binden:

  1. Erstellen Sie eine Gruppe, der Sie alle Benutzer zuweisen, die in ihrem Home-Verzeichnis eingesperrt werden müssen:

    # groupadd sftponly
    
  2. Erstellen Sie den Benutzer. Setzen Sie die Shell auf /bin/false und weisen Sie den Benutzer der Gruppe zu, die Sie oben erstellt haben:

    # mkdir -p /home/chroot/$NEWUSER
    # useradd -d /$NEWUSER -s /bin/false -G sftponly $NEWUSER    # Note: homedir is relative to the chroot
    # pass}wd $NEWUSER
    
  3. Aktualisieren Sie die /etc/ssh/sshd_config Datei:

    1. Kommentieren Sie die folgende Zeile aus:

       Subsystem       sftp    /usr/libexec/openssh/sftp-server
      
    2. Fügen Sie am Ende der Datei die folgenden Zeilen hinzu:

       Subsystem     sftp   internal-sftp
       Match Group sftponly
       ChrootDirectory /home/chroot   # OR     ChrootDirectory %h
       X11Forwarding no
       AllowTCPForwarding no
       ForceCommand internal-sftp
      
    3. Testen Sie die Konfiguration und laden Sie dann die SSHD neu:

       # sshd -t
       # service sshd reload
      

Richtet das Homedir des Benutzers nach der Chroot-Operation ein

  1. Wenn das ChrootDirectory /home/chroot ist , führen Sie die folgenden Befehle aus:

     # chmod 711 /home/chroot            # This prevents chrooted users from seeing other chrooted users' homedirs
     # chmod 755 /home/chroot/$NEWUSER
     # chown $NEWUSER:sftponly /home/chroot/$NEWUSER
    
  2. Wenn das ChrootDirectory %h ist , führen Sie den folgenden Befehl aus:

     # chown root:root /home/chroot/$NEWUSER
    

Erstellen Sie Bind-Mounts in einem beliebigen Pfad außerhalb des Chroot-Verzeichnisses, auf das die Benutzer muss zugreifen

  1. Fügen Sie die folgende Zeile zu /etc/fstab hinzu Datei:

     /var/www/html   /home/chroot/$NEWUSER/www        none    bind    0 0`
    
  2. Mounten Sie das Verzeichnis:

     # mkdir /home/chroot/$NEWUSER/www
     # mount /home/chroot/$NEWUSER/www
    

Berechtigungen aktualisieren

Aktualisieren Sie die Dateisystemberechtigungen für die Verzeichnisse, auf die der Benutzer zugreift. Berücksichtigen Sie andere Benutzer, die derzeit über Lese-/Schreibzugriff verfügen, um sicherzustellen, dass Sie deren Berechtigungen nicht versehentlich entfernen. Sie können diesen Schritt auf verschiedene Weise ausführen, z. B. durch Ändern des Benutzerbesitzes, Ändern des Gruppenbesitzes oder der Berechtigungen oder Hinzufügen von File Access Control Lists (FACLs).

Das folgende Beispiel zeigt Befehle zum Hinzufügen von FACLs:

     # setfacl -Rm u:$NEWUSER:rwX /home/chroot/$NEWUSER/www/
     # setfacl -Rm d:u:$NEWUSER:rwX /home/chroot/$NEWUSER/www/

Mögliche Probleme

Folgende Probleme können auftreten.

Verzeichnisberechtigungen

Verzeichnisberechtigungen können folgende Probleme verursachen:

  • Die eingebaute Chroot-Funktion von SFTP ist sehr streng in Bezug auf Berechtigungen. Wenn die Berechtigungen nicht sicher genug sind, erhalten Sie die folgende Fehlermeldung, wenn Sie versuchen, sich anzumelden:

        root@ftp01[ ~ ]# sftp $NEWUSER@localhost
        Connecting to localhost...
        chroottest@localhost's password:
        Write failed: Broken pipe
        Couldn't read packet: Connection reset by peer
    
  • Sie können sich möglicherweise anmelden, aber keine Dateien hochladen. In diesem Fall erhalten Sie die folgende Fehlermeldung:

        sftp> put test
        Uploading test to /$NEWUSER/test
        Couldn't get handle: Permission denied
        In both cases the problem is directory permissions.  Here's what a known-good directory structure looks like:
        root@ftp01[ ~ ]# ls -ld / /home /home/chroot /home/chroot/$NEWUSERdrwxr-xr-x. 28 root     root     4096 Aug 22 10:31 /
        drwxr-xr-x. 18 root     root     4096 Oct 10 10:49 /home
        drwx--x--x   3 root     root     4096 Oct 10 10:49 /home/chroot
        drwxr-xr-x   3 $NEWUSER $NEWUSER 4096 Oct 10 11:40 /home/chroot/$NEWUSER
        root@ftp01[ ~ ]#
    

SCP funktioniert nicht

Dieser Benutzertyp funktioniert nur mit SFTP und nicht mit anderen Protokollen (z. B. Remote Shell (RSH), Secure Contain Protect (SCP) oder File Transfer Protocol (FTP)).


Linux
  1. So richten Sie Linux-Chroot-Jails ein

  2. Mounten eines Remote-Verzeichnisses mit SSHFS in Debian Jessie

  3. Ein gebundenes Reittier?

  4. So zeigen Sie den Bindungs-Mount-Quellpfad für Mounts nach v2.25.2 an

  5. Verwendung von / bei Verwendung von CD

So richten Sie Chrooted SFTP unter Linux ein

So erstellen Sie einen SFTP-Benutzer mit bestimmten Verzeichnisberechtigungen in Ubuntu 20.04

SFTP mit Chroot abhängig vom öffentlichen Schlüssel des verbindenden Benutzers

Gibt es ein Linux-vfs-Tool, das es ermöglicht, ein Verzeichnis an einem anderen Ort (wie mount --bind) im Benutzerbereich zu binden?

Warum schlägt das Einbinden einer Datei nach dem Aufheben der Verknüpfung mit ENOENT fehl?

Chroot SFTP - Es ist möglich, dem Benutzer zu erlauben, in das aktuelle (Chroot-) Verzeichnis zu schreiben