sftp-user_mit_change_root
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| sftp-user_mit_change_root [2019-01-15 12:44:16] – [Was ist der Unterschied zwischen FTPS und SFTP?] manfred | sftp-user_mit_change_root [2019-01-15 12:58:05] (aktuell) – [Was ist der Unterschied zwischen FTPS und SFTP?] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== sftp mit Change Root ====== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | |||
| + | Seit OpenSSH 4.9 unterstützt der SSH-Daemon des OpenBSD Projekts das Einsperren der Benutzer in einem beliebigen Verzeichnis über den chroot(2) Systemaufruf. Zuvor war dies nur mit einem Thirdparty Patch wie chrootssh oder im Fall der Einschränkung auf SFTP/SCP mit speziellen Shells wie scponly oder rssh möglich. | ||
| + | |||
| + | Ebenfalls mit Version 4.9 wurde eine Variante des sftp-server(8) eingeführt, | ||
| + | |||
| + | Die Einrichtung erfolgt sehr einfach in der sshd_config(5). Zunächst muss das Subsystem " | ||
| + | |||
| + | Subsystem sftp internal-sftp | ||
| + | |||
| + | Danach können entweder global alle Benutzer in eine chroot-Umgebung eingesperrt werden (nicht zu empfehlen) oder über einen Match-Block nur einzelne Benutzer, Gruppen oder IP-Adressen bzw. IP-Adressbereiche. Die Festlegung des Verzeichnisses, | ||
| + | |||
| + | Variable | ||
| + | ------------+-------------------------------- | ||
| + | %h | Home-Verzeichnis des Benutzers | ||
| + | %u | Benutzername des Benutzers | ||
| + | %% | ' | ||
| + | |||
| + | Die Direktive **ChrootDirectory / | ||
| + | |||
| + | **Achtung: | ||
| + | |||
| + | Hier ein paar Beispieleinträge in der sshd_config. Die Match-Blöcke müssen unbedingt am Ende der Datei stehen, da sonst alle folgenden Direktiven, die auch in einem Match-Block stehen könnten, dem letzten Block zugeordnet werden! | ||
| + | |||
| + | # Clients aus dem IP-Adressbereich 10.0.1.0/24 einsperren. | ||
| + | Match Address 10.0.1.* | ||
| + | ChrootDirectory %h | ||
| + | | ||
| + | # Benutzer mit der Gruppe sftp im Homeverzeichnis einsperren und nur SFTP erlauben | ||
| + | Match Group sftp | ||
| + | ChrootDirectory %h | ||
| + | ForceCommand internal-sftp | ||
| + | | ||
| + | # Benutzer web* (z. B. web1, web42, web123, web4711) in /srv/www/ einsperren und nur SFTP erlauben | ||
| + | Match User web* | ||
| + | ChrootDirectory /srv/www/%u | ||
| + | ForceCommand internal-sftp | ||
| + | |||
| + | Sobald ein Benutzer mit dieser sshd-Konfiguration mit //gpasswd -a sftp// der Gruppe //sftp// hinzugefügt wird, kann dieser sich in Zukunft nur noch innerhalb seines zugewiesenen Verzeichnisses bewegen. Ideal zur Absicherung eines Servers mit mehreren nicht vertrauenswürdigen Benutzern. | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | |||
| + | ===== SFTP-User mit Change Root ===== | ||
| + | |||
| + | Hier wird ein User // | ||
| + | |||
| + | cp / | ||
| + | | ||
| + | echo " | ||
| + | Subsystem sftp internal-sftp -l INFO | ||
| + | Match user sftpmaster | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | " >> / | ||
| + | | ||
| + | / | ||
| + | |||
| + | groupadd sftp | ||
| + | useradd -s /bin/false -d / | ||
| + | mkdir -p / | ||
| + | chown 0:0 / | ||
| + | chmod 0755 / | ||
| + | mkdir / | ||
| + | chown sftpmaster: | ||
| + | chmod 0770 / | ||
| + | |||
| + | |||
| + | ==== Sub-SFTP-User mit Change Root ==== | ||
| + | |||
| + | Hier werden zwei Sub-User, //fritz// und //fratz// angelegt, die von // | ||
| + | |||
| + | |||
| + | Erstmal die SSH-Konfiguration ergänzen und aktivieren. | ||
| + | Hier ist es wichtig, dass **alle** Gruppen (außer root) von dem //Match// erfasst werden, | ||
| + | sonst kann sich ein neu angelegter User ohne Change-Root anmelden, wenn man in aus Versehen einer falschen Gruppe zugewiesen hat! | ||
| + | |||
| + | echo " | ||
| + | Match group !root,* | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | " >> / | ||
| + | | ||
| + | / | ||
| + | |||
| + | |||
| + | Jetzt kann der erste // | ||
| + | |||
| + | useradd -s /bin/false -g sftp -d / | ||
| + | mkdir -p / | ||
| + | chown 0:0 / | ||
| + | chmod 0755 / | ||
| + | mkdir / | ||
| + | chown fritz:sftp / | ||
| + | chmod 0770 / | ||
| + | |||
| + | |||
| + | Und weil es so gut geklappt hat, legen wir gleich noch einen zweiten an: | ||
| + | |||
| + | useradd -s /bin/false -g sftp -d / | ||
| + | mkdir -p / | ||
| + | chown 0:0 / | ||
| + | chmod 0755 / | ||
| + | mkdir / | ||
| + | chown fratz:sftp / | ||
| + | chmod 0770 / | ||
| + | |||
| + | |||
| + | ===== SFTP mit Change Root als Scripte ===== | ||
| + | |||
| + | # vi / | ||
| + | |||
| + | #!/bin/bash | ||
| + | | ||
| + | CFGDIR="/ | ||
| + | CFGDATEI=" | ||
| + | BINDIR="/ | ||
| + | BINDATEI=" | ||
| + | | ||
| + | if [ -z " | ||
| + | echo "${0} [User-Name des SFTP-Master-User' | ||
| + | exit 1 | ||
| + | fi | ||
| + | | ||
| + | | ||
| + | ################################################################################ | ||
| + | # Dieses Script darf nur einmal ausgeführt werden, | ||
| + | # wenn es bereits ausgeführt wurde, dann wird ab hier nichts gemacht. | ||
| + | | ||
| + | diff / | ||
| + | if [ " | ||
| + | | ||
| + | mkdir -p ${CFGDIR} ${BINDIR} | ||
| + | | ||
| + | echo " | ||
| + | # | ||
| + | # in dieser Konfigurationsdatei werden die zentralen Einstellungen vorgenommen die für alle SFTP-Scripte gelten sollen | ||
| + | | ||
| + | UUSER=\" | ||
| + | OUSER=\" | ||
| + | GRUPPE=\" | ||
| + | | ||
| + | if [ -z \" | ||
| + | echo \" | ||
| + | echo \"die aktuelle konfigurierte Sub-Gruppe ist: \${GRUPPE}\" | ||
| + | exit 1 | ||
| + | fi | ||
| + | # | ||
| + | " >> ${CFGDATEI} | ||
| + | | ||
| + | . ${CFGDATEI} | ||
| + | | ||
| + | | ||
| + | echo " | ||
| + | # | ||
| + | # | ||
| + | # Der sftp-Parapeter " | ||
| + | # | ||
| + | Match user ${OUSER} | ||
| + | ChrootDirectory /home/%u | ||
| + | X11Forwarding no | ||
| + | AllowTcpForwarding no | ||
| + | ForceCommand internal-sftp -u 0007 | ||
| + | | ||
| + | Match group !root,* | ||
| + | ChrootDirectory / | ||
| + | X11Forwarding no | ||
| + | AllowTcpForwarding no | ||
| + | ForceCommand internal-sftp -u 0007 | ||
| + | # | ||
| + | " >> / | ||
| + | | ||
| + | | ||
| + | / | ||
| + | | ||
| + | | ||
| + | ################################################################################ | ||
| + | # Master-SFTP-User anlegen | ||
| + | | ||
| + | groupadd ${GRUPPE} | ||
| + | useradd -s /bin/false -d / | ||
| + | mkdir -p / | ||
| + | touch / | ||
| + | chown 0:0 / | ||
| + | chmod 0755 / | ||
| + | chown -R ${OUSER}:0 / | ||
| + | chmod -R 0700 / | ||
| + | | ||
| + | rm -f / | ||
| + | | ||
| + | | ||
| + | # | ||
| + | echo " | ||
| + | #!/bin/bash | ||
| + | | ||
| + | # Mit disem Script werden alle " | ||
| + | # die sich untereinander nicht gegenseitig in die Daten sehen können und | ||
| + | # sie können auch nicht in das Verzeichnisse des " | ||
| + | # | ||
| + | # Sie können nur die Daten sehen und bearbeiten, die der " | ||
| + | # ihnen ins " | ||
| + | | ||
| + | . / | ||
| + | | ||
| + | useradd -s /bin/false -g \${GRUPPE} -d / | ||
| + | mkdir -p / | ||
| + | touch / | ||
| + | chown 0:0 / | ||
| + | chmod 0755 / | ||
| + | mkdir / | ||
| + | chown \${UUSER}: | ||
| + | chmod 0770 / | ||
| + | chown -R \${UUSER}:0 / | ||
| + | chmod -R 0700 / | ||
| + | " >> ${BINDATEI} | ||
| + | | ||
| + | chmod -R 0755 ${BINDIR} | ||
| + | | ||
| + | fi | ||
| + | |||
| + | |||
| + | ==== Anwendung der Scripte ==== | ||
| + | |||
| + | Als erstes oben abgebildete Script /// | ||
| + | |||
| + | z.B.: | ||
| + | |||
| + | / | ||
| + | |||
| + | |||
| + | Nachdem das Script ausgeführt wurde, liegen folgende Dateien vor: | ||
| + | |||
| + | - /// | ||
| + | - /// | ||
| + | - /// | ||
| + | |||
| + | Jetzt wird **nur noch** das Script **/// | ||
| + | |||
| + | / | ||
| + | |||
| + | Jetzt braucht man nur noch die public-SSH-Schlüssel in den Dateien /// | ||
| + | |||
| + | |||
| + | ===== OpenSSH logging with ChrootDirectory (logleser) ===== | ||
| + | |||
| + | Diese Anleitung beschreibt die Konfiguration des LogDienstes **rSysLog**. | ||
| + | Um vom SysLog einen Socket generieren zu lassen, | ||
| + | muss ihm in der Start-Option '-u / | ||
| + | |||
| + | Logs ohne Privilegien lesen: | ||
| + | # useradd -m -g adm logleser | ||
| + | # mkdir -p / | ||
| + | # touch / | ||
| + | # touch / | ||
| + | # chmod 0600 / | ||
| + | # chown logleser: | ||
| + | # chown -R logleser: | ||
| + | # chmod 0600 / | ||
| + | # chmod 0600 / | ||
| + | # chmod -R 0700 / | ||
| + | |||
| + | vi /etc/fstab | ||
| + | ... | ||
| + | # mount -o bind /var/log/ / | ||
| + | /var/log/ / | ||
| + | ... | ||
| + | |||
| + | # sed -ie ' | ||
| + | |||
| + | Jetzt die Datei aus dem Verzeichnis __/ | ||
| + | |||
| + | vi / | ||
| + | # Create an additional socket for some of the sshd chrooted users. | ||
| + | $AddUnixListenSocket / | ||
| + | $AddUnixListenSocket / | ||
| + | | ||
| + | # Log internal-sftp in a separate file | ||
| + | : | ||
| + | : | ||
| + | |||
| + | |||
| + | ===== SFTP-Client ===== | ||
| + | |||
| + | Mit Linux/ | ||
| + | Aber mit Windows dagegen muss man das richtige Programm kennen. | ||
| + | |||
| + | [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * die Portable-Version von FileZilla, integriert sich nahtlos in die PortableApps Suite | ||
| + | |||
| + | |||
| + | ==== Was ist der Unterschied zwischen FTPS und SFTP? ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | |||
| + | __FTPS -> FTPS Methode Explizit:__ | ||
| + | * bei FTPS handelt der Client erst nach dem Verbindungsaufbau eine Verschlüsselung aus, die Verbindung bleibt auch unverschlüsselt bestehen, wenn sie sich auch keine Verschlüsselungsmethode einigen konnten | ||
| + | * FTPS ist ein klassisches FTP, welches SSL (X.509, ähnlich wie bei HTTPS) zur Verschlüsselung nutzt | ||
| + | |||
| + | |||
| + | __SFTP -> FTP Methode Implizit:__ | ||
| + | * hier geht ohne Verschlüsselung nichts | ||
| + | * SFTP ist ein Sub-System in SSH | ||
| + | |||
