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 rynk 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:
Instalacja ShellinABox jest prosta. Na ofcjalnej stronie ShellinABox znajdziemy pakiety deb oraz źródła do samodzielnej kompilacji.
Do uruchomienia wymagana jest biblioteka OpenSSL. Do uruchumienia 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 przydażają 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ć certyfiakt (z pomoca OpenSSL) natomiast tego nie robi. Musimy sami go wygenerować i skopiowiać do katalogu z programem w przypadku Debiana
do katalogu /var/lib/ShellinABox. Z oficjalnych repozytorii Debiana nie 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 .
ShellinABox_PORT=4200 #ustawinie portu
ShellinABox_ARGS=--localhost-only #ograniczenie nasłuchu
ShellinABox_ARGS=--disable-ssl #dezaktywacja szyfrowania
shl IN A nasze.ip
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 opierajać się na AjaxTerm