Passer au contenu principal

GoTeleport

GoTeleport - Behind Nginx

💡
Ce guide donne un exemple de configuration dans une architecture où vous placez un reverse proxy Nginx devant votre cluster Teleport.

🔧 Pré-requis

Dans ce scénario, Teleport est déployé sur un cluster Kubernetes exposant ses services via un Ingress Controller, un peu comme décrit ici .

Cela devrait toutefois fonctionner même si déployer Teleport sur un serveur Linux en standalone.

Peu importe la configuration, ce scénario implique que vous ayez activer le mode multiplex comme décrit dans cet article.

TLS Routing Migration | Teleport
How to upgrade an existing Teleport cluster to single-port TLS routing mode

Pour résumé :

  • Vous avez déployé Teleport dans un réseau non exposé, avec ou sans certificat valide.
  • Vous disposez d'un reverse proxy Nginx routant le traffic de l'extérieur vers Teleport.
  • Les services Teleport ne sont jamais exposé directement.
Exemple avec un cluster Kubernetes

⛴️ Kubernetes

Un exemple de déploiement sur Kubernetes avec un Helm Chart.

acme: false
chartMode: standalone
clusterName: teleport.example.com
enterprise: true
# enterpriseImage: public.ecr.aws/gravitational/teleport-ent-distroless

annotations:
  ingress:
    # cert-manager.io/cluster-issuer: letsencrypt-prod
    # Le backend est en HTTPS, exemple ici avec Traefik, si vous utilisez Nginx c'est plutôt : 
    # nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    traefik.ingress.kubernetes.io/service.serversscheme: https
    traefik.ingress.kubernetes.io/service.serverstransport: "teleport-transport"
    traefik.ingress.kubernetes.io/service.passhostheader: "true"
ingress:
  enabled: true
  spec:
    ingressClassName: traefik
  suppressAutomaticWildcards: false
  useExisting: false
operator:
  enabled: true
persistence:
  enabled: true
  volumeSize: 20Gi
  storageClassName: nfs-csi
proxyListenerMode: multiplex
service:
  type: ClusterIP
# On désactive TLS ici, pas besoin, c'est Nginx qui gère
# tls:  
  # existingCASecretName: ''
  # existingSecretName: 'teleport-tls'
validateConfigOnDeploy: true

⚙️ Nginx

Vous devrez ensuite créer un vhost sur votre nginx. Voici un exemple de configuration :

map $http_upgrade $connection_upgrade {
default Upgrade;
''      close;
}

server {
        listen       0.0.0.0:443 ssl;
        server_name  teleport.example.com;
        ssl_certificate /etc/letsencrypt/live/teleport.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/teleport.example.com/privkey.pem;


        location ~ /\.well-known{
                root /srv/www/htdocs;
                allow all;
        }
        location ~ /\. { deny all; access_log off; log_not_found off; }
        location / {

                # WebSocket Support
                proxy_set_header        Upgrade $http_upgrade;
                proxy_set_header        Connection "upgrade";

                # Host and X headers
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto $scheme;

                # Connectivity Options
                proxy_http_version      1.1;
                proxy_read_timeout      1800s;
                proxy_send_timeout      1800s;
                proxy_connect_timeout   1800s;
                proxy_buffering         off;


                # # Allow large requests to support file uploads to sessions
                client_max_body_size 10M;
                #proxy_set_header Host       $http_host;
                
                proxy_pass      https://your.ingress.controller.vip;
                ## Can also be your Teleport standalone server IP address, with the right port
        }

}
💡
L'exemple ci-dessus implique que vous ayez associé une VIP à votre contrôleur ingress (ServiceType: LoadBalancer).

Et voilà. Notez bien que dans cette configuration, tout le traffic devra passer par votre reverse proxy. Un service tentant d'accéder à Teleport en direct aura un problème de certificat.

De la même façon, je donne à clusterName la même adresse que celle diffusée par Nginx, si ce n'est pas votre cas, veillez à définir la variable publicAddr disponible dans le Helm Chart.

Plus d'informations ici :

teleport-cluster Chart Reference | Teleport
Values that can be set using the teleport-cluster Helm chart