shell ohne Eingabemöglichkeit

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
iTob
Beiträge: 30
Registriert: 11.08.2005 16:41:31

shell ohne Eingabemöglichkeit

Beitrag von iTob » 23.09.2005 12:46:50

Hallo!
Ich verwende SSH an Debian um einen den Windows RDP-Port sicher über das Internet zu verbinden. Damit die SSH-Anmeldung funktioniert benötigt der Benutzer eine Shell. Ich will aber unterbinden, dass man über diese Shel etwas eingeben kann. Deshalb habe ich ein Script geschrieben, welches die Uhrzeit ausgiebt, dann 100s schläft, dann wieder die Uhrzeit ausgibt.
Nun habe ich zwei Probleme:
1. Benötigt dieses Script ca 10% Systemressourcen auf meinem PII 500. Gibt es eine andere Möglichkeit, um den Rechner weniger zu belasten?
2. Kann ich mich über SSH dann nicht ausloggen sondern die Verbindung nur einfach trennen. Das hat aber zur Folge, dass mein Script weiterläuft bis ich entweder den Server neu boote oder die Prozesse "aufräume" ...

hennes@debian
Beiträge: 465
Registriert: 18.01.2005 02:11:40
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz - Kanton St. Gallen
Kontaktdaten:

Beitrag von hennes@debian » 23.09.2005 15:52:21

Benützt du

Code: Alles auswählen

sleep 100
um zu warten? Bei mir benötigt diese funktion genau 0% cpu...

Eine andere Möglichkeit ist in /etc/passwd dem Benutzter die Shell /bin/false zuzuteilen, dann kann er zwar eine SSH-Session öffnen, nachher ist aber ende... Das sieht so aus:

Code: Alles auswählen

username:x:101:103::/var/run/dbus:/bin/false

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 23.09.2005 16:12:28

hi,

Man kann im Public Key (normal in "$HOME/.ssh/authorized_keys") Optionen angeben.
Evt. macht die Option "no-pty" das richtige. Der Zeilenanfang eines solchen Keys
sieht dann so aehnlich aus:

Code: Alles auswählen

no-pty ssh-dss AAAAB3NzaC1kc3MAAAC...
Einzelheiten stehen in "man sshd" unter AUTHORIZED_KEYS FILE FORMAT.
Beware of programmers who carry screwdrivers.

iTob
Beiträge: 30
Registriert: 11.08.2005 16:41:31

Beitrag von iTob » 26.09.2005 11:03:57

Vielen Dank schon mal für eure Antworten.
Die Shell /bin/false verhindert das Anmelden mit Putty ganz. Putty stellt ja vorrangig eine
Eingabe-Aufforderung zur Verfügung und bricht deshalb ganz ab.
Bei no-pty im Schlüssel verarbeitet der Server die Eingabe zwar nicht aber im Shell-Fenster kann ich erst einmal jeden Blödsinn eingeben - gibt es vieleicht eine Möglichkeit dieses abzuschalten.
Außerdem habe ich festgestellt:
Die hohe Systemlast erzeugt mein Script erst, wenn ich die SSH-Verbindung einfach getrennt habe. Das Script, welches ich als shell in Passwd eintrage wird dann nicht beendet sondert läuft weiter.
Wie bekomme ich es denn hin, dass das Script auch dann beendet wird, wenn die Verbindung einfach "abreißt" ?

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 26.09.2005 21:12:01

iTob hat geschrieben:Bei no-pty im Schlüssel verarbeitet der Server die Eingabe zwar nicht aber im Shell-Fenster kann ich erst einmal jeden Blödsinn eingeben - gibt es vieleicht eine Möglichkeit dieses abzuschalten.
In der Putty-configuration unter "Terminal -> Line discipline options -> Local echo"
kann man "Force off" waehlen.

Die "no-pty" Option muss nicht im Key stehen, kann man auch im Putty einstellen:
"Connection -> SSH -> Protocol Options": "Don't allocate a pseudo-terminal".

Und dann gibt es noch die Kommandozeilen-Version von Putty namens "Plink".
Damit geht im wesentlichen das gleiche, aber evt. kann der versierte Windows-
Benutzer das Plink so starten, dass garkein Fenster erscheint? Mit Win98 konnte
man unter "Eigenschaften einer Verknuepfung" einiges machen.
Beware of programmers who carry screwdrivers.

iTob
Beiträge: 30
Registriert: 11.08.2005 16:41:31

Beitrag von iTob » 04.10.2005 17:34:57

