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

Freebsd – Ssh im Chrooted Jail funktioniert nicht, weil der /dev/null-Vorgang nicht unterstützt wird?

Ich versuche, ein ssh-chroot-Gefängnis auf einem meiner NAS-Server einzurichten. Das System läuft auf NAS4Free (das auf nanobsd basiert). Der Benutzer sollte in der Lage sein, nur einen Befehl auszuführen, der ein Bash-Skript ist, das ssh zu einem anderen Server öffnet und dort einen Befehl ausführt.

Um die Chroot einzurichten, habe ich dies in meiner sshd-Konfiguration.

Match User op
    ChrootDirectory %h
    X11Forwarding no
    AllowTcpForwarding no

Das Skript enthält diese Zeile:

ssh -i /.ssh/id_rsa [email protected]$externalresource -t "/mnt/storage/backup/run_project.sh '$1' '$2'"

Ich kann mich mit ssh bei dieser Chroot anmelden, aber wenn ich das Skript ausführe, gibt es den folgenden Fehler, wenn ich versuche, den darin enthaltenen ssh-Befehl auszuführen.

Couldn't open /dev/null: Operation not supported

Dasselbe passiert, wenn ich versuche, ssh einfach innerhalb der Chroot auszuführen

[I have no [email protected] /]$ ssh
Couldn't open /dev/null: Operation not supported

/dev/null sieht so aus:

$ ls -la dev/
total 8
drwx--x--x  2 root  staff    512 Nov 29 18:16 .
drwxr-xr-x  8 root  staff    512 Nov 29 18:06 ..
crw-rw-rw-  1 root  staff   0x18 Nov 29 18:16 null

Ohne die 666-Berechtigungen bekomme ich natürlich einen Fehler /dev/null Berechtigung verweigert.

Ich habe dev/null mit

erstellt
mknod dev/null c 2 2

Ich habe versucht, eine Erklärung zu finden, warum /dev/null die Operation nicht erlaubt zurückgibt, aber ich habe nichts gefunden, was hilft.

Könnte jemand bitte erklären, wie man das behebt?

Akzeptierte Antwort:

Ich habe dev/null mit

erstellt
mknod dev/null c 2 2

Ihr Wissen ist veraltet. Die Dinge funktionieren nicht mehr so, seit NAS4Free auf FreeBSD 10 und 11 basiert. (Das sind sowieso nicht die Gerätenummern für das Nullgerät.) Lesen Sie den mknod Handbuch. Sie können immer noch mknod ausführen um Geräteknoten in einem tatsächlichen Disc- oder RAM-Dateisystem zu erstellen, aber die Knoten, die Sie erstellen, sind so ziemlich völlig nutzlos. Wie Sie sehen können, lässt der Kernel Sie keine Geräte damit öffnen.

Deshalb in Jails – eigentliche Jails, die mit dem Betriebssystem geliefert werden, nicht einfache Chroot-Umgebungen, die man mit sshd_config einrichten kann — man erhält die Gerätedateien, indem man ein devfs einhängt Beispiel im Gefängnis. Das ist auch der Grund, warum Gefängnisse Knöpfe haben, um zu steuern, ob devfs gemountet werden kann und welcher devfs-Regelsatz darauf zutrifft.

Wenn Sie ein /dev/null wollen in Ihrer geänderten Root-Umgebung müssen Sie mount_nullfs verwenden um das eigentliche /dev zu erstellen Baum innerhalb der geänderten Wurzel sichtbar. Wenn Sie ein echtes Jail verwenden, konfigurieren Sie es einfach so, dass ein devfs auf /dev gemountet wird .

Wenn Sie ein echtes Jail verwenden, richten Sie es natürlich so ein, dass es sshd ausführt im Gefängnis , die die IP-Adresse des Gefängnisses abhört und als Dienst in dem Gefängnis aktiviert ist /etc/rc.conf ganz normal.

Verwandte:der Unterschied zwischen [[ $a ==z* ]] und [ $a ==z* ]?

Weiterführende Literatur

  • mknod . FreeBSD 11.0 Handbuch.
  • devfs . FreeBSD 11.0 Handbuch.
  • devfs.rules . FreeBSD 11.0 Handbuch.
  • Dokumentation:Howto:Jails. NAS4Free-Wiki.
  • Matteo Riondato. „Gefängnisse“. FreeBSD-Handbuch .
  • Scott Robb (4. März 2015). FreeBSD-Jails .

FreeBSD
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

  3. So ordnen Sie /dev/sdX- und /dev/mapper/mpathY-Geräte vom /dev/dm-Z-Gerät zu

  4. Was sind /dev/zero- und /dev/null-Dateien in Linux

  5. Wie kann /dev/random oder /dev/urandom mit base64 codiert werden?

tty (/dev/tty ) vs. pts (/dev/pts) unter Linux

Wie man einen Cronjob komplett zum Schweigen bringt /dev/null/?

DD von /dev/zero nach /dev/null ... was eigentlich passiert

Kernel:/dev/kmem und /dev/mem deaktivieren

echo oder print /dev/stdin /dev/stdout /dev/stderr

Warum sind < oder > erforderlich, um /dev/tcp