Aller au contenu
Sécurité medium

Teleport : accès zero-trust par certificats courts

12 min de lecture

Logo Teleport

Teleport est une plateforme d'accès basée sur l'identité qui remplace à elle seule les bastions SSH, les VPN d'accès et les clés SSH permanentes. Chaque connexion à un serveur, un cluster Kubernetes, une base de données ou une application passe par un proxy unique, est autorisée par un certificat à courte durée de vie (quelques heures), scopée par RBAC et entièrement auditée. Ce guide déploie un cluster Teleport 18.9.1 en conteneur, enrôle un node, configure le contrôle d'accès et montre l'enregistrement des sessions. Pour administrateurs et DevSecOps. Toutes les sorties proviennent d'un lab Docker réel.

  • Comprendre le modèle certificats courts plutôt que clés SSH permanentes
  • Déployer un cluster Teleport (Auth + Proxy) et enrôler un node
  • Donner un accès SSH scopé par RBAC et labels
  • Accorder un accès just-in-time (Access Requests) et activer la MFA
  • Enregistrer et rejouer les sessions pour l'audit

Docker et Docker Compose, un accès root sur la machine de lab. Pour un déploiement de production, prévoyez en plus un vrai domaine et un certificat TLS valide (Let's Encrypt). Le lab utilise un certificat auto-signé, suffisant pour apprendre.

Pourquoi des certificats courts plutôt que des clés SSH

Section intitulée « Pourquoi des certificats courts plutôt que des clés SSH »

Une clé publique dans ~/.ssh/authorized_keys est un secret permanent. Si elle fuite, l'accès reste valide indéfiniment, et la révocation doit se faire serveur par serveur. Rien ne relie cette clé à une identité forte ni à un second facteur. C'est le talon d'Achille de l'accès SSH traditionnel.

Teleport inverse le modèle. À la connexion, l'utilisateur s'authentifie via SSO et MFA, puis l'Auth Service émet un certificat SSH valable quelques heures. Le certificat expire seul : plus de rotation manuelle, plus de clé orpheline. La révocation est centralisée et immédiate, et chaque accès est attribué à une identité, pas à une adresse IP.

Teleport repose sur trois services, portés par le même binaire teleport.

  • L'Auth Service est le cerveau : il héberge les autorités de certification (CA SSH et CA TLS), applique le RBAC, signe les certificats et écrit l'audit log. C'est la seule source de vérité.
  • Le Proxy Service est le point d'entrée unique, exposé sur le port web (3080 ou 443). Il termine les connexions clientes et route vers les agents.
  • Les agents (nodes) tournent sur chaque ressource. Point clé pour la sécurité : un node derrière un NAT n'ouvre aucun port entrant, il établit un tunnel inverse sortant vers le Proxy. C'est ce qui rend Teleport sûr sans exposer les serveurs.

Trois binaires accompagnent ces services : tctl (administration locale sur l'Auth), tsh (client utilisateur) et tbot (Machine ID, pour l'accès machine).

On épingle la version 18.9.1 (image distroless officielle, registre public AWS ECR). La configuration minimale active l'Auth, le Proxy et le service SSH sur l'hôte.

docker-compose.yml
services:
teleport:
image: public.ecr.aws/gravitational/teleport-distroless:18.9.1
command: serve
restart: unless-stopped
volumes:
- ./config/teleport.yaml:/etc/teleport/teleport.yaml:ro
- ./data:/var/lib/teleport
config/teleport.yaml
version: v3
teleport:
nodename: teleport
data_dir: /var/lib/teleport
auth_service:
enabled: "yes"
listen_addr: 0.0.0.0:3025
cluster_name: teleport.lab
proxy_service:
enabled: "yes"
web_listen_addr: 0.0.0.0:3080
ssh_service:
enabled: "yes"
labels:
env: lab

On démarre le cluster et on vérifie son état avec tctl status :

Fenêtre de terminal
docker compose up -d
docker compose exec teleport tctl status
Cluster: teleport.lab
Version: 18.9.1
CA pins: sha256:134c994efe3f7fb0fb181082a54c3b92699a79b4eec37388adc60e86c4c2e82c

Le CA pin est l'empreinte de l'autorité de certification. Les nodes l'utilisent au moment du join pour vérifier qu'ils parlent au bon cluster, ce qui empêche une attaque de l'intermédiaire.

L'utilisateur admin reçoit les rôles intégrés editor (administration) et access (accès aux ressources), avec les logins OS qu'il pourra emprunter :

Fenêtre de terminal
docker compose exec teleport tctl users add admin --roles=access,editor --logins=root
User "admin" has been created but requires a password. Share this URL with the user
to complete user setup, link is valid for 1h:
https://teleport:3080/web/invite/6de5c52684b3cecd7da679142b0eff25

L'URL d'invitation sert à définir le mot de passe et enrôler un second facteur (OTP ou passkey) dans le navigateur. C'est la première manifestation du principe : aucun accès sans identité ni MFA.

Un node rejoint le cluster avec un token de join à durée limitée. On le génère côté Auth, puis on lance l'agent.

  1. Générer le token (valable 30 minutes) :

    Fenêtre de terminal
    docker compose exec teleport tctl tokens add --type=node --ttl=30m --format=text
  2. Lancer l'agent sur la machine à enrôler, en lui passant le token et l'adresse du cluster :

    Fenêtre de terminal
    teleport start --roles=node \
    --token=<token> \
    --auth-server=teleport:3025 \
    --nodename=node1 --labels=env=demo
  3. Vérifier que le node a rejoint le cluster :

    Fenêtre de terminal
    docker compose exec teleport tctl nodes ls
    Host Public Address Labels Version
    node1 172.22.0.3:3022 env=demo 18.9.1
    teleport 127.0.0.1:3022 env=lab 18.9.1

Le client tsh récupère un certificat court après authentification, puis ouvre les sessions :

Fenêtre de terminal
tsh login --proxy=teleport.example.com:443 --user=admin
tsh ls # nodes accessibles, filtrés par RBAC + labels
tsh ssh root@node1 # session SSH (le login doit être autorisé)
tsh status # certificats actifs et TTL restant

La connexion exige un login interactif (SSO ou mot de passe plus MFA via le navigateur). Pour un accès non interactif (CI, services), on ne réutilise pas un certificat humain : on emploie Machine ID (tbot), décrit plus bas.

Le RBAC de Teleport est deny-by-default : sans règle explicite, aucun accès. Un rôle déclare les logins OS autorisés et les labels des nodes joignables.

kind: role
version: v8
metadata:
name: dev-staging
spec:
allow:
logins: [root]
node_labels:
env: [demo]
deny: {}
Fenêtre de terminal
docker compose exec teleport tctl create -f dev-staging.yaml
role "dev-staging" has been created

Un porteur de ce rôle ne voit que les nodes labellisés env=demo et ne peut s'y connecter qu'en root. Les règles deny sont évaluées en premier et l'emportent toujours, ce qui rend le modèle prévisible.

Plutôt que de donner un rôle puissant en permanence, les Access Requests l'accordent temporairement, sur justification auditée. C'est le moindre privilège appliqué dans le temps.

Fenêtre de terminal
# L'utilisateur demande le rôle dba
tsh request create --roles=dba --reason="incident #4521"
# L'admin approuve (Community Edition : via tctl)
tctl request ls
tctl request approve <request-id>

L'accès devient additif et limité dans le temps. En Community Edition, l'approbation passe par tctl ; le workflow de revue self-service est une fonction Enterprise.

La MFA s'exige au login, mais aussi par session (require_session_mfa: true dans un rôle) : même si un certificat sur disque est volé, l'ouverture d'une session redemande une vérification. Côté identité, la Community Edition prend en charge le SSO GitHub ; OIDC et SAML relèvent de l'édition Enterprise.

kind: github
version: v3
metadata:
name: github
spec:
client_id: <id>
client_secret: <secret>
redirect_url: https://teleport.example.com:443/v1/webapi/github/callback
teams_to_roles:
- organization: mon-org
team: devops
roles: [access, editor]

Pour qu'un pipeline CI/CD ou un service accède à l'infrastructure sans secret longue durée, tbot émet et renouvelle automatiquement des certificats courts. Les machines bénéficient ainsi de la même sécurité que les humains.

Fenêtre de terminal
tbot start -c tbot.yaml # renouvelle les certificats (par défaut toutes les 20 min)

Teleport capture intégralement les sessions interactives et les rend rejouables, en plus d'un audit log structuré.

Fenêtre de terminal
tsh recordings ls # lister les sessions enregistrées
tsh play <session-id> # rejouer une session SSH

Chaque événement (login, commande, transfert de fichier, demande d'accès) est attribué à une identité. En production, les enregistrements partent sur un stockage objet avec une politique de rétention. C'est précisément ce que réclament SOC 2, ISO 27001 et PCI-DSS.

Teleport ou Tailscale : deux couches complémentaires

Section intitulée « Teleport ou Tailscale : deux couches complémentaires »

La question revient souvent. Tailscale est un VPN mesh WireGuard : il fournit de la connectivité réseau avec des ACL par IP. Teleport est une plateforme d'accès par identité : RBAC fin, accès just-in-time, session recording, audit multi-protocole. Ils n'opèrent pas à la même couche et se combinent très bien : Tailscale pour relier les machines, Teleport pour l'accès audité aux ressources sensibles. Pour le détail du mesh, voir le guide Tailscale : VPN mesh WireGuard.

SymptômeCause probableSolution
certificate not yet validhorloge décalée entre node et Authactiver NTP (chronyd/timedatectl) partout
Le node ne joint pas via le proxycertificat auto-signé / public_addr absentevrai domaine + TLS, ou join direct Auth :3025 en lab
tsh casse après upgradeclient trop récent face au serveurle client doit rester au plus une majeure sous l'Auth
Passkeys refuséesorigine TLS non valideun vrai certificat est requis pour WebAuthn
Disque qui se remplitenregistrements de session accumulésstockage objet + rétention en production
  • Teleport est une plateforme d'accès par identité : un proxy unique pour SSH, Kubernetes, bases et applications, avec audit.
  • Les certificats courts remplacent les clés SSH permanentes : expiration automatique, révocation centralisée, accès lié à une identité.
  • Les nodes rejoignent par tunnel inverse, sans port entrant ; le CA pin sécurise le join.
  • Le RBAC est deny-by-default (logins plus labels) ; les Access Requests donnent un accès just-in-time.
  • MFA au login et par session, SSO GitHub en Community, OIDC/SAML en Enterprise.
  • Session recording et audit attribués par identité, alignés SOC 2 / ISO 27001 / PCI-DSS.
  • Épingler la version (18.9.1) : une majeure par an, support 24 mois, v17 en fin de vie en août 2026.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn