ShellinABox - ssh via www
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)
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
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:
- Przechodzimy do katalogu /etc/nginx/sites-available/ tworząc plik shl: plik shl
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
shl IN A nasze.ip
po zmianach: rndc reload
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;
}
}
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 »