Shell-Zugriff per Webbrowser » LinuxCommunity

Originalartikel

Backup

<html> <div class=„attribute-content“ readability=„41“>

	
	
	 
			    
					    <p>    Eine Shell im Browser? PHPshell und Shell in a Box machen es m&#246;glich und erleichtern damit das Verwalten von Webservern auch ohne SSH-Zugang &#8211; beispielsweise aus dem n&#228;chsten Internet-Caf&#233;.</p>
		    </div><div class="block" readability="140"><p>

Die Verwaltung eines externen Webservers gestaltet sich per Secure Shell einfach, dank X-Forwarding kann man bei entsprechender Netzanbindung sogar grafische Programme zur Verwaltung am heimischen Rechner bedienen. Oft steht aber zur Administration nur ein Rechnern zur Verf&#252;gung, auf dem man keine zus&#228;tzliche Software installieren kann oder darf. H&#228;ufig agiert auch die Firewall so restriktiv, dass au&#223;er HTTP(S) nichts hindurch kommt. PHP Shell und Shell in a Box erm&#246;glichen in diesem Fall trotzdem den Shell-Zugriff auf den Server. </p> <a name=„eztoc0_0_1“ id=„eztoc0_0_1“></a><h4>PHP Shell</h4><p> PHP Shell erm&#246;glicht den Shell-Zugang zu Servern, wo die Firewall den Zugang blockiert oder Sie keine Software im Dateisystem installieren k&#246;nnen. Ein PHP-f&#228;higer Webserver gen&#252;gt, um Shell-Befehle auszuf&#252;hren. Dazu darf der <a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_gsafe-mode“ title=„Safe-Mode|Der (als veraltet geltende) Safe-Mode ist ein Versuch, PHP auf Webservern, die viele verschiedene Sites hosten (sogenannte &quot;Shared Server&quot;), durch Einschr&#228;nkungen gewisser Befehle sicher zu machen.“ target=„_self“ class=„glossary“>Safe-Mode</a> von PHP nicht aktiviert sein. </p> <p> Die Installation von PHP Shell funktioniert recht einfach: Sie laden die aktuelle Version von der PHP-Shell-Homepage&#160; herunter und entpacken das ZIP-Archiv in ein Verzeichnis auf dem Webspace. Dann setzen Sie ein Passwort, wozu Sie die URL

http://<i class="replaceable">Server</i>/phpshell/pwhash.php

aufrufen. Dort geben Sie die gew&#252;nschte Kombination von Benutzernamen und Passwort ein. Sie erhalten als Ausgabe eine Zeile, die sie im Abschnitt

[users]

der Konfigurationsdatei

config.php

eintragen. Bei Bedarf k&#246;nnen Sie auch mehrere Benutzer anlegen. Neben Benutzernamen und Passwort lassen sich in

config.php

noch Shell-Aliases sowie ein Home-Verzeichnis f&#252;r PHP Shell festlegen. </p> <div class=„box textbox“ id=„article_xtipp“ readability=„62“> <p> Das verschl&#252;sselte Abspeichern des Passworts mithilfe von

pwhash.php

verhindert zwar unberechtigte Logins, falls einem Angreifer die Konfigurationsdatei in die H&#228;nde fallen sollte. Sie sollten PHP Shell aber grunds&#228;tzlich &#252;ber eine per SSL verschl&#252;sselte Verbindung (HTTPS) aufrufen &#8211; andernfalls k&#246;nnte ein Angreifer die eingegebenen Kommandos und Ausgaben im Klartext mitlesen. </p> </div><p> Nun steht PHP Shell zum Einsatz bereit. Sie rufen es &#252;ber die URL

https://<i class="replaceable">Server</i>/phpshell/phpshell.php

auf, melden sich mit Benutzernamen und Passwort an &#8211; und die Shell-Sitzung im Webbrowser kann beginnen. Sie geben nun Kommandos im PHP-Shell-Fenster ein (<a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_f1“ target=„_self“ class=„figure“>Abbildung&#160;1</a>). Nach dem Bet&#228;tigen von [Eingabe] oder einem Klick auf Execute Command werden diese ausgef&#252;hrt, das Ergebnis erscheint wiederum im Shell-Fenster. </p> <div class=„object-center“ id=„article_f1“ readability=„31“>

  
  
  
      	                    
