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…
@+
vous n’avez pas précisé dans quel dossier on doit copier le fichier .service se trouvant dans /teleport/examples/systemd