Du bist nicht angemeldet.

#1 14.05.2021 22:13:58

delta-x8
Mitglied

SFTP auf ein bestimmtes Verzeichnis begrenzen

Guten Abend zusammen, ich möchte OpenSSH (SSHD) gerne so konfigurieren, dass man über Nautilus oder Nemo bei einem bestimmten Nutzer unter der Netzwerkadresse sftp://username@hostname/ nicht den gesamten Inhalt von dem Rootverzeichnis einsehen kann, sondern in einem bestimmten Ordner landet (/home/username auf dem Server soll für den Client als / erscheinen). Der Terminalzugriff (SSH) soll für diesen Nutzer gesperrt sein, es soll also nur SFTP möglich sein.

Folgende Sache habe ich gefunden und bereits ausprobiert. Hierbei gibt es allerdings das Problem, dass das nur im Terminal mit dem sftp-Befehl funktioniert. Sobald ich mit Nautilus oder Nemo versuche, eine sftp-Verbindung herzustellen, endet das mit einer Fehlermeldung (Could not display "sftp://username@hostname/").

nano /etc/ssh/sshd_config
Match group sftp
  ForceCommand internal-sftp
  ChrootDirectory %h

Daher die Frage, hat jemand eine Idee, wie man das hinbekommen könnte? Statt OpenSSH wäre TinySSH übrigens genauso in Ordnung.

Und woran liegt das, dass sich SFTP im Terminal anders verhält als SFTP bei Nautilus oder Nemo?

Beitrag geändert von delta-x8 (14.05.2021 22:31:22)

Offline

#2 15.05.2021 14:41:08

GerBra
Mitglied

Re: SFTP auf ein bestimmtes Verzeichnis begrenzen

Ich habe das mal nachvollzogen mit caja unter Mate, und dort funktioniert alles wie erwartet.
Gehalten habe ich mich an:
https://wiki.archlinux.org/title/SCP_an … hroot_jail
D.h. ich habe:
a) ein das Jail-Dir erzeugt und was reingepackt.
b) einen Testuser erzeugt (wie angegeben, unprivilegiert)
c) eine Match-Sektion in der Konfig erstellt.
Sowohl per sftp im Terminal als auch mit Mate's caja funktioniert die Verbindung (jeweils sftp:://foo@baz/) und ich bin beschränkt auf dieses "Jail".

