
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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
Prérequis
Section intitulée « Prérequis »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.
L'architecture en trois composants
Section intitulée « L'architecture en trois composants »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).
Déployer un cluster Teleport en conteneur
Section intitulée « Déployer un cluster Teleport en conteneur »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.
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/teleportversion: v3teleport: nodename: teleport data_dir: /var/lib/teleportauth_service: enabled: "yes" listen_addr: 0.0.0.0:3025 cluster_name: teleport.labproxy_service: enabled: "yes" web_listen_addr: 0.0.0.0:3080ssh_service: enabled: "yes" labels: env: labOn démarre le cluster et on vérifie son état avec tctl status :
docker compose up -ddocker compose exec teleport tctl statusCluster: teleport.labVersion: 18.9.1CA pins: sha256:134c994efe3f7fb0fb181082a54c3b92699a79b4eec37388adc60e86c4c2e82cLe 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.
Créer le premier administrateur
Section intitulée « Créer le premier administrateur »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 :
docker compose exec teleport tctl users add admin --roles=access,editor --logins=rootUser "admin" has been created but requires a password. Share this URL with the userto complete user setup, link is valid for 1h:https://teleport:3080/web/invite/6de5c52684b3cecd7da679142b0eff25L'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.
Enrôler un node
Section intitulée « Enrôler un node »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.
-
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 -
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 -
Vérifier que le node a rejoint le cluster :
Fenêtre de terminal docker compose exec teleport tctl nodes lsHost Public Address Labels Versionnode1 172.22.0.3:3022 env=demo 18.9.1teleport 127.0.0.1:3022 env=lab 18.9.1
Se connecter en SSH avec tsh
Section intitulée « Se connecter en SSH avec tsh »Le client tsh récupère un certificat court après authentification, puis ouvre les sessions :
tsh login --proxy=teleport.example.com:443 --user=admintsh ls # nodes accessibles, filtrés par RBAC + labelstsh ssh root@node1 # session SSH (le login doit être autorisé)tsh status # certificats actifs et TTL restantLa 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.
Contrôler l'accès avec le RBAC
Section intitulée « Contrôler l'accès avec le RBAC »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: roleversion: v8metadata: name: dev-stagingspec: allow: logins: [root] node_labels: env: [demo] deny: {}docker compose exec teleport tctl create -f dev-staging.yamlrole "dev-staging" has been createdUn 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.
Accorder un accès just-in-time
Section intitulée « Accorder un accès just-in-time »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.
# L'utilisateur demande le rôle dbatsh request create --roles=dba --reason="incident #4521"
# L'admin approuve (Community Edition : via tctl)tctl request lstctl 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.
Renforcer avec MFA et SSO
Section intitulée « Renforcer avec MFA et SSO »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: githubversion: v3metadata: name: githubspec: 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]Accès machine-to-machine avec Machine ID
Section intitulée « Accès machine-to-machine avec Machine ID »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.
tbot start -c tbot.yaml # renouvelle les certificats (par défaut toutes les 20 min)Enregistrer et auditer les sessions
Section intitulée « Enregistrer et auditer les sessions »Teleport capture intégralement les sessions interactives et les rend rejouables, en plus d'un audit log structuré.
tsh recordings ls # lister les sessions enregistréestsh play <session-id> # rejouer une session SSHChaque é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.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause probable | Solution |
|---|---|---|
certificate not yet valid | horloge décalée entre node et Auth | activer NTP (chronyd/timedatectl) partout |
| Le node ne joint pas via le proxy | certificat auto-signé / public_addr absente | vrai domaine + TLS, ou join direct Auth :3025 en lab |
tsh casse après upgrade | client trop récent face au serveur | le client doit rester au plus une majeure sous l'Auth |
| Passkeys refusées | origine TLS non valide | un vrai certificat est requis pour WebAuthn |
| Disque qui se remplit | enregistrements de session accumulés | stockage objet + rétention en production |
À retenir
Section intitulée « À retenir »- 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.
FAQ : questions fréquentes sur Teleport
Section intitulée « FAQ : questions fréquentes sur Teleport »Une plateforme d'accès centrée sur l'identité
Teleport est une Identity-Aware Access Platform : un proxy d'accès unique qui place l'identité au coeur de chaque connexion à l'infrastructure.Il remplace à lui seul plusieurs outils :| Remplace | Par |
|---|---|
| Bastions SSH | Un proxy unifié avec audit |
| Clés SSH statiques | Des certificats courts (quelques heures) |
| VPN d'accès | Un accès par ressource, pas par réseau |
| Comptes partagés | Une identité SSO + MFA par personne |
Les ressources accessibles
- SSH (serveurs Linux)
- Kubernetes (API server)
- Bases de données (PostgreSQL, MySQL, MongoDB...)
- Applications web internes
- Bureaux Windows (RDP)
Le problème des clés SSH permanentes
Une clé publique dans~/.ssh/authorized_keys est un secret permanent :- Si elle fuite, l'accès reste valide indéfiniment.
- La révocation est manuelle, serveur par serveur.
- Aucun lien avec une identité forte ni un second facteur.
Le modèle par certificats courts
À la connexion, l'utilisateur s'authentifie (SSO + MFA), puis l'Auth Service émet un certificat SSH valable typiquement quelques heures (TTL configurable).| Aspect | Clé SSH permanente | Certificat Teleport |
|---|---|---|
| Durée de vie | Illimitée | Quelques heures |
| Lié à une identité | Non | Oui (SSO + MFA) |
| Révocation | Manuelle, par serveur | Centralisée, immédiate |
authorized_keys |
À gérer | Inexistant |
Le reverse tunnel
Les agents Teleport (le binaireteleport sur chaque ressource) n'ouvrent aucun port entrant. Ils initient une connexion sortante vers le Proxy Service et maintiennent un tunnel inverse.Client ──► Proxy (443/3080) ◄── reverse tunnel ── Node (derrière NAT)
Conséquences
- Les nodes peuvent être derrière un NAT, un pare-feu strict, sans IP publique.
- La surface d'exposition se limite au Proxy (un seul point d'entrée).
- Avec le TLS routing, tout passe sur un seul port (443).
Piège fréquent
Lors dujoin d'un node, --auth-server doit pointer vers le Proxy (port 3080/443), pas vers l'Auth directement. Une mauvaise public_addr donne un node qui affiche une adresse injoignable.Deux couches différentes, complémentaires
Tailscale et Teleport ne sont pas des concurrents directs : ils répondent à des besoins distincts.| Critère | Tailscale | Teleport |
|---|---|---|
| Nature | VPN mesh WireGuard | Plateforme d'accès identité |
| Couche | Réseau (connectivité) | Accès / identité / resource |
| Contrôle | ACL par IP / tag | RBAC fin par identité + label |
| Audit | Basique | Session recording + audit complet |
| Accès JIT | Non | Oui (Access Requests) |
| Multi-protocole | Réseau brut | SSH, K8s, bases, web, RDP |
| Simplicité | Très simple | Plus riche, plus complexe |
Comment choisir
- Tailscale : connecter simplement des machines dispersées, homelab, accès réseau.
- Teleport : environnements à fortes exigences de conformité (SOC2, ISO 27001, PCI-DSS), audit par identité, accès granulaire.
Contrôle d'accès par rôle
Le RBAC de Teleport décrit qui peut accéder à quoi via des rôles (resource YAML). Le modèle est deny-by-default.kind: role
version: v8
metadata:
name: developer
spec:
allow:
logins: [ubuntu] # principals OS autorises
node_labels:
env: staging # uniquement les nodes labellises env=staging
deny: {}
Les briques
| Élément | Rôle |
|---|---|
| logins | Les comptes OS que l'utilisateur peut emprunter |
| node_labels | Les nodes accessibles, par label |
| rules | Les permissions sur les resources Teleport |
Élévation temporaire de privilèges
Les Access Requests implémentent l'accès just-in-time : au lieu d'accorder un rôle administrateur en permanence, on l'accorde temporairement, sur justification auditée.# L'utilisateur demande le role dba
tsh request create --roles=dba --reason="incident #4521"
# Cote admin (Community Edition) : approbation via tctl
tctl request ls
tctl request approve <request-id>
Points clés
- L'accès est additif et limité dans le temps.
- Chaque demande est auditée (qui, quel rôle, quelle raison).
- En Community Edition, l'approbation passe par
tctl(un admin). - Le workflow de revue self-service (
review_requests) est une fonction Enterprise.
Ce que couvre la Community Edition
La Community Edition (CE), open source et self-hosted, inclut largement de quoi sécuriser des accès :- Accès SSH, Kubernetes, bases de données, applications, RDP
- RBAC complet
- Session recording et audit log
- MFA (OTP, WebAuthn/passkeys)
- SSO GitHub
Les limites (réservé à Enterprise)
| Fonction | CE | Enterprise |
|---|---|---|
| SSO GitHub | Oui | Oui |
| SSO OIDC / SAML | Non | Oui |
Access Requests via tctl |
Oui | Oui |
| Workflow de revue des demandes | Non | Oui |
| Device Trust avancé, Access Lists | Non | Oui |
Enregistrement et rejeu des sessions
Teleport capture intégralement les sessions interactives et permet de les rejouer :tsh recordings ls # lister les sessions enregistrees
tsh play <session-id> # rejouer une session SSH
L'audit log
Chaque événement (login, exécution de commande, transfert de fichier, access request) est attribué à une identité, pas à une simple adresse IP : qui, quoi, quand, depuis quel appareil.Les modes de recording
| Mode | Où | Caractéristique |
|---|---|---|
node / node-sync |
Sur le node | -sync = streaming temps réel vers l'Auth |
proxy / proxy-sync |
Sur le proxy | Utile si l'agent ne peut pas écrire |