ShellinABox - ssh via www

  • Data: 2012

Czasami zachodzi potrzeba skorzystania z naszego shella w miejscach gdzie polityka zabezpieczeń jest bardzo restrykcyjna i dostęp jest możliwy tylko do najpopularniejszych usług. I tu przychodzą nam z pomocą aplikacje emululujące terminal w przeglądarce. Na rynku z tego co wiem są trzy programy tego typu: AjaxTerm, AnyTerm i ShellinABox. Dwa pierwsze wymagają od użytkownika doinstalowania dodatkowych elementów tj. modułu do Apache i w przypadku AjaxTerm interpretera Python, również emulacja aplikacji pełnoekranowych nie jest doskonała. Trzeci program ShellinABox wydaje się być najlepszym rozwiązaniem. Przemawiają za nim:

  • jest aplikacją samo wystarczalną (wymaga pakietu OpenSSL), nie wymaga nawet serwera www.
  • dzięki pełnemu wsparciu standardu terminala VT100 doskonale radzi sobie z pełnoekranowymi aplikacjami (Midnight Commander, htop, top, ekg)
  • wsparcie SSL
  • prosta konfiguracja
  • ...i na koniec rzecz najważniejsza: to naprawdę szybko działa
  • obsługa polskich znaków (kodowanie UTF-8)
Na oficjalnej stronie projektu znajduje się demo interfejsu.

Instalacja ShellinABox jest prosta. Na oficjalnej stronie ShellinABox znajdziemy pakiety deb oraz źródła do samodzielnej kompilacji. Do uruchomienia wymagana jest biblioteka OpenSSL. Do uruchomienia naszego terminala służy plik ShellinABoxd, w paczce dla Debiana/Ubuntu instaluje się skrypt w katalogu /etc/init.d/ShellinABoxd . Po uruchomieniu ShellinABox nasłuchuje na wszystkich interfejsach na porcie 4200 co niekoniecznie mi odpowiadało. Możemy wymusić na nim działanie tylko po localhost dodając przy uruchomieniu --localhost-only lub w Debianie dopisując w pliku /etc/default/ShellinABox ShellinABox_ARGS=--localhost-only. Z racji młodego wieku przydarzają jej się choroby wieku dziecięcego. Największą niedogodnością jest problem z certyfikatem SSL prowadzący do zawieszenia się programu. Jeśli chcemy lączyć się po https to teoretycznie ShellinABox przed pierwszym uruchomieniem powinien sam wygenerować certyfikat (z pomocą OpenSSL) natomiast tego nie robi. Musimy sami go wygenerować i skopiować do katalogu z programem w przypadku Debiana do katalogu /var/lib/ShellinABox. Z oficjalnych repozytoriów Debiana nie zauważyłem tego problemu.
Zrezygnowałem z szyfrowania w ShellinABox na rzecz SSL-a na serwerze www dodając kolejne zabezpieczenie jakim jest autoryzacja dostępu na hasło. W moim rozwiązaniu przyjąłem następujące założenia: ShellinABox działa bez szyfrowania tylko po lokalnym hoście, resztę funkcjonalności takich jak ssl, dostęp na hasło, udostępnienie na zewnątrz(reverse proxy) realizuje nginx. Kolejnym plusem tego rozwiązania jest wygoda, nie musimy w przeglądarce wpisywać http://host:nr_portu ograniczamy się jedynie do postaci http://host .

  • Konfiguracja ShellinABox

  • W celu ograniczenia nasłuchu do interfejsu lokalnego na porcie 4200 i dezaktywacji szyfrowania edytujemy plik /etc/default/ShellinABox
  • ShellinABox_PORT=4200 #ustawinie portu
    ShellinABox_ARGS=--localhost-only #ograniczenie nasłuchu
    ShellinABox_ARGS=--disable-ssl #dezaktywacja szyfrowania

    Po dokonaiu zmian restartujemy program: /etc/init.d/ShellinABox
  • Konfiguracja reverse proxy na przykładzie Nginx-a

  • Przykład opiera się na skonfigurowaniu wirtualnego hosta na który będziemy się łączyli do naszego emulatora. Należy pamiętać o rekonfiguracji dns-ów.
  • Przyjmując założenie, że nasza domena to: dom.pl a subdomena dla ShellinABox-a to shl musimy edytować plik strefy dom.pl dodając wpis (serwer dns: BIND) i aktualizujmy Serial:
  • shl IN A nasze.ip
    po zmianach: rndc reload
  • Przechodzimy do katalogu /etc/nginx/sites-available/ tworząc plik shl:
  • plik shl
    server {
            listen       80;													# nasłuchujemy na standardowym porcie 80
            server_name  shl.dom.pl;												# sam nginx nas przekieruje na https
             if ($host = 'shl.dom.pl' ) {										
                     rewrite  ^/(.*)$  https://shl.ulos.pl/$1  permanent;		
               }
    
            access_log /var/log/nginx/shl.access_log;
            error_log /var/log/nginx/shl.error_log;
    
    }
    server{																# konfiguracja ssl
        listen 443;																
        ssl on;																	
        server_name shl.ulos.pl;												
    
        ssl_certificate /etc/nginx/ssl/ssl.crt;											# musimy wgenerować certyfiakt i klucz
        ssl_certificate_key /etc/nginx/ssl/ssl.key;							
    
        access_log /var/log/nginx/shl_ssl.access_log;
        error_log /var/log/nginx/shl_ssl.error_log;
    
    
            # Main location
            location / {														
                proxy_pass         http://127.0.0.1:4200/;										# podajemy ip:port na którym pracuje ShellinABox
                proxy_redirect     default;										
    
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    
                client_max_body_size       10m;
                client_body_buffer_size    128k;
    
                proxy_connect_timeout      90;
                proxy_send_timeout         90;
                proxy_read_timeout         90;
    
                proxy_buffer_size          4k;
                proxy_buffers              4 32k;
                proxy_busy_buffers_size    64k;
                proxy_temp_file_write_size 64k;
    
                auth_basic "Restricted";												# dodatkowe zabezpieczenie autoryzacja za pomocą hasła
                auth_basic_user_file /etc/nginx/.htpasswd;						
    
    
            }
    
    
    }
    
  • Zakomentujmy dwie ostanie linie (auth_basic...) w celu przetestowania tego rozwiązania bez dodatkowego narzutu w postaci autoryzacji na hasło
  • tworzymy link symboliczny: ln -s /etc/nginx/sites-available/shl /etc/nginx/sites-enabled/shl i restartujemy Nginx-a: /etc/init.d/nginx restart
  • Teraz możemy sprawdzić czy wszystko jest w porządku, wpisujemy w przeglądarkę: hhtp://shl.dom.pl powinniśmy zostać przekierowani na https://shl.dom.pl w przypadku jak nie mamy podpisanych certyfikatów przeglądarka będzie nas starła się ostrzec lecz nie zaważamy na to
  • Jeżeli wszystko jest w porządku możemy przejść do ostatniego etapu jakim jest autoryzacja dostępu na stronę poprzez podanie hasła. Do wygenerowania hasła posłużymy się zapożyczonym od Apache skryptem htpasswd. Jest on dołączany do Apache, również możemy pobrać sam skrypt (libapache-htpasswd-perl) lub skorzystać generatorów online.
  • plik generujemy: htpasswd -c scieżka_do_pliku nazwa_użytkownika

W tym momencie mamy dużo lepsze pod względem funkcjonalności i tańsze rozwiązanie od komercyjnych ofert, które przeważnie opierać się na AjaxTerm

Powrót »