<div class="jquerylightbox" readability="12">
    <a href="http://www.linux-community.de/var/ezwebin_site/storage/images/internal/artikel/print-artikel/linuxuser/2011/04/shell-zugriff-per-webbrowser/abbildung-1/1458712-1-ger-DE/Abbildung-1_lightbox.png" rel="lightbox[image]" title="Abbildung 1: PHP Shell ist unschwer als Webanwendung zu erkennen.">
	<img src="http://www.linux-community.de/var/ezwebin_site/storage/images/internal/artikel/print-artikel/linuxuser/2011/04/shell-zugriff-per-webbrowser/abbildung-1/1458712-1-ger-DE/Abbildung-1_large.png" alt="" /></a>
    <p>

Abbildung 1: PHP Shell ist unschwer als Webanwendung zu erkennen. </p> </div>

  </div><p>

Die Kommandozeile, die PHP Shell im Browser zur Verf&#252;gung stellt, unterliegt dabei einigen Einschr&#228;nkungen: </p> <ul><li>Jeder Befehl muss ohne weitere Benutzereingabe auskommen, interaktive Programme lassen sich nicht bedienen.</li> <li>Jedes Kommando muss in eine Zeile passen. PHP Shell erkennt nicht, dass ein Kommando noch fortgesetzt werden m&#252;sste. So gelingt beispielsweise die Eingabe einer For-Schleife in mehreren Zeilen (wie in der normalen Shell) nicht.</li> <li>Die Befehle m&#252;ssen innerhalb einer bestimmten Zeitspanne abgearbeitet sein, &#252;blicherweise binnen 30 Sekunden. Hier handelt es sich jedoch nicht um eine durch PHP Shell bedingte Einschr&#228;nkung: Sowohl der Webserver (meist Apache) als auch PHP brechen nach einer gewissen Zeit die Verarbeitung ab. Sie konfigurieren die entsprechenden Limits in Apache &#252;ber die

Timeout

-Direktive, in PHP mittels der Einstellung

max_execution_time

in

php.ini

.</li> </ul><p> PHP-Shell f&#252;hrt die Kommandos unter der User- und Group-ID des Webservers aus, wie sich unschwer mit dem

id

-Kommando &#252;berpr&#252;fen l&#228;sst. Das kann zuweilen recht n&#252;tzlich sein &#8211; etwa, wenn man ein Verzeichnis anlegen m&#246;chte, in das nur der Webserver schreiben darf. Das klappt via FTP meist nicht, da man in diesem Fall unter einer anderen User-ID operiert und daher oft lediglich global beschreibbare Verzeichnisse anlegen kann. Mit PHP Shell klappt das dagegen problemlos. </p> <p> PHP Shell bietet eine einfache History-Funktion, &#252;ber die Sie mit den Cursortasten in den zuletzt ausgef&#252;hrten Kommandos vor- und zur&#252;ckbl&#228;ttern. Umfangreichere History-Funktionen wie eine Suche unterst&#252;tzt PHP Shell jedoch nicht. Die Gr&#246;&#223;e des „Shell-Fensters“ &#228;ndern Sie gegebenenfalls via Size: rechts unterhalb des Eingabebereichs. Dort tragen Sie einfach die gew&#252;nschten Werte ein und f&#252;hren dann den n&#228;chsten Befehl aus. PHP Shell beinhaltet auch einen einfachen Editor (

editor <i class="replaceable">Datei</i>

), mit dessen Hilfe Sie alle Dateien &#228;ndern k&#246;nnen, auf die der Webserver schreiben zugreifen darf). </p> <a name=„eztoc0_0_2“ id=„eztoc0_0_2“></a><h4>Shell in a Box</h4><p> Shell in a Box (<a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_f2“ target=„_self“ class=„figure“>Abbildung&#160;2</a>) eignet sich dann, wenn Sie zwar Shell-Zugang zum Server haben und dort eigene Programme einrichten k&#246;nnen, aber als Client einen Webbrowser verwenden wollen oder m&#252;ssen. Das Projekt stellt neben dem Quellcode auf seinen Webseiten&#160; auch DEB-Pakete zur Verf&#252;gung. Benutzer von Debian und dessen Derivaten sowie Ubuntu-User installieren die Bin&#228;rpakete bequem &#252;ber den Paketmanager. Verwenden Sie eine andere Distribution, entpacken Sie nach dem Herunterladen den Quellcode-Tarball in ein beliebiges Verzeichnis und &#252;bersetzen ihn dort mittels

./configure ; make

. Anschlie&#223;end installieren Sie Shell in a Box mit dem Befehl

make install

als Root. Der Aufruf richtet das Programm unterhalb von

/usr/local

ein. </p> <div class=„object-center“ id=„article_f2“ readability=„31“>

  
  
  
      	                    
<div class="jquerylightbox" readability="12">
    <a href="http://www.linux-community.de/var/ezwebin_site/storage/images/internal/artikel/print-artikel/linuxuser/2011/04/shell-zugriff-per-webbrowser/abbildung-2/1458719-1-ger-DE/Abbildung-2_lightbox.png" rel="lightbox[image]" title="Abbildung 2: Shell in a Box wirkt auf den ersten Blick wie die echte Kommandozeile.">
	<img src="http://www.linux-community.de/var/ezwebin_site/storage/images/internal/artikel/print-artikel/linuxuser/2011/04/shell-zugriff-per-webbrowser/abbildung-2/1458719-1-ger-DE/Abbildung-2_large.png" alt="" /></a>
    <p>

Abbildung 2: Shell in a Box wirkt auf den ersten Blick wie die echte Kommandozeile. </p> </div>

  </div><p>

Shell in a Box bringt anders als PHP Shell einen eigenen Webserver mit, der in der Vorgabe auf Port 4200 lauscht. Dabei kann das Programm eine Reihe von Diensten zur Verf&#252;gung stellen, die Sie nach dem Schema </p>

  <pre class="auto">shellinaboxd -s <i class="replaceable">Webpfad</i>:<i class="replaceable">Dienst</i></pre><p>

starten. F&#252;r erste Versuche k&#246;nnen Sie dabei mit der zus&#228;tzlichen Option

-t

oder in der Langform

--disable-ssl

die Verschl&#252;sselung via <a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_gssl“ title=„SSL|Secure Sockets Layer. Eine Zwischenschicht, die auf das TCP/IP-Protokoll aufsetzt und dortexistierende Protokolle (HTTP, POP3, IMAP, &#8230;) verschl&#252;sselt.“ target=„_self“ class=„glossary“>SSL</a> (dazu sp&#228;ter mehr) vorl&#228;ufig deaktivieren. Welche grunds&#228;tzlichen M&#246;glichkeiten es gibt, f&#252;hrt die <a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_tfunktionen_von_shell_in_a_box“ target=„_self“ class=„table“>Tabelle „Funktionen von Shell in a Box“</a> auf. Ein

shellinaboxd

-Prozess kann dabei durchaus mehrere Services zur Verf&#252;gung stellen, wie beispielsweise das Login zu mehreren Rechnern: </p>

  <pre class="auto">$ shellinaboxd -s /host1/:SSH:host.example.com  -s /host2/:SSH:host2.example.com</pre><p>

So verbinden Sie sich unter der URL

http://localhost:4200/host1/

zu

host.example.com

verbinden, unter der URL

http://localhost:4200/host2/

&#246;ffnen Sie eine SSH-Verbindung zum Rechner

host2.example.com

. </p> <div class=„box table“ readability=„5“> <div class=„boxtitle“ readability=„6“> <p> Funktionen von Shell in a Box </p> </div> <table class=„renderedtable“ cellpadding=„2“ cellspacing=„0“ id=„article_tfunktionen_von_shell_in_a_box“ readability=„31“><tr><th valign=„top“> Kommando

</th><th valign="top">  Funktion
</th></tr><tr class="bglight" readability="2"><td valign="top">  <code>shellinaboxd -s /:LOGIN</code>
</td>