Du verwendest ja privilegierte User (also mit eigenen $HOMES auf dem SSH-Server). Das jeweilige chroot-Directory muß root gehören und die chmod-Flags 755 haben. Siehe auch: man sshd_config. Hast du das bedacht?
Siehe informativ auch:
https://wiki.archlinux.org/title/SFTP_chroot
v.a. der Notes-Kasten zur Verwendung von /home/* als chroot-Jail.

Offline

#3 15.05.2021 16:32:50

delta-x8
Mitglied

Re: SFTP auf ein bestimmtes Verzeichnis begrenzen

GerBra schrieb:

Du verwendest ja privilegierte User (also mit eigenen $HOMES auf dem SSH-Server). Das jeweilige chroot-Directory muß root gehören und die chmod-Flags 755 haben. Siehe auch: man sshd_config. Hast du das bedacht?

Ich hatte zuvor /home/user mit chown root:root und chmod 700 versehen. Bei dem chmod scheint der Fehler zu liegen, da ich gelesen hatte, dass auf das Vezeichnis nur root zugreifen können darf (daher 700). Danke für den Hinweis!


Ich habe nun die folgenden Befehle ausgeführt (die Gruppe sftp sowie den Nutzer foo gibt es vorher noch nicht):

sudo groupadd sftp
sudo mkdir -p /var/lib/jail
sudo useradd -g sftp -d /var/lib/jail foo
sudo passwd foo
sudo chmod 755 /var/lib/jail
sudo nano /etc/ssh/sshd_config
Match group sftp
  ChrootDirectory %h
  X11Forwarding no
  AllowTcpForwarding no
  PasswordAuthentication yes
  ForceCommand internal-sftp
sudo systemctl restart sshd

Nemo bringt nun folgende Fehlermeldung:

Could not display "sftp://foo@192.168.2.104/". The location is not a folder.

Und mit Caja bekomme ich eine Verbindung hin. Da gibt sich allerdings ein anderes Problem, sobald ich eine Datei oder einen Ordner erstellen möchte:

Beim Erstellen des Ordner in "sftp://foo@192.168.2.104/" ist ein Fehler aufgetreten. Zugriff verweigert.

Ich gehe davon aus, dass das Schreiben fehlschlägt, weil nur Leseberechtigungen für den Nutzer bestehen (r-x, wegen 755).

$ ls -la /var/lib
insgesamt 60
drwxr-xr-x 15 root  root  4096 15. Mai 15:47 .
drwxr-xr-x 12 root  root  4096 15. Mai 15:27 ..
[...]
drwxr-xr-x  2 root  root  4096 15. Mai 15:47 jail

Daher habe ich nun, entgegen der Anleitung, das hier gemacht:

sudo chmod 766 /var/lib/jail
sudo systemctl restart sshd

Nun bringt Nemo einen anderen Fehler:

Could not display "sftp://foo@192.168.2.104/". Error: Verbindung fehlgeschlagen. Please select another viewer and try again.

Und bei Caja ergibt sich dieser Fehler:

"sftp://foo@192.168.2.104/" konnte nicht angezeigt werden. Fehler: Verbindung fehlgeschlagen. Bitte wählen Sie einen anderen Betrachter und versuchen Sie es erneut.

Nun die Frage, wie kann ich das hinbekommen, dass rw-Berechtigungen bestehen?

Und was ich seltsam finde, ist, dass sich Nemo und Caja unterschiedlich verhalten. Eigentlich sind beide ja Forks von Nautilus...

Offline

#4 16.05.2021 00:03:15

GerBra
Mitglied

Re: SFTP auf ein bestimmtes Verzeichnis begrenzen

delta-x8 schrieb:

Nun die Frage, wie kann ich das hinbekommen, dass rw-Berechtigungen bestehen?

Die Ursache dieses Problems ist dann das chroot.
Bei OpenSSH (andere sshd's kenne ich nicht) ist es zwingend erforderlich, wenn die Option des chroot's verwendet werden soll, daß das chroot/jail-Verzeichnis eben dem User root gehört und den Modus 755 hat.
Alle andern Modi/Ownerships bringen im Log des sshd-Servers dann den Fehler:
"sshd[123456]: fatal: bad ownership or modes for chroot directory "/home/foo""

Diese Bedingung verhindert dann allerdings ein RW-Recht des sftp-Users in diesem Verzeichnis.

Das Hauptanwendegebiet von (s)ftp und chroot besteht wohl darin, unprivilegierten Usern einen lesenden Zugriff auf daten zu ermöglichen *und* sie dabei von der (Verzeichnis-)Struktur des darunterliegenden Systems zu isolieren.

Wenn es jetzt um RW-Möglichkeiten und - wie bei dir - um privilegierte User mit eigenem $HOME (was als chroot dienen soll) geht, dann bist du auf einige Einschränkungen angewiesen.

a) Das jeweilige $HOME der User (also z.B. /home/foo) muß root gehören. Also statt:
foo:foo muß es zwingend root:foo sein.
Bei den Modi funktionieren zwei: 755 und 750
Für $HOMEs dürfte 750 die "bessere" Wahl sein, also keine Rechte für "Others".
Zwingend ist allerdings die 5/r-x bei der Gruppe.
Und das ist auch der Grund, warum du im / des chroot's (also /home/foo) kein Schreibrecht als User/Gruppenmitglied hast über sftp.

//Edit: Durch diesen Zwang "kastrierst" du die jeweiligen $HOMES der User natürlich, d.h. kein User kann in seinem $HOME in der obersten Ebene mehr Daten schreiben/verändern oder Verzeichnisse anlegen/löschen etc. Das ist IMHO eine große Einschränkung. Ich würde für User mit (s)ftp-Zugang auf keinen Fall die $HOMES verwenden wenn diese User noch anderweitig "normal" am/mit dem System arbeiten sollen.
Selbst eine Idee wie: ChrootDir %h/Upload funktioniert nicht, wenn /home/foo weiterhin foo gehört und nur Upload darin root mit 755, da der sshd bei chroot prüft, ob der *ganze* Pfad dem root-User gehört.

b) Schreibrechte hast du allerdings in Unterverzeichnissen, auf die der User über Eigentümer oder Gruppenmitgliedschaft effektiv Zugriff hat.
RW-Arbeiten in /home/foo geht also nicht, aber in /home/foo/austausch/ z.B. dann schon, wenn foo der Eigentümer ist oder über Gruppenrechte rankommt.
D.h. die User, die über sftp zugreifen, verlieren ihre Rechte in der "Wurzel" ihres $HOME-Verzeichnisses (da der Eigentümer ja nun root ist), behalten aber ihre Rechte in Verzeichnissen unterhalb.

Ich habe das getestet mit einem User foo (/home/foo) und eben in der sshd_config bei ChrootDirectory %h
Jeweils mit Konsolen-sftp als auch über caja, beides funktioniert wie gewollt: Der User ist per chroot "eingesperrt", rw-Zugriff kann nur in Unterverzeichnissen stattfinden.

Nemo oder andere Filemanager habe ich nicht installiert wg. Abhängigkeiten. Keine Ahnung, warum und ob diese bei richtiger Konfiguration/Anwendung ein anderes Verhalten an den Tag legen. Selbst der sftp-Client im mc(MidnightCommander) kommt damit zurecht.

Beitrag geändert von GerBra (16.05.2021 00:32:26)

Offline

#5 16.05.2021 18:36:14

delta-x8
Mitglied

Re: SFTP auf ein bestimmtes Verzeichnis begrenzen

GerBra schrieb:

Bei den Modi funktionieren zwei: 755 und 750

Nun eine möglicherweise ganz schlimme Idee - man könnte den root-user nehmen und ihn über chroot in ein bestimmtes Verzeichnis sperren. Er müsste ja mit rwx-Berechtigung über sftp zugreifen können, oder? Ansonsten weiß ich nicht, ob man vielleicht einem normalen Nutzer root-Berechtigung geben könnte an der Stelle. Wäre das eine ganz schlechte Idee (sicherheitstechnisch und so) oder kann man das ohne Bedenken machen?

GerBra schrieb:

Schreibrechte hast du allerdings in Unterverzeichnissen, auf die der User über Eigentümer oder Gruppenmitgliedschaft effektiv Zugriff hat.

Gut, die Lösung wäre die, einen Ordner in dem chroot-Verzeichnis zu erstellen, der chmod 760 hat. Alle Dateien bei sftp packt man dann in diesen Ordner und hat rw-Berechtigung. Zwar nicht so elegant, aber gut, wenn's dann funktioniert... Vielen Dank für die Hilfe!

Offline

#6 16.05.2021 19:49:45

GerBra
Mitglied

Re: SFTP auf ein bestimmtes Verzeichnis begrenzen

delta-x8 schrieb:

Nun eine möglicherweise ganz schlimme Idee

Wenn solche Überlegungen während einer Implementierung aufkommen dann sind IMHO meist die Anforderungen nicht sauber skizziert. Ergo: Technisch wohl möglich, aber warum? Mit welchem konkreten Ziel?
Ich halte das - in dem Kontext - dann sehr wohl für ein "Sicherheitsproblem".

delta-x8 schrieb:

Gut, die Lösung wäre die, einen Ordner in dem chroot-Verzeichnis zu erstellen, der chmod 760 hat. Alle Dateien bei sftp packt man dann in diesen Ordner und hat rw-Berechtigung. Zwar nicht so elegant, aber gut, wenn's dann funktioniert... Vielen Dank für die Hilfe!

Vielleicht schilderst du nochmal konkret den Anwendungsfall, evtl. kommen dann neue Ideen die aktuell - weil man sich an technischen Problemen festbeißt - nicht so offensichtlich sind.

Fragen:
a) Im ersten Post schriebst du von *einem* User. Geht es um einen User oder um mehrere?

b) Der/die User haben ein $HOME bei dir, dieses sollte für das chroot-Jail genutzt werden. Per ssh soll der Zugriff nur über sftp möglich sein.
Arbeiten der/die User denn sonstwie (lokal z.B.) an diesem Server, also loggen sich ein, brauchen .dotfiles? Oder nur remote eben per sftp?
Das $HOME der User für das chroot-Jail zu verwenden ist ja - s.o. - keine gute Idee, v.a. wenn der/die User lokal z.B. auf ein funktionierendes $HOME angewiesen sind. Warum muß der/die User unbedingt per sftp an sein $HOME kommen, und dann auch noch Voll-RW (was ja nicht geht).
Muß es also $HOME sein für den sftp-Zugang?

Ein praktisches Beispiel wäre: Web-Server auf dem bestimmte User per sftp HTML-Dateien in einen Public-Bereich hochladen/bearbeiten können.
Da würde das chroot-Jail dann z.B. /srv/http/coolesite/html/ sein. Darin sind die sftp-User "gefangen".
Gleichzeitig gibt es einen /srv/http/coolesite/html/public Ordner. Dieser würde nicht root sondern den Usern/Gruppen gehören, ergo - da Unterordner ja rw haben können - haben diese dort Upload/Schreibrechte. So werden die technischen Anforderungen an sshd/sftp eingehalten.

Eine Idee für deine Anforderung könnte evtl. sein:
Ein sftp-chroot in /var/lib/jail - der/die sftp-User sind dort gefangen. Unterhalb gibt es für jeden User einen eigenen Ordner der dem jeweiligen User gehört, also z.B. Micha, Peter, Maria. In diese Ordner können nun Dateien/Ordner per sftp mit Vollzugriff vom jeweiligen User verwaltet werden. Auch so, daß Micha nicht bei Maria "reinschauen" kann.
Hier könnten sogar wenn nötig Teile des jeweiligen $HOMES des Users per bind-Mount eingehängt werden, z.B. der Dokumente-Ordner aus /home/micha/Dokumente nach /var/lib/jail/Micha/home/Dokumente.
Selbst umgekehrt wäre das denkbar: man bind-mountet oder symlinkt den /var/lib/jail/Micha Ordner als "Upload"-Ordner in das $HOME von Micha - so könnten per remote Daten hochgeladen werden und der User würde diese dann in seinem $HOME finden.
So könnte der angeforderte sftp-Zugriff geregelt sein und die $HOMEs der User (wenn diese gebraucht würden) könnten unangetastet bleiben.

Offline

#7 18.05.2021 13:04:58

delta-x8
Mitglied

Re: SFTP auf ein bestimmtes Verzeichnis begrenzen

GerBra schrieb:

Fragen:
a) Im ersten Post schriebst du von *einem* User. Geht es um einen User oder um mehrere?

Es soll um einen einzelnen Nutzer gehen. Er soll sftp ermöglichen, das für Backups und Synchronisation zwischen Geräten genutzt werden soll.

GerBra schrieb:

b) Der/die User haben ein $HOME bei dir, dieses sollte für das chroot-Jail genutzt werden. Per ssh soll der Zugriff nur über sftp möglich sein.
Arbeiten der/die User denn sonstwie (lokal z.B.) an diesem Server, also loggen sich ein, brauchen .dotfiles? Oder nur remote eben per sftp?

Die sftp-Beschränkung soll nur für den einen Nutzer gelten. Er soll nur für sftp da sein (also wie bei einem NAS), mehrere sftp-Nutzer gibt es nicht.

GerBra schrieb:

Muß es also $HOME sein für den sftp-Zugang?

Also es muss nicht das Home-Verzeichnis sein. Mit dem /var/lib/jail-Ding bin ich zufrieden, mir schien ersteres nur am naheliegendsten zu sein - dort packt man normalerweise ja als Nutzer seine Dateien hin...

GerBra schrieb:

Eine Idee für deine Anforderung könnte evtl. sein: Ein sftp-chroot in /var/lib/jail - der/die sftp-User sind dort gefangen. Unterhalb gibt es für jeden User einen eigenen Ordner der dem jeweiligen User gehört, also z.B. Micha, Peter, Maria. In diese Ordner können nun Dateien/Ordner per sftp mit Vollzugriff vom jeweiligen User verwaltet werden. Auch so, daß Micha nicht bei Maria "reinschauen" kann.

Genau, die Lösung wäre ganz gut. Wegen der Sache, dass man in /var/lib/jail (bzw. allgemein dem chroot-Verzeichnis) einen Unterordner erstellen muss, um das mit dem RW hinzubekommen, kam ich auf die Idee, dass man root als Nutzer nehmen könnte, da er ja auch ohne Unterordner RW hätte.

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums