Skip to content

SSH via internet

Vincent Fortier edited this page Nov 29, 2019 · 1 revision

Dropbear SSH

La procédure qui suit permet dans un premier temps d'activer la connexion SSH sans mot de passe. Ensuite il nous est alors possible d'activer une seconde instance du service SSH sur le réseau WAN permettant l'accès uniquement avec échange de clés:

  • LAN: Accès normal, port par défaut (22)
  • WAN: Accès via échange de clés uniquement, port 666

Gestion des clés via root sur OpenWRT

Simuler le répertoire $HOME/.ssh dans le compte root et faire y pointer un fichier authorized_keys vers le répertoire de configuration dropbear. Ceci permet de copier aisément nos clés publiques par la suite:

root@openwrt:~# mkdir -m 0700 /root/.ssh
root@openwrt:~# ln -s /etc/dropbear/authorized_keys /root/.ssh/authorized_keys

Autoriser votre clé publique

Il est présumé ici que vous avez déjà créé votre trousseau de clé publique/privé dans votre compte personnel Linux. Sinon il s'agit d'en créer un via la commande usuelle:

whoami@localhost:~$ ssh-keygen -t rsa

À partir de votre compte Linux sur votre station de travail copier votre clé publique sur le routeur:

whoami@localhost:~$ ssh-copy-id [email protected]
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is SHA256:TkchSSjy4pLRzsS9c4C1TaNZIBU8L4j7lvptMEuJkmw.
Are you sure you want to continue connecting (yes/no)? yes
[email protected]'s password:
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

Il est aussi possible de copier notre clé publique manuellement (i.e. sans utiliser ssh-copy-id):

whoami@localhost:~$ cat ~/.ssh/id_rsa.pub | ssh [email protected] "cat >> /etc/dropbear/authorized_keys && chmod 0600 /etc/dropbear/authorized_keys && chmod 0700 /etc/dropbear"

Tester la connexion sans mot de passe:

whoami@localhost:~$ ssh [email protected]

Service SSH sur le réseau WAN

En premier lieu on ajoute un couche de sécurité au service existant en ne permettant les connexions qu'à partir du réseau LAN:

uci set dropbear.@dropbear[0].Interface='lan'

Ensuite on ajoute un second service SSH sur le réseau WAN sur le port de notre choix (tout sauf le port par défaut 22, dans mon cas le port 666).

uci add dropbear dropbear
uci set dropbear.@dropbear[-1].Interface='wan'
uci set dropbear.@dropbear[-1].Port='666'

Afin de rendre le service plus sécuritaire et de n'autoriser que les connexions par échange de clés, on désactive la demande de mot de passe pour tous les usagers:

uci set dropbear.@dropbear[-1].PasswordAuth='off'
uci set dropbear.@dropbear[-1].RootPasswordAuth='off'

On valide les changements et on met en place la nouvelle configuration:

uci show dropbear
uci changes dropbear
uci commit

Paramétrisation du pare-feu (firewall)

Ne reste plus qu'à ajouter une règle au pare-feu afin d'accepter les requêtes TCP en destination du port choisi:

uci add firewall rule
uci set firewall.@rule[-1].name='Allow SSH from WAN port 666'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].dest_port='666'
uci set firewall.@rule[-1].target='ACCEPT'
uci set firewall.@rule[-1].proto='tcp'
uci set firewall.@rule[-1].enabled='1'
uci changes firewall
uci commit

Référence: https://wiki.openwrt.org/doc/uci/firewall

Tests de démarrage

Afin de confirmer que tout est pleinement fonctionnel je recommande de redémarrer le routeur. Ceci permettra de valider que les deux démons SSH sont présents suivant un démarrage. Sinon on peut redémarrer les services manuellement tel que:

root@openwrt:~# /etc/init.d/firewall restart
root@openwrt:~# /etc/init.d/dropbear restart

Suivant le redémarrage il devrait y avoir au moins une instance SSH pour le LAN et une seconde pour le WAN:

root@openwrt:~# pidof dropbear
2516 2302 2301
root@openwrt:~# ps | grep dropbear
 1514 root      1148 S    /usr/sbin/dropbear -F -P /var/run/dropbear.1.pid -p 192.168.1.1:22 -p fd44:70b7:27d7::1:22 -K 300 -T 3
 1526 root      1212 R    grep dropbear
12378 root      1080 S    /usr/sbin/dropbear -F -P /var/run/dropbear.1.pid -p 192.168.1.1:22 -p fd44:70b7:27d7::1:22 -K 300 -T 3
12379 root      1080 S    /usr/sbin/dropbear -F -P /var/run/dropbear.2.pid -s -g -p <WAN> -K 300 -T 3

Il est important de noter qu'une instance du démon dropbear s'ajoute à chaque connexion donc vous aurez sans aucun doute plus de deux processus mais bien 2 pid maîtres (dropbear.X.pid).

Il est aussi possible de vérifier sur quel port chaque démon est à l'écoute via la commande "lsof -i -n -P" ou "ss -pt" (remplace netstat):

root@openwrt:~# lsof -i -n -P | grep dropbear
dropbear  2301   root    3u  inet   4099      0t0  TCP 192.168.1.1:22 (LISTEN)
dropbear  2302   root    3u  inet   4102      0t0  TCP <IP-WAN>:666 (LISTEN)
dropbear  2516   root    6u  inet   4372      0t0  TCP 192.168.1.1:22->192.168.80.37:48020 (ESTABLISHED)
dropbear  2516   root    7u  inet   4375      0t0  TCP 127.0.0.1:6010 (LISTEN)

Tests de connexion WAN

À cette étape il ne reste plus qu'à tester la connexion à distance sur le port WAN de diverses façons. Tout d'abord sans spécifier le port de communication:

whoami@localhost:~$ ssh <IP-WAN>
ssh: connect to host home.th0ma7.com port 22: Connection refused

En utilisant le bon port sans spécifier de nom d'utilisateur:

whoami@localhost:~$ ssh <IP-WAN> -p 666
Permission denied (publickey).

Sur le bon port avec l'utilisateur root:

whoami@localhost:~$ ssh root@<IP-WAN> -p 666
BusyBox v1.23.2 (2016-01-02 18:01:44 CET) built-in shell (ash)
  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 CHAOS CALMER (15.05.1, r48532)
 -----------------------------------------------------
  * 1 1/2 oz Gin            Shake with a glassful
  * 1/4 oz Triple Sec       of broken ice and pour
  * 3/4 oz Lime Juice       unstrained into a goblet.
  * 1 1/2 oz Orange Juice
  * 1 tsp. Grenadine Syrup
 -----------------------------------------------------
root@openwrt:~#

Trousseau de clés publique/privée root@openwrt

OPTIONEL

Il est possible de créer un trousseau de clés publique/privées pour le compte root sur le routeur Tout d<abord créer une clé ssh privée+publique via dropbear:

root@openwrt:~# dropbearkey -t rsa -f ~/.ssh/id_dropbear
Generating 2048 bit rsa key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCEn1FWEJvF1MamXSDoB82OKDFvVSAVjYdMpRQuXLhqVZR3y9zlQDhIuATe9OxkE81i7vBgFygD5QYJZ2HsauLTkQlGG9BDFLtxMPpNxM6y7XYazgWVssa+VZeUpaBPLkBz7lvD1y0qB92QlLcxQf6YIZfFT/Pjb3GuF7G3PLtG/09cM5Qh4D09bF/1vdPNFp1Ez6uk5UebfrTYoir3dFSx0E53gUIUicvYwUrP3t18znnKKqi/hh2Tq5YnCgYnJk9fSbcH6vEt/XSN2CZ3oaADm1uGT240ZPyWS+XPInmO3qbGyOQlUN45oNbINJNAMedTqfG/KRl4pHN8qSKKDxNR root@my-ap-wifi
Fingerprint: sha1!! 90:34:d7:63:b0:db:4c:1e:23:9f:77:c5:f5:13:b7:ca:b8:e2:9d:0b

Extraire la clé publique et la déposer dans un fichier:

root@openwrt:~# dropbearkey -y -f ~/.ssh/id_dropbear | grep "^ssh-rsa " >> .ssh/id_dropbear.pub