<td valign=„top“> Stellt eine Login-Shell am lokalen System unter dem Pfad

http://localhost:4200/

zur Verf&#252;gung.

</td>

</tr><tr class=„bgdark“ readability=„3“><td valign=„top“>

shellinaboxd -s /:SSH
</td>

<td valign=„top“> Stellt ein SSH-Login am lokalen System unter dem Pfad

http://localhost:4200/

zur Verf&#252;gung. Dazu muss ein SSH-Server (zumindest am Loopback-Device) laufen.

</td>

</tr><tr class=„bglight“ readability=„5“><td valign=„top“>

shellinaboxd -s /<i class="replaceable">Bezeichner</i>/:SSH:host.example.com
</td>

<td valign=„top“> Stellt einen SSH-Login f&#252;r den entfernten Rechner

host.example.com

am lokalen System unter dem Pfad

http://localhost:4200/<i class="replaceable">Bezeichner</i>/

zur Verf&#252;gung. Dazu muss ein SSH-Server laufen. Auf diese Weise l&#228;sst sich Shell in a Box auch als Gateway zu sonst unerreichbaren Rechnern verwenden.

</td>

</tr><tr class=„bgdark“ readability=„3“><td valign=„top“>

shellinaboxd -s /systemstatus/:<i class="replaceable">User</i>:<i class="replaceable">Gruppe</i>:/:<i class="replaceable">Programm</i>
</td>

<td valign=„top“> L&#228;sst unter

http://localhost:4200/systemstatus/

ein Programm mit den Rechten des angegebenen Users und der Gruppe laufen. Als Arbeitsverzeichnis dient das Wurzelverzeichnis.

</td>