Ich wollte diese Eingabe-Sperre aber nicht von der Client-Seite aus sondern vom Server für einen bestimmten Benutzer eingrenzen, damit es Benutzer (incl. Schlüssel) gibt, welche keinen Shellzugriff haben. Damit will ich die Gefahr verringern, welche von "verlorene" Schlüssel ausgehen kann.

Das ganze funktioniert ja mit einem Script ganz gut, welches statt der Shell gestartet wird. Nur wie kann ich dieses Script beenden wenn kein ordnungsgemäßer logout stattfindet? Kann ich im Script abprüfen ob die entsprechende SSH-Verbindung noch steht?

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 04.10.2005 18:36:18

Raestelhaft, bei hennes@debian geht's, bei mir geht's. Wie schaut denn das Script
aus und der Eintrag in "/etc/passwd"?
Beware of programmers who carry screwdrivers.

iTob
Beiträge: 30
Registriert: 11.08.2005 16:41:31

Beitrag von iTob » 10.11.2005 15:20:14

Ich habe als benutzer-shell auf folgendes script gesetzt:

Code: Alles auswählen

read -ers -t1 a 
while [ "$a" != "e" ]
  do
   read -t100 -ers a
   date  
done
exit 0
Solange die Verbindung steht wird aller 100s eine Datums und Uhrzeit-Zeile erzeugt. Tastatureingaben schluckt read ohne Anzeige und mit e(Return) läßt sich die Verbindung trennen. Dieses Script benötigt auch kaum Ressourccen.
Wenn ich aber nun die Verbindung trenne ohne dieses Script mittels e(Return) zu beenden läuft der Prozess weiter. Ab diesem Zeitpunkt lastet dieses Script das System zu 100% aus und läuft bis ich ihn per kill-Befehl beende.
Kann ich dieses Script anders schreiben oder gibt es eine Möglichkeit diesen Prozess zu beenden sobald die ssh-Verbindung unterbrochen wird?

nil
Beiträge: 989
Registriert: 08.06.2005 13:28:36

Beitrag von nil » 10.11.2005 15:22:00

vielleicht hilft dir das:

plink anstatt von putty
ssh -N anstatt von ssh
/bin/false als Shell

oder etwas ausführlicher:

http://www.debianforum.de/forum/viewtopic.php?t=43242

iTob
Beiträge: 30
Registriert: 11.08.2005 16:41:31

Beitrag von iTob » 11.11.2005 09:49:56

Danke!
So funktioniert es wirklich ganz toll!

Nun hab ich nur noch ein kleines Problem:
Es ist so vermutlich nicht mehr möglich eine Bestätigung bei erfolgreichem Verbinden anzuzeigen. Ich bekomme ein schwarzes Fenster ohne jegliche Meldung.

nil
Beiträge: 989
Registriert: 08.06.2005 13:28:36

Beitrag von nil » 11.11.2005 10:24:15

Das wirst du auch nicht mehr bekommen können, da du dich ja mit -N (no shell) verbindest und mit /bin/false erhälst du keine Shell (obwohl da auch was anderes stehen könnte). Das ist der Preis für deine Sicherheit. Aber man merkt doch anschließend, ob das SSH-Forwarding möglich ist. Oder was willst du damit bezwecken?

iTob
Beiträge: 30
Registriert: 11.08.2005 16:41:31

Beitrag von iTob » 11.11.2005 10:46:25

Es ist nicht weiter schlimm, es geht mir nur um die Benutzerfreundlichkeit...
Ich will durch diesen Tunnel einen Benutzer per RDP auf WinXP zugreifen lassen. Und den Clienten kann man eben erst starten wenn der Tunnel steht. Deshalb wäre eine Meldung hilfreich, aber eben nicht zwingend notwendig.

Noch ne andere Sache: mit no-port-forwarding kann ich doch im Schlüssel das forwarding ganz deaktivieren. Kann ich dort auch festlegen, dass der Benutzer nur einen bestimmten Port forwarden darf? Leider habe ich darüber noch nichts gefunden.

nil
Beiträge: 989
Registriert: 08.06.2005 13:28:36

Beitrag von nil » 11.11.2005 10:55:44

no-port-forwarding
sagt mir leider nichts, mag es aber wohl geben. Generell sollte man entweder den Leuten vertrauen, denen man den Zugang erlaubt oder besser:

mit iptables nur den Zugriff auf die speziellen Ports erlauben

Aber Port-Forwarding stellt immer ein Risiko dar. So können diese Benutzer evtl. auf lokale Ports zugreifen, die eigentlich durch die Firewall verhindert werden.

Antworten