Frage Wie erstelle ich einen SSH-Server, der ein Programm statt einer vollständigen Shell ausführt?


Ich habe ein Programm, das ich über ssh (oder sogar Telnet, Sicherheit des Programms ist nicht wichtig) teilen möchte, aber ich möchte nicht zulassen, dass die Verbindung auf etwas anderes in meinem System zugreifen, außer für die I / O des einen Programms (zB kein scp, kein vollständiger Shell-Zugriff, kein ssh-Tunnel). Ist das möglich und wie würde ich auf einem Ubuntu-System vorgehen?

Bonuspunkte für die Ausführung als lokaler Benutzer oder als nobody.


1
2017-10-17 12:05


Ursprung


GNU Netcat scheint zu einem gewissen Grad zu funktionieren (mit -e) kann aber nur einen Benutzer / Sitzung / Instanz unterstützen, idealerweise würde ich mehr als einmal verbinden wollen, ohne den Server neu starten zu müssen. - Adam M-W


Antworten:


GNU Netcat scheint bis zu einem gewissen Grad (mit -e) zu funktionieren, kann aber nur einen Benutzer / eine Sitzung / Instanz unterstützen, idealerweise würde ich mehr als einmal verbinden wollen, ohne den Server neu starten zu müssen.

Socat kann abzweigen.

Ich schlage vor, es zu suchen Beispiele

socat TCP4-LISTEN:5555,fork,tcpwrap=script \ EXEC:/bin/myscript,chroot=/home/sandbox,su-d=sandbox,pty,stderr 

ein einfacher Server, der Verbindungen akzeptiert (TCP4-LISTEN) und fork ist ein neuer untergeordneter Prozess für jede Verbindung; Jedes Kind agiert als Einzelrelais. Der Client muss den Regeln für den Daemon-Prozessnamen "script" in /etc/hosts.allow und /etc/hosts.deny entsprechen, andernfalls wird der Zugriff verweigert (siehe "man 5 hosts_access"). Um das Programm zu EXEC zu machen, verarbeitet child das chroot zu / home / sandbox, su wird zur sandbox des Benutzers und startet dann das Programm / home / sandbox / bin / myscript. Socat und myscript kommunizieren über einen Pseudo-Tty (Pty); Der stderr von myscript wird auf stdout umgeleitet, seine Fehlermeldungen werden also über socat an den angeschlossenen Client übertragen.


1
2017-10-17 13:43





Ich sehe zwei einfache Ansätze:

  1. Erstellen Sie lokale Benutzer, die Ihr Programm als Login-Shell ausführbar machen.

  2. Fügen Sie einen xinetd-Dienst hinzu, der Ihr Programm aufruft (der Benutzer kann dann telnet zu diesem Dienst)


4
2017-10-17 12:20





Erstellen Sie die Benutzer, die den Server verwenden werden, wie folgt:

adduser -s /bin/software username

Woher / bin / Software ist der Ort der Software und Nutzername ist, nun, der Benutzername des Benutzers.

Beachten Sie, dass Personen weiterhin Zugriff auf eine Shell erhalten können, wenn sie eine Sicherheitsverletzung in Ihrer Software feststellen.


0
2017-10-17 13:51