</tr></table></div><p> Anders als bei PHP Shell (wo eine Zeile komplett eingegeben, diese dann verarbeitet und das Ergebnis an den Browser zur&#252;ckgeschickt wird), erm&#246;glicht Shell in a Box das textbasierte interaktive Arbeiten, beispielsweise mit einem Editor wie Vi oder Joe. Die Performance bleibt dabei etwas hinter jener im „normalen“ Terminal zur&#252;ck, meist sp&#252;rt man jedoch keine gro&#223;en Einschr&#228;nkungen. </p> <p> Shell in a Box stellt noch eine ganze Reihe weitere Optionen zur Verf&#252;gung, ein Blick in die Dokumentation beziehungsweise auf die Webseite lohnt sich. </p> <p> W&#228;hrend erste Experimente mit Shell in a Box am lokalen Rechner durchaus ohne Verschl&#252;sselung erfolgen k&#246;nnen, empfiehlt es sich dringend, im produktiven Einsatz alle Verbindungen mittels <a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_gssl“ title=„SSL|Secure Sockets Layer. Eine Zwischenschicht, die auf das TCP/IP-Protokoll aufsetzt und dortexistierende Protokolle (HTTP, POP3, IMAP, &#8230;) verschl&#252;sselt.“ target=„_self“ class=„glossary“>SSL</a> abzusichern. Dazu ben&#246;tigen Sie ein Zertifikat, das sich im entweder im aktuellen Verzeichnis befinden muss oder dessen Speicherort Sie durch die Option

--cert=<i class="replaceable">Verzeichnis</i>

angeben. N&#228;heres erl&#228;utert der <a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_xverschl_sselung_und_zertifikate“ target=„_self“ class=„textbox“>Kasten „Verschl&#252;sselung und Zertifikate“</a>.&#160; </p> <div class=„box textbox“ id=„article_xverschl_sselung_und_zertifikate“ readability=„82“> <div class=„boxtitle“ readability=„6“> <p> Verschl&#252;sselung und Zertifikate </p> </div> <p> Die Verschl&#252;sselung von Passw&#246;rtern und Daten zwischen Sender und Empf&#228;nger sorgt daf&#252;r, dass kein Unberechtigter mitlesen kann. Dazu braucht man Zertifikate, wie man sie von diversen Webseiten (oder auch Mailservern) kennt &#8211; meist nimmt man sie erst dann wahr, wenn der Browser ein Zertifikatsproblem meldet. Diese Zertifikate sollen sicherstellen, dass der Server auf der Gegenseite auch tats&#228;chlich derjenige ist, f&#252;r den er sich dem Client gegen&#252;ber ausgibt. Anderenfalls k&#246;nnte sich ein Angreifer zum Abfangen des Datenverkehrs einfach als berechtigte Gegenstelle ausgeben. </p> <p> Zertifikate bekommt man einerseits von kommerziellen, kostenpflichtigen Zertifizierungstellen: Sie verifizieren die Identit&#228;t des Antragstellers und geben dann ein Zertifikat f&#252;r einen Hostnamen aus. Der Browser erkennt das dann automatisch als korrekt: Er vertraut bestimmten, eingebaute Zertifizierungstellen. Eine Alternative bietet die Community-L&#246;sung CACert&#160;. </p> <p> Schlie&#223;lich besteht die M&#246;glichkeit, mithilfe von OpenSSL selbst signierte Zertifikate&#160; auszustellen &#8211; <a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_l1“ target=„_self“ class=„listing“>Listing&#160;1</a> f&#252;hrt die dazu notwendigen Schritte auf. Wenn Sie solche verwenden (<a href=„http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/04/Shell-Zugriff-per-Webbrowser#article_f3“ target=„_self“ class=„figure“>Abbildung&#160;3</a>) und von anderen Rechnern aus &#252;ber das Internet auf derart gesicherte Dienste zugreifen, sollten Sie sich dabei auf jeden Fall das Zertifikat anschauen und die zugeh&#246;rigen MD5/SHA1-Fingerprints vergleichen. </p> <div class=„object-center“ id=„article_f3“ readability=„31“>

  
  
  
      	                    
<div class="jquerylightbox" readability="12">
    <a href="http://www.linux-community.de/var/ezwebin_site/storage/images/internal/artikel/print-artikel/linuxuser/2011/04/shell-zugriff-per-webbrowser/abbildung-3/1458726-1-ger-DE/Abbildung-3_lightbox.png" rel="lightbox[image]" title="Abbildung 3: Ein selbst signiertes Zertifikat im Webbrowser.">
	<img src="http://www.linux-community.de/var/ezwebin_site/storage/images/internal/artikel/print-artikel/linuxuser/2011/04/shell-zugriff-per-webbrowser/abbildung-3/1458726-1-ger-DE/Abbildung-3_large.png" alt="" /></a>
    <p>

Abbildung 3: Ein selbst signiertes Zertifikat im Webbrowser. </p> </div>

  </div>

</div><div class=„box listingbox“ id=„article_l1“ readability=„39“> <div class=„boxname“> <p> Listing 1 </p> </div> <p> Key erzeugen: </p>

  <pre class="auto"># openssl genrsa -des3 -out server.key 1024</pre><p>

Certificate Signing Request (CSR) erzeugen: </p>

  <pre class="auto"># openssl req -new -key server.key -out server.csr</pre><p>

Passwort vom Schl&#252;ssel entfernen: </p>

  <pre class="auto"># cp server.key server.key.org</pre>    <pre class="auto"># openssl rsa -in server.key.org -out server.key</pre><p>

CSR signieren und Zertifikat erzeugen: </p>

  <pre class="auto"># openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

cat server.crt server.key &gt; certificate.pem</pre> </div><div class=„box glossarybox“> <div class=„boxtitle“> <p> Glossar </p> </div><dl readability=„5“><dt id=„article_gsafe-mode“><p> Safe-Mode </p> </dt><dd readability=„6“><p> Der (als veraltet geltende) Safe-Mode ist ein Versuch, PHP auf Webservern, die viele verschiedene Sites hosten (sogenannte „Shared Server“), durch Einschr&#228;nkungen gewisser Befehle sicher zu machen. </p> </dd><dt id=„article_gssl“><p> SSL </p> </dt><dd readability=„6“><p> Secure Sockets Layer. Eine Zwischenschicht, die auf das TCP/IP-Protokoll aufsetzt und dortexistierende Protokolle (HTTP, POP3, IMAP, &#8230;) verschl&#252;sselt. </p> </dd></dl></div></div> </html>