Outils Web d’Administration – GateOne
Cet article présente l’installation de GateOne, un client SSH écrit 100% en HTML5. Mais quel est l’intérêt? Deux cas de figures sont possibles.
1er cas, on se trouve dans un environnement restrictif, par exemple derrière un proxy avec authent ntlm qui ne laisse passer que le http/https, ou sur un windows sans possibilité d’installer un client SSH. GateOne ne requiert qu’un navigateur en html5 et une connexion https standard, pas besoin de plugin, jvm ou autre.
2ème cas, on souhaite permettre un accès externe à une zone privée (intranet, etc.) sans pour autant ouvrir les accès SSH à travers sa DMZ. On peut monter GateOne derrière un reverse proxy en frontal sans compromettre sa sécurité.
Installation de GateOne
Quelques pré-requis avant de pouvoir commencer l’installation.
1 2 3 4 5 6 7 | root@server:~# apt-get install python python-openssl python-tornado python-pam python-kerberos python-imaging dtach Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: python-minimal python-mysqldb python-pycurl python-support python2.7 python2.7-minimal liblcms1 [...] |
Les packages python-pam
et python-kerberos
servent à l’authentification pam et kerberos si elles sont utilisées. Les packages python-imaging
et dtach
sont optionnels.
On charge maintenant le tar.gz depuis le github de GateOne. Par défaut, ce dernier sera installé dans le répertoire /opt/gateone
lors de la compilation.
1 2 3 4 | root@server:~# wget https://github.com/downloads/liftoff/GateOne/gateone-1.1.tar.gz root@server:~# tar -xvzf ./gateone-1.1.tar.gz root@server:~# cd ./GateOne/ root@server:~/GateOne# python setup.py install |
Configuration de GateOne
Au premier lancement, le fichier de configuration de GateOne sera créé automatiquement.
1 2 3 4 5 6 | root@server:~/GateOne# cd /opt/gateone/ root@server:/opt/gateone# ./gateone.py [I 140522 17:50:24 gateone:2748] /opt/gateone/server.conf not found or missing cookie_secret. A new one will be generated. [...] root@server:/opt/gateone# root@server:/opt/gateone# nano /opt/gateone/server.conf |
Par défaut, la configuration ne marche pas trop mal si une adresse IP sur le port 443 peut être dédiée à Gateone. Mais l’idée est de l’intégrer dans une zone d’admin avec un ensemble d’application partageant la même IP et la même URL. Il faut donc aller modifier les 5 paramètres suivants dans le fichier server.conf
:
1 2 3 4 5 6 7 8 9 | # GateOne va ecouter sur le localhost:8080 address = "127.0.0.1" port = 8080 # gateone est accesible par le prefix /gateone url_prefix = "/gateone/" # le SSL est déjà géré par la zone d'admin disable_ssl = True # contrôle le Host dans la requête HTTP origins = "https://admin-tools.writesthisblog.com" |
Le reste des options peuvent être modifiées en fonction de ses besoins. Une explication détaillée des différents paramètres est disponible sur cette page.
Configuration Nginx avec Websocket
Gateone utilise des WebSockets qui permettent des communications bidirectionnelles client/serveur en temps réels . Une configuration « classique » en reverse proxy ne fonctionnera donc pas. Heureusement, Nginx sait gérer les WebSockets.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 443 ssl; server_name admin-tools.writesthisblog.com; access_log /var/log/nginx/admin_access.log; error_log /var/log/nginx/admin_error.log; # gere le controle d acces a l interface transmission auth_basic "Veuillez-vous authentifier"; auth_basic_user_file /etc/nginx/secu/admin-password; # See https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx ssl_certificate /etc/nginx/secu/admin.crt; ssl_certificate_key /etc/nginx/secu/admin.key; include /etc/nginx/ssl_params; [...] location /gateone { proxy_buffering off; proxy_read_timeout 600s; proxy_send_timeout 600s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_pass http://127.0.0.1:8080; } } |
La directive map doit être placée en dehors du bloc server. Le bloc location lui se place comme d’habitude à l’intérieur de la configuration du serveur. Par contre, il est indispensable d’utiliser un serveur https sous peine de faire passer en clair sur internet ses communications SSH !!
Démarrer le service
Il ne reste plus qu’à démarrer le service Gateone et relancer nginx:
1 2 3 4 5 | root@server:~# update-rc.d gateone defaults root@server:~# service gateone start [ ok ] Starting Gate One daemon: gateone.py. root@server:~# service nginx reload [ ok ] Reloading nginx configuration: nginx. |
On peut maintenant accéder à GateOne avec https://www.admin-tools.writesthisblog.com/gateone/
.
Et là, c’est probablement le drame et on obtient le message suivant :
The WebSocket connection was closed. Will attempt to reconnect every 5 seconds…
NOTE: Some web proxies do not work properly with WebSockets.
Débuguer sa Configuration GateOne/Nginx
Il se trouve que Nginx supporte les WebSockets uniquement depuis la version 1.3 et Debian Wheezy (7.5) ne propose que la 1.2.1. D’une manière ou d’une autre, il faut donc upgrader son serveur. Personnellement, je préfère dotdeb.
Quoiqu’il en soit, GateOne est assez capricieux à configurer. En cas de soucis, mieux vaut arrêter le service et lancer GateOne à la ligne de commande afin de récupérer en direct les messages d’erreur.
1 2 3 4 5 6 7 8 9 10 | root@server:~# service gateone stop [ ok ] Stopping Gate One daemon: gateone.py. root@server:~# cd /opt/gateone/ root@server:/opt/gateone# ./gateone.py [I 140526 01:19:24 gateone:2917] Connections to this server will be allowed from the following origins: 'https://admin-tools.writesthisblog.com' [I 140526 01:19:24 gateone:2307] No authentication method configured. All users will be ANONYMOUS [I 140526 01:19:24 gateone:2404] Loaded plugins: bookmarks, convenience, example, help, logging, logging_plugin, mobile, notice, playback, ssh [I 140526 01:19:24 gateone:3039] Listening on http://127.0.0.1:8080/ [I 140526 01:19:24 gateone:3060] Process running with pid 12095 [I 140526 01:19:28 gateone:1063] WebSocket opened (ANONYMOUS). |
Améliorer la Sécurité
Authentification PAM
Par défaut, GateOne ne gère pas d’authentification, ce qui n’est pas forcément un problème puisque la zone d’admin dans lequel il vient d’être placée s’en charge. Par contre, tous les utilisateurs de GateOne sont alors indifférenciés ce qui peut poser problème. Si l’on souhaite activer par exemple le pam, il faut modifier dans le fichier /opt/gateone/server.conf
les lignes suivantes :
1 2 3 | pam_service = "login" auth = "pam" pam_realm = "mon message accueil" |
Le problème est que cette authentification percute celle gérée par nginx. On ne peut utiliser les deux à la fois. Un contournement peut consister à utiliser un certificat SSL client pour l’authentification auprès de Nginx.
Ne pas utiliser GateOne en root
Il s’agit du fonctionnement par défaut de GateOne, ce qui n’est pas très sécurisé. On y remédie en créant un utilisateur gateone avec un gid/uid spécifique, par exemple 120 :
1 | root@server:~# useradd gateone -u 120 -U -M -r -s /usr/sbin/nologin |
Et en changeant les paramètres suivants dans la configuration de GateOne :
1 2 | uid="120" gid="120" |
Timeout des Sessions
1 | session_timeout = "10m" |
Les sessions d’un utilisateur peuvent être reprises depuis un autre navigateur sur un autre PC. C’est une fonction sympathique, mais qui présente de gros problèmes de sécurité si par exemple l’accès à GateOne est compromis. Dans tous les cas, un timeout de 5 jours par défaut, c’est trop !
GateOne et Reverse Proxy sur deux serveurs différents
La configuration présentée suppose que GateOne est herbergé sur le même serveur que le Nginx en reverse proxy. Si ce n’est pas le cas, il est impératif de réactiver le SSL sur GateOne et d’adapter sous nginx la directive proxy_pass en conséquence.
1 2 3 | disable_ssl = False certificate = "certificate.pem" ca_certs = "/quelque/part/sur/le/serveur/ca_cert.crt" |
Pour Conclure
Dans tous les cas, GateOne est un outil très puissant et bien pratique, vive le html 5 ! N’hésitez pas à l’utiliser, mais soyez bien prudents, toute configuration mal maîtrisée ne pourra que poser de gros problèmes de sécurité.