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.comvers l’IP du proxy. - Port 443 (HTTPS/ALPN) ouvert en entrée sur le proxy.
- CLIs
tshettctlinstallées sur la station de travail. - Fournisseur d’identité (GitHub, Okta, Azure AD ou Google Workspace) pour SSO — optionnel en laboratoire.
Architecture de Teleport
| Composant | Rôle |
|---|---|
| Auth Service | Autorité de certification. Émet des certs TLS/SSH de courte durée, stocke les journaux d’audit. |
| Proxy Service | Proxy HTTPS/SSH public. Gère les logins tsh, l’interface web et le multiplexage ALPN sur le port 443. |
| SSH Node Agent | Daemon teleport sur chaque serveur, enregistre les sessions avec l’Auth Service. |
| Access Agents | Daemons 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é | Teleport | HashiCorp Boundary | StrongDM | Bastion Host | Tailscale SSH | OpenSSH |
|---|---|---|---|---|---|---|
| Authentification | Certs courte durée | Credentials dynamiques | Injection de credentials | Clés statiques | WireGuard + certs | Clés statiques |
| SSO/IdP | Oui (SAML/OIDC/GitHub) | Oui | Oui | Manuel | OIDC | Non |
| Enregistrement sessions | Complet (SSH+DB+K8s) | Non | Oui | Non | Non | Non |
| Accès DB | Oui (protocole natif) | Oui | Oui | Tunnel seulement | Non | Non |
| Kubernetes | Oui (RBAC) | Partiel | Oui | Non | Non | Non |
| Access Requests | Oui (intégré) | Non | Non | Non | Non | Non |
| Open source | Oui (Apache 2.0) | Oui (MPL 2.0) | Non (SaaS) | N/A | Partiel | Oui |
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ème | Solution |
|---|---|
Boucle de redirection dans tsh login | Vérifier que redirect_url du connecteur SSO correspond exactement à l’adresse publique du proxy |
Nœuds n’apparaissent pas dans tsh ls | Vé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ée | Confirmer que db_service tourne ; vérifier le pare-feu entre l’agent et l’hôte DB |
| kubectl exec interdit | Ajouter le verbe exec au bloc kubernetes_resources du rôle |
| Session non enregistrée | Vé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.