Shellinabox à la place d’ajaxterm pour un accès web-SSH

J’avais précédemment écrit un article sur Ajaxterm : https://blog.mossroy.fr/2014/10/18/ajaxterm-acces-ssh-minimaliste-via-le-navigateur-apres-correction-css/

Mais je l’ai remplacé par Shellinabox, qui a bien plus de fonctionnalités.

Sommaire

L’objectif est pour moi toujours le même : avoir un accès SSH basique à mes machines, depuis à peu près n’importe où.

Shellinabox permet les mêmes choses qu’Ajaxterm, mais en mieux : il me parait plus rapide (il ne rafraîchit pas l’écran complet à chaque fois), permet de faire du copier-coller (un peu), et fonctionne sur Firefox OS (oui, je sais, ça n’intéressera pas grand-monde).

D’autre part, je n’ai jamais eu de réponse sur les corrections que j’avais proposées sur Ajaxterm, donc je suppose que le projet n’est plus maintenu.

Bugs de clavier sur les anciennes versions

Je l’ai testé la première fois sur Debian 8 Jessie, qui fournit la version 2.14. Hélas, il y avait des bugs assez gênants sur le clavier : certaines touches, notamment « ! » et « ) », ne marchent pas sur Firefox, (mais elles fonctionnent sur Firefox OS et Chromium). Cf https://github.com/shellinabox/shellinabox/issues/81.

La version 2.20 corrige les problèmes de clavier, mais n’est disponible que sur Debian 9 Stretch. J’ai essayé d’installer le paquet .deb de stretch sur jessie : pas possible à cause d’une dépendance  à openssl 1.1.0 (et jessie ne fournit que la version 1.0.0). J’ai essayé de tricher en mettant de liens symboliques vers la version 1.0.0 : pas possible.

Mais bref, après mise à jour de mon serveur en version Stretch, ces bugs ont disparu.

Configuration

Par défaut, Shellinabox est exposé en HTTPS sur le port 4200.

Mais, avant de l’exposer sur Internet, je le fais passer par mon reverse-proxy Apache, qui fait le chiffrement avec Let’s Encrypt, et ajoute une authentification (surveillée par fail2ban).

La configuration est classique :

<VirtualHost *:443>
        ServerName shell.flaht.eu
        ProxyRequests Off
        <Proxy *>
                Require all granted
        </Proxy>
        SSLProxyEngine on
        ProxyPass / https://localhost:4200/
        ProxyPassReverse / https://localhost:4200/
        SSLEngine on
        SSLCertificateFile    /etc/letsencrypt/live/mondomaine.tld/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mondomaine.tld/privkey.pem

        # Login/mot de passe pour accéder
        <Location />
                AuthType Basic
                AuthName "Authentication required"
                AuthUserFile /etc/apache2/auth-file
                Require valid-user
        </Location>
</VirtualHost>

D’autre part, j’ai besoin dans certains cas que ce shellinabox soit également accessible par nginx. Voici la conf que j’utilise :

server {
        # SSL configuration

        listen 443 ssl;
        listen [::]:443 ssl;

        server_name mondomaine.tld;

        ssl_certificate    /etc/letsencrypt/live/mondomaine.tld/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/mondomaine.tld/privkey.pem;

        location / {
                proxy_pass https://127.0.0.1:4200;
                proxy_redirect default;
                auth_basic "Authentication required";
                auth_basic_user_file /etc/apache2/auth-file;
        }
}

Le copier-coller

Il est pas top, mais c’est toujours mieux que rien.

Si vous voulez copier du texte depuis le terminal, il faut sélectionner le texte et utiliser ctrl-C, plutôt que de faire clic-doit->copier (que je n’ai pas réussi à faire marcher).

Dans le sens inverse, pour copier du texte dans le terminal, le clic-droit-> « Paste from browser » fonctionne, mais est mono-ligne.

Afficher par défaut le « Soft Keyboard »

Sur Firefox OS (et a priori sur toutes les plateformes qui n’ont pas de clavier), avoir le « Soft Keyboard » peut être nécessaire pour accéder aux touches de clavier non alphanumériques (Echap, Tabulation etc).

Sauf que, pour l’activer, il faut faire un clic-droit… qu’on ne peut pas faire non plus si on n’a pas de souris.

Dans le code source, ils ont apparemment un peu pensé à ce genre de cas, en l’activant automatiquement sur les plateformes Apple, et quelques autres. J’ai proposé un Pull Request pour étendre ce mécanisme aux user-agents ayant les termes « Mobile » ou « Tablet » (en suivant les recommandations de Mozilla).

En attendant que quelqu’un de shellinabox se penche sur cette proposition, il est possible de le modifier manuellement, en surchargeant le fichier javascript de l’outil.

Ca se passe dans /etc/default/shellinabox, en rajoutant un paramètre dans SHELLINABOX_ARGS :

SHELLINABOX_ARGS="--no-beep --static-file=ShellInABox.js:/var/lib/shellinabox/ShellInABox-softkeyboardon.js"

Malheureusement, c’est tout le fichier javascript qu’on remplace par celui qu’il faut créer dans /var/lib/shellinabox. Ce n’est pas exceptionnel puisqu’on va perdre le bénéfice des mises à jour ultérieures de ce fichier. J’aurais préféré pouvoir injecter un bout de javascript, mais je n’ai pas trouvé de meilleur moyen à court terme.

J’ai récupéré le fichier javascript ShellInABox.js depuis le navigateur, et y ai simplement rajouté la ligne 311, en gras ci-dessous :

// Enable soft keyboard icon on some clients by default.
if (navigator.userAgent.match(/iPad|iPhone|iPod/i) != null ||
  navigator.userAgent.match(/PlayStation Vita|Kindle/i) != null ||
  navigator.userAgent.match(/Mobile|Tablet/i) != null) {
    this.softKeyboard = true;
}

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *