TL;DR — Résumé Rapide

Guide complet de Gravitational Teleport pour SSH sécurisé, Kubernetes, bases de données et apps. Certificats, SSO, RBAC, journaux d'audit et Access Requests.

Teleport de Gravitational est une plateforme open-source d’accès à l’infrastructure qui remplace les clés SSH statiques, les VPN et les jump hosts par des certificats de courte durée, SSO et une piste d’audit complète. Ce guide couvre chaque couche : architecture, installation, inscription des nœuds, RBAC, SSH, bases de données, Kubernetes et accès aux applications.

Prérequis

  • Serveur Linux (Ubuntu 22.04+ ou RHEL 8+) avec un FQDN public pour le Proxy Service.
  • Enregistrement DNS A pointant teleport.exemple.com vers l’IP du proxy.
  • Port 443 (HTTPS/ALPN) ouvert en entrée sur le proxy.
  • CLIs tsh et tctl installées sur la station de travail.
  • Fournisseur d’identité (GitHub, Okta, Azure AD ou Google Workspace) pour SSO — optionnel en laboratoire.

Architecture de Teleport

ComposantRôle
Auth ServiceAutorité de certification. Émet des certs TLS/SSH de courte durée, stocke les journaux d’audit.
Proxy ServiceProxy HTTPS/SSH public. Gère les logins tsh, l’interface web et le multiplexage ALPN sur le port 443.
SSH Node AgentDaemon teleport sur chaque serveur, enregistre les sessions avec l’Auth Service.
Access AgentsDaemons spécialisés : db_service, kube_service, app_service, windows_desktop_service.

L’authentification par certificats remplace les clés SSH. Quand un utilisateur se connecte avec tsh, l’Auth Service émet un certificat SSH valide pour max_session_ttl (typiquement 8–12 heures). Aucune clé privée de longue durée n’est distribuée ou renouvelée.


Installation

Auto-hébergé : apt/yum

# Ubuntu/Debian
curl https://goteleport.com/static/install.sh | bash -s 15.0.0
apt-get install teleport

# RHEL/Rocky Linux
yum install teleport

Kubernetes (Helm)

helm repo add teleport https://charts.releases.teleport.dev
helm install teleport-cluster teleport/teleport-cluster \
  --namespace teleport --create-namespace \
  --set clusterName=teleport.exemple.com \
  --set acme=true \
  --set acmeEmail=admin@exemple.com

Teleport Cloud

Service managé Proxy+Auth. Seuls les agents (SSH, DB, Kube) sont déployés dans l’infrastructure propre et connectés au tenant cloud sur votreentreprise.teleport.sh.


Configuration Initiale et TLS avec ACME

teleport configure \
  --cluster-name=teleport.exemple.com \
  --public-addr=teleport.exemple.com:443 \
  --acme \
  --acme-email=admin@exemple.com \
  -o /etc/teleport/teleport.yaml

systemctl enable --now teleport

# Créer le premier utilisateur administrateur
tctl users add admin --roles=editor,access --logins=root,ubuntu

Ajout de Nœuds

Jonction par Token

# Créer un token de courte durée sur l'auth server
tctl tokens add --type=node --ttl=5m

# Sur le nouveau serveur
teleport start \
  --roles=node \
  --token=<token> \
  --auth-server=teleport.exemple.com:443

Jonction EC2/IAM (AWS — Sans Token)

Teleport vérifie le document d’identité d’instance AWS. Aucun token statique n’est nécessaire. Le même mécanisme existe pour Azure Managed Identity et GCP Instance Identity.


Authentification : SSO et MFA

Connecteur GitHub

kind: github
version: v3
metadata:
  name: github
spec:
  client_id: "ID_APP_OAUTH_GITHUB"
  client_secret: "SECRET_APP_OAUTH_GITHUB"
  redirect_url: "https://teleport.exemple.com/v1/webapi/github/callback"
  teams_to_roles:
    - organization: mon-org
      team: devops
      roles: ["devops"]

Forcer le MFA

kind: cluster_auth_preference
version: v2
metadata:
  name: cluster-auth-preference
spec:
  type: github
  second_factor: "on"
  webauthn:
    rp_id: "teleport.exemple.com"

second_factor: "on" accepte TOTP (Google Authenticator), WebAuthn (YubiKey, Touch ID) ou passkeys.


RBAC : Rôles et Étiquettes

kind: role
version: v7
metadata:
  name: devops
spec:
  options:
    max_session_ttl: "12h"
    record_session:
      default: "best_effort"
  allow:
    logins: ["ubuntu", "ec2-user"]
    node_labels:
      env: ["production", "staging"]
      team: ["devops"]
  deny:
    node_labels:
      restricted: ["true"]

Appliquer avec tctl create role.yaml. Le bloc request active les Access Requests — les développeurs peuvent demander un accès temporaire à la production avec une approbation.


Accès SSH avec tsh

# Connexion (ouvre le navigateur pour SSO + MFA)
tsh login --proxy=teleport.exemple.com

# Lister les nœuds accessibles
tsh ls

# Connexion à un nœud
tsh ssh ubuntu@serveur-web-01

# Transfert de fichiers
tsh scp ./deploy.sh ubuntu@serveur-web-01:/tmp/

# Redirection de port
tsh ssh -L 5432:localhost:5432 ubuntu@serveur-db

# Commande sur plusieurs nœuds
tsh ssh --labels env=staging "systemctl restart nginx"

L’enregistrement de session est automatique. Rejouer depuis l’interface web ou CLI :

tsh play <id-session>

Accès aux Bases de Données

tsh db login prod-postgres --db-user=appuser --db-name=madb
tsh db connect prod-postgres   # ouvre psql
tsh db connect prod-mysql      # ouvre mysql CLI
tsh db connect mongo-atlas --db-user=lecteur
tsh db connect redis-cache

Teleport agit comme un proxy avec reconnaissance de protocole — il comprend le protocole réseau natif de la base de données sans exposer ses ports.


Accès à Kubernetes

tsh kube ls
tsh kube login production
kubectl get pods -n default

Le YAML de rôle définit les ressources Kubernetes autorisées avec des verbes spécifiques (get, list, exec). L’usurpation d’identité applique les permissions de l’utilisateur Teleport au contexte Kubernetes.


Accès aux Applications

app_service:
  enabled: true
  apps:
    - name: grafana
      uri: http://grafana.interne:3000
      labels:
        env: production

Les utilisateurs accèdent à https://grafana.teleport.exemple.com. Teleport ajoute un en-tête JWT avec l’identité de l’utilisateur. SSO protège chaque app interne sans la modifier.


Journal d’Audit

# Consulter le journal d'audit
tctl audit events --event-type=session.start --format=json

# Plage de dates
tctl audit events \
  --from="2026-03-01" \
  --to="2026-03-23" \
  --event-type=db.session.query

Backends de stockage : S3 (avec Athena), GCS (avec BigQuery) ou DynamoDB.


Access Requests : Escalade de Privilèges Juste-à-Temps

# Demander le rôle production
tsh request create --roles=production-access \
  --reason="Investigation incident P1 #4821"

# Approuver
tsh request review --approve <id-demande>

# Refuser
tsh request review --deny <id-demande>

Teleport inclut des plugins pour Slack, PagerDuty, ServiceNow et Jira. Les approbations peuvent être effectuées directement depuis Slack.


Teleport vs Alternatives

FonctionnalitéTeleportHashiCorp BoundaryStrongDMBastion HostTailscale SSHOpenSSH
AuthentificationCerts courte duréeCredentials dynamiquesInjection de credentialsClés statiquesWireGuard + certsClés statiques
SSO/IdPOui (SAML/OIDC/GitHub)OuiOuiManuelOIDCNon
Enregistrement sessionsComplet (SSH+DB+K8s)NonOuiNonNonNon
Accès DBOui (protocole natif)OuiOuiTunnel seulementNonNon
KubernetesOui (RBAC)PartielOuiNonNonNon
Access RequestsOui (intégré)NonNonNonNonNon
Open sourceOui (Apache 2.0)Oui (MPL 2.0)Non (SaaS)N/APartielOui

Pièges et Cas Particuliers

  • La dérive d’horloge tue les certificats. Auth, Proxy et tous les nœuds nécessitent une synchronisation NTP dans ±30 secondes.
  • Le multiplexage ALPN nécessite le port 443. Diviser les ports casse certaines fonctionnalités de proxy à proxy.
  • Wildcard TLS pour l’accès aux apps. Les sous-domaines d’applications nécessitent un certificat wildcard ou un défi ACME par app.
  • EC2 IAM join nécessite IMDSv2. Vérifier que l’endpoint de métadonnées d’instance est accessible.
  • Usurpation d’identité Kubernetes. L’agent kube_service nécessite des permissions ClusterRole d’impersonate.

Résolution de Problèmes

ProblèmeSolution
Boucle de redirection dans tsh loginVérifier que redirect_url du connecteur SSO correspond exactement à l’adresse publique du proxy
Nœuds n’apparaissent pas dans tsh lsVérifier que l’agent atteint l’Auth sur le port 443 ; vérifier l’expiration du token de jonction
Connexion à la base de données refuséeConfirmer que db_service tourne ; vérifier le pare-feu entre l’agent et l’hôte DB
kubectl exec interditAjouter le verbe exec au bloc kubernetes_resources du rôle
Session non enregistréeVérifier la politique record_session ; vérifier les permissions du bucket S3 pour le rôle IAM de l’Auth Service

Résumé

  • Autorité de certification — remplace les clés SSH statiques par des certs qui expirent automatiquement.
  • SSO + MFA — GitHub, Okta, Azure AD, Google Workspace ; TOTP, WebAuthn, clés matérielles.
  • RBAC avec étiquettes de nœud — les rôles correspondent aux serveurs par étiquettes d’environnement/équipe.
  • Audit complet — chaque session enregistrée comme événements structurés + vidéo, stockés dans S3/GCS.
  • Bases de données et Kubernetes — proxy avec protocole natif sans exposer les ports ni distribuer les credentials.
  • Access Requests — escalade de privilèges juste-à-temps avec flux d’approbation Slack/PagerDuty.
  • Open source — Apache 2.0, auto-hébergeable ou managé via Teleport Cloud.

Articles Connexes