Installer un bastion Teleport sur sa Freebox

En ces temps (confinés) de fêtes, j’ai pu prendre le temps de m’extraire de mon métier chronophage pour m’amuser un peu à la maison. Comme c’est Noël, je vous fais le cadeau de partager mon expérience, comme ça Xavier Niel vous revendra ce service dans quelques mois (comme on est en France, je précise pour protéger mon éditeur que c’est de l’humour ni blanc, ni noir).

J’ai choisi l’abonnement Free avec la freebox delta. Un peu cher mais qui permet finalement d’avoir un réseau 10Gb/s à la maison sans se ruiner. A part cela et le NAS intégré, la Delta restait un système relativement basique jusqu’au moment où les développeurs de Free ont eu la bonne idée d’implémenter le service KVM. Il permet de faire tourner des machines virtuelles… sur la box. L’idée est alors d’aller plus loin dans les services proposer par une box et par exemple mettre en place un vpn moderne (dans un prochain article) ainsi qu’un bastion (ou jumpbox). Un bastion va permettre de nous connecter au serveurs de notre réseau privé sans avoir à ouvrir un port sur l’extérieur, avec une double authentification. J’ai choisi ici de tester un bastion avec Teleport. Je vous laisse découvrir ces avantages avec Kubernetes, les Web Applications ou les Databases… je vais faire simple et rester sur du SSH over https.

Créer une VM sur la Freebox

Je préfère utiliser les images éditeurs des serveurs, comme à mon habitude j’utilise fedora. N’oubliez pas que sur une Freebox c’est une architecture 64bits ARM : aarch64. L’image standard (.iso) de fedora server est disponible ici. On se connecte à l’interface d’administration de la freebox, on choisit « VMs » et ensuite créer une VM « en sélectionnant une image ISO pour l’installation puis créer un disque virtuel » :

Bon 2048Mo de RAM c’est beaucoup pour un bastion en ARM, à vous de doser. Personnellement, j’ai remplacé la barrette RAM de 4Go de la Freebox par une de 8Go, donc je suis large. Vous pouvez également utiliser un seul vCPU. A partir de là rien de très compliqué, vous installez le système, soit en ligne de commande, soit via VNC en interface graphique. Le serveur redémarre et obtient ses IPs (IPv4 et IPv6)

Installer Teleport sur le serveur

Maintenant qu’on a l’IP, on se connecte en SSH (ou en mode console supporté par la Freebox). On va soit cloner le git de Teleport, soit télécharger le .rpm :

curl https://get.gravitational.com/teleport-v5.0.2-linux-arm64-bin.tar.gz -o teleport-v5.0.2-linux-arm64-bin.tar.gz
tar xzf teleport-v5.0.2-linux-arm64-bin.tar.gz
cd teleport/
./install
which teleport

Le binaire se trouve dans /usr/local/bin/teleport. Si vous voulez ou pouvez configurer le systemd, il faut copier le fichier .service qui va bien se trouvant dans examples/systemd/ du répertoire teleport d’origine. La configuration de teleport se place à la racine du répertoire /etc, par exemple pour une configuration de base :

cat > teleport.yaml <<EOF
  teleport:
      data_dir: /var/lib/teleport
  auth_service:
      enabled: true
      cluster_name: "bastion"
      listen_addr: 0.0.0.0:3025
      tokens:
      - proxy,node,app:f7adb7ccdf04037bcd2b52ec6010fd6f0caec94ba190b765
  ssh_service:
      enabled: true
      labels:
          env: dev
  app_service:
      enabled: true
      debug_app: true
  proxy_service:
      enabled: true
      listen_addr: 0.0.0.0:3023
      web_listen_addr: 0.0.0.0:3080
      tunnel_listen_addr: 0.0.0.0:3024
  EOF

Il faudra penser à ouvrir les ports 3025 vers votre réseau privé interne (pour les serveurs qui se connecteront) et 3080 vers le WAN (et également ouvrir ce port sur le firewall freebox). Maintenant que tout est OK, on peut démarrer le service :

systemctl enable --now teleport
systemctl start teleport

Si vous voulez profiter d’un certificat Let’s Encrypt, ajoutez un champ A ou CNAME dans votre zone DNS qui pointe vers votre IP ou domaine, téléchargez certbot et créez le certificat (que vous trouverez dans /etc/letsencrypt/live) avec la commande :

sudo certbot certonly --standalone -d <domain.tld> -n --agree-tos --email=<email>

Dans ce cas il faudra modifier la configuration de teleport dans /etc/teleport.yaml en y ajoutant le chemin du certificat et de sa clé :

proxy_service:
     enabled: true
     listen_addr: 0.0.0.0:3023
     web_listen_addr: 0.0.0.0:3080
     tunnel_listen_addr: 0.0.0.0:3024
     https_cert_file: /etc/letsencrypt/live/<domain.tld>/fullchain.pem
     https_key_file: /etc/letsencrypt/live/<domain.tld>/privkey.pem

Et relancer le service.

S’authentifier et ajouter des nodes

Maintenant il faut pouvoir s’authentifier sur le serveur web du bastion, pour cela on créé un user à qui l’on fait correspondre des users system, par ex pour le user teleport-admin qui se connectera sur le bastion :

tctl users add teleport-admin root,matt,pi,azureuser

Ensuite rdv sur la page web de votre bastion afin de renseigner votre mot de passe et créer la connexion au système de double authentification (par Google ou clé usb : YubiKey…)

Pour ajouter des serveurs, on a le choix, soit on passe par OpenSSL dans ce cas il suffit de renseigner dans l’interface de teleport l’adresse du serveur (user@domain.tld), soit on installe l’agent sur le serveur. Pour ce dernier cas de figure, on va utiliser la cli de teleport sur le serveur bastion pour générer un token :

tctl nodes add

Sur le node client, installer l’agent teleport (cf ci-dessus). Par contre la config change, dans /etc/teleport.yaml :

teleport:
   nodename: <internal.domain.tld>
   data_dir: /var/lib/teleport
   auth_token: <à renseigner avec le résultat de la commande tctl nodes add ci-dessus>
   auth_servers:
     - <ip du serveur teleport>:3025
   log:
   output: stderr
   severity: INFO
   ca_pin: <à renseigner avec le résultat de la commande tctl nodes add ci-dessus>
 auth_service:
   enabled: no
 ssh_service:
   enabled: yes
 proxy_service:
   enabled: no

Faites un enable et un start du service teleport sur le node et le tour est joué…

Maintenant vous pouvez joindre tous vos serveurs LAN depuis l’extérieu en https sans avoir à ouvrir SSH.

Ajouter des web apps sur le proxy Teleport

Il peut être utile de pouvoir accéder à des applications/outils internes sans pour autant avoir à ouvrir les systèmes sur l’Internet. Teleport permet de faire proxy entre l’appli interne et l’extérieur. Il faudra pour cela que votre DNS pointe vers un sous domaine du domaine proxy teleport (bastion), par ex: jira.bastion.domain.tld. Il faudra également faire pointer la configuration de teleport vers le bon certificat, pour les plus fainéants un wildcard sur *.bastion.domain.tld mais ce n’est pas top niveau sécu. Voici un exemple de configuration pour une app dans le /etc/teleport.yaml :

app_service:
     enabled: true
     debug_app: true
     apps:
       - name: "git"
         uri: "https://10.10.1.43:4443"
         insecure_skip_verify: true # en interne on peut utiliser des certificats auto-signés
         labels:
           env: "production"

Il faut indiquer le chemin vers les certificats de cette façon :

proxy_service:
     enabled: true
     listen_addr: 0.0.0.0:3023
     web_listen_addr: 0.0.0.0:3080
     tunnel_listen_addr: 0.0.0.0:3024
     public_addr: bastion.domain.tld:3080
     https_keypairs:
     - cert_file: /etc/letsencrypt/live/bastion.domain.tld/fullchain.pem
       key_file: /etc/letsencrypt/live/bastion.domain.tld/privkey.pem
     - key_file: /etc/letsencrypt/live/bastion.domain.tld-0001/privkey.pem
       cert_file: /etc/letsencrypt/live/bastion.domain.tld-0001/fullchain.pem

Les applications sont alors disponibles dans l’onglet « Applications » de l’interface de Teleport.

Pour info, il peut être judicieux de customiser la configuration dans la section teleport: du fichier :

teleport:
...
     ca_signature_algo: "rsa-sha2-512"
     ciphers:
       - aes128-ctr
       - aes192-ctr
       - aes256-ctr
       - aes128-gcm@openssh.com
       - chacha20-poly1305@openssh.com
     kex_algos:
       - curve25519-sha256@libssh.org
       - ecdh-sha2-nistp256
       - ecdh-sha2-nistp384
       - ecdh-sha2-nistp521
     mac_algos:
       - hmac-sha2-256-etm@openssh.com
       - hmac-sha2-256
     ciphersuites:
        - tls-ecdhe-rsa-with-aes-128-gcm-sha256
        - tls-ecdhe-ecdsa-with-aes-128-gcm-sha256
        - tls-ecdhe-rsa-with-aes-256-gcm-sha384
        - tls-ecdhe-ecdsa-with-aes-256-gcm-sha384
        - tls-ecdhe-rsa-with-chacha20-poly1305
        - tls-ecdhe-ecdsa-with-chacha20-poly1305

Cette solution Teleport peut être installée sur le Cloud AWS ou Azure, au besoin; tout peut être automatisé via Terraform et/ou Ansible, cela évitera de donner un rein en mettant en place un service bastion d’Azure…

@+

Laisser un commentaire

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

− 3 = 6

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.