Passer au contenu principal

GoTeleport

GoTeleport - GitOps Deployment on Kubernetes

💡
Ce guide décrit comme automatisé le déploiement et la configuration de Teleport au travers d'un outil de déploiement continue, ici ArgoCD

🔧 Pré-requis

GoTeleport peut être déployer sur un cluster Kubernetes ou directement sur une machine virtuelle.

Kubernetes est recommandé pour un déploiement HA, fortement conseillé en production pour fournir à minima du failover et au mieux une redondance.

Notre objectif ici est de déployer GoTeleport avec ArgoCD et l'intégrer automatiquement à notre référentiel d'identité, nous commencerons par identifier le processus de déploiement manuel avec un Helm Chart avant de l'automatiser.

⛴️ Kubernetes

Ce guide concerne les déploiements pour Teleport v12 et supérieur (v17 au jour de l'écriture de ce guide). De quoi avons-nous besoin côté Kubernetes ?

🔧 Prérequis Kubernetes

Un cluster Kubernetes en version >= v1.17.0
Helm v3, à minima >= v3.4.2

🪣 Stockage

Il existe plusieurs modes de déploiement correspondant à chaque provider Kubernetes. Nous couvrirons ici un environnement self-hosted, soit standalone.

Teleport utilise deux composants : teleport-auth et teleport-proxy .

teleport-proxy est stateless et peut être répliqué à volonté, aucun stockage n'y est associé. Il s'agit du composant exposé via l'Ingress ou le Load Balancer. Il vient par défaut avec deux replicas.

teleport-auth est stateful et nécessite un backend de stockage supporté.
Par défaut, une seule replica sera déployée, c'est parfait si l'on ne cherche qu'à avoir du failover et dans ce cas un simple volume RWO est suffisant.
Pour avec un fonctionnement avec plus d'une replica, il sera nécessaire d'ajuster la configuration et l'architecture.

Storage Backends | Teleport
How to configure Teleport deployment for high-availability using storage backends

La documentation référence l'ensemble des backend supportés

💡
Nous couvrirons ici le cas le plus simple, avec un pod teleport-auth unique. La mise en place d'un backend plus complexe sera traité dans un autre guide.

⚙️ Prérequis Stockage

Une StorageClass permettant la création de volumes RWO.
Si vous souhaitez externaliser les enregistrements de sessions, privilégiez un bucket S3.

📦 Helm Chart et registry

Les charts sont stockés sur le repository Teleport officiel : https://charts.releases.teleport.dev

Les charts qui nous intéressent sont teleport-cluster et teleport-operator.
teleport-kube-agent vous sera utile pour intégrer des ressources Kubernetes à la solution. Les autres dépendent de votre cas d'usage.

❯ helm search repo teleport/teleport
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
teleport/teleport-access-graph          1.27.3          1.27.3          A Helm chart for Teleport Access Graph            
teleport/teleport-cluster               17.4.10         17.4.10         Teleport is an access platform for your infrast...
teleport/teleport-kube-agent            17.4.10         17.4.10         Teleport provides a secure SSH, Kubernetes, dat...
teleport/teleport-operator              17.4.10         17.4.10         Teleport Operator provides management of select...
teleport/teleport-plugin-datadog        17.4.10         17.4.10         A Helm chart for the Teleport Datadog Incident ...
teleport/teleport-plugin-discord        17.4.10         17.4.10         A Helm chart for the Teleport Discord Plugin      
teleport/teleport-plugin-email          17.4.10         17.4.10         A Helm chart for the Teleport Email Plugin        
teleport/teleport-plugin-event-handler  17.4.10         17.4.10         A Helm chart for Teleport Event Handler Plugin    
teleport/teleport-plugin-jira           17.4.10         17.4.10         A Helm chart for the Teleport Jira Plugin         
teleport/teleport-plugin-mattermost     17.4.10         17.4.10         A Helm chart for the Teleport Mattermost Plugin   
teleport/teleport-plugin-msteams        17.4.10         17.4.10         A Helm chart for the Teleport MsTeams Plugin      
teleport/teleport-plugin-pagerduty      17.4.10         17.4.10         A Helm chart for the Teleport Pagerduty Plugin    
teleport/teleport-plugin-slack          17.4.10         17.4.10         A Helm chart for the Teleport Slack Plugin       

Les images utilisées sont hébergées sur la registry officielle : public.ecr.aws/gravitational/ sur AWS.

ECR Public Gallery
Amazon ECR Public Gallery is a website that allows anyone to browse and search for public container images, view developer-provided details, and see pull commands

Il n'y en a que trois :

helm show values teleport/teleport-cluster | grep "image:"

image: public.ecr.aws/gravitational/teleport-operator
image: public.ecr.aws/gravitational/teleport-distroless
enterpriseImage: public.ecr.aws/gravitational/teleport-ent-distroless

🐳 Images à synchroniser

L'image teleport-distroless sera utilisée pour la version communautaire
L'image teleport-ent-distroless pour la version enterprise
L'image teleport-operator sera automatiquement déployée par le chart teleport-cluster

Si votre environnement est air-gapped ou si vous restreignez l'usage d'image externe, pensez à les synchroniser au préalable.

🌐 Ingress ou Load Balancer

Le déploiement en mode Load Balancer vous permet d'exposer directement Teleport sur une adresse privée ou publique, derrière un reverse proxy externe ou non.
Il est également possible de le déployer derrière un contrôleur Ingress comme Traefik que nous utiliserons ici, couplé à cert-manager pour générer un certificat.

💡
Je ne couvre pas la configuration de Let's Encrypt ici, le ClusterIssuer doit déjà être configuré.

🔗 Réseau

La topologie réseau variera également en fonction de votre choix :

  • Avec un LoadBalancer, des flux devront être ouvert vers les différents services. La documentation référence l'ensemble des ports à ouvrir.
Networking | Teleport
This reference explains the networking requirements of a Teleport cluster, including its public address, ports, and support for HTTP CONNECT proxies.
  • Avec un Ingress, les agents se connecteront simplement au Proxy Service au travers du contrôleur sur le port 443. Les accès à la console Teleport se feront sur la même interface.
  • Notez que les flux nécessaire dépendront également de vos déploiements, par exemple si vous donnez l'accès à une application web ou une API depuis l'un des agents enregistrés, même chose pour les accès aux bases de données ou RDP.

🚀 Déploiement

👷‍♂️ Manuellement

Cette section se base sur la documentation officielle et mes expériences personnelles. Ce guide sera mis à jour régulièrement mais les choses ayant pu évoluée, n'hésitez pas à vous référez au site de GoTeleport.

Pour déployer GoTeleport, vous pouvez utilisez le dépôt officiel ou les intégrer à un repo interne.

Ajouter le repo si nécessaire :

helm repo add teleport https://charts.releases.teleport.dev

Pour déployer l'image :

helm install teleport-cluster teleport/teleport-cluster \
  --create-namespace --version 17.4.8 \
  --values teleport-cluster-values.yaml

Le fichier de values dépendra de vos besoins, la documentation reprend toutes les propriétés :

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

Ci-dessous un exemple pour un déploiement sur un cluster Kubernetes .

acme: false
chartMode: standalone
clusterName: teleport.prod.zenops360.fr
createProxyToken: true
enterprise: true
highAvailability:
  replicaCount: 1
annotations:
  ingress:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    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
operator:
  enabled: true
persistence:
  enabled: true
  volumeSize: 20Gi
rbac:
  create: true
service:
  type: ClusterIP
sessionRecording: ''
tls:
  existingCASecretName: ''
  existingSecretName: 'teleport-tls'
extraLabels:
  service:
    traefik.ingress.kubernetes.io/service.serversscheme: https
    traefik.ingress.kubernetes.io/service.serverstransport: "teleport-transport"
    traefik.http.serverstransports.mytransport.insecureskipverify: "true"

Quelques remarques :

  • chartMode: standalone
    • Indique que le cluster Kubernetes est self-managed, il existe des attributs spécifique pour chaque hyperscaler.
  • enterprise: true
    • Déploie la version Enterprise et nécessite une licence qui devra être créé dans un Secret nommé license dans le même namespace que l'application.
    • Le secret devra contenir la licence sous une clé license.pem
apiVersion: v1
kind: Secret
metadata:
  name: license
  namespace: teleport
type: Opaque
data:
  license.pem: LS0tLS1CRUdJTiB....

Exemple de licence

    • operator.enabled: true
      • Déploie l'opérateur Teleport, permet de créer des objets depuis des CRDs
    • Les autres paramètres sont propres à mon installation. Par exemple, Traefik n'est par défaut pas trop friand de rediriger son traffic vers un backend TLS avec un certificat non valide.

⚡ Avec ArgoCD

Dans une configuration avec un ApplicationSet (App of apps pattern), voici un exemple de déploiement.

Quelques remarques :

  • Ici, le Helm Chart est déployé directement depuis le repository officiel.
  • Le fichier de values est stocké dans un repo Git, préfixé avec le nom du cluster.
  • Des manifests sont également déployés via Kustomize dans un autre dossier du même repo, c'est ici que nous déploierons les ressources Kubernetes dont l'operator aura besoin pour configurer Teleport.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: teleport
  namespace: argocd
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  syncPolicy:
    applicationsSync: sync

  generators:
    - clusters:
        selector: 
          matchLabels:
            app: teleport-cluster
  template:
    metadata:
      name: '{{.name}}-teleport'
    spec:
      project: default
      sources:
        - repoURL: https://gitlab.prod.zenops.fr/prod/zenops-apps.git
          targetRevision: HEAD
          ref: values
        - repoURL: https://charts.releases.teleport.dev  
          targetRevision: 17.4.10
          chart: teleport-cluster
          helm:
            releaseName: teleport
            valueFiles: 
              - $values/Helm/teleport/{{.name}}.teleport-cluster.values.yaml
        - path: 'Kustomize/app/teleport/{{.name}}'
          repoURL: https://gitlab.prod.zenops.fr/prod/zenops-apps.git
          targetRevision: HEAD                        
      destination:
        server: '{{.server}}'
        namespace: teleport
      syncPolicy:
        syncOptions:
          - CreateNamespace=true
        automated:
          prune: true   
          selfHeal: true

⚙️ Configuration

🔐 Référentiel d'identité

⚠️ Cette section nécessite

Une licence Teleport Enterprise valide
Un service Keycloak configuré et accessible

La version communautaire ne permet d'intégrer que des comptes locaux, ou tiré de GitHub. Pour vous intégrer à un référentiel SAML, OIDC, Okta, Entra ID ou Google Workspace, il vous faudra déployer la version d'entreprise.

Nous utiliserons ici Keycloak comme référentiel d'identité, avec un provider SAML. La documentation officielle explique très clairement comment configurer intégrer Teleport à votre Keycloak, n'hésitez donc pas à vous y référer pour paramétrer le client.

Teleport Authentication with Keycloak | Teleport
How to configure Teleport access with Keycloak

Ci-dessous un exemple de configuration dans lequel nous rattachons le groupe devopsprésent dans Keycloak avec les rôles devops et access de Teleport:

#keycloak.samlconnector.yaml
apiVersion: resources.teleport.dev/v2
kind: TeleportSAMLConnector
metadata:
  name: keycloak-connector
  namespace: teleport
spec:
  acs: https://teleport.prod.zenops360.fr/v1/webapi/saml/acs/keycloak
  attributes_to_roles:
  - name: groups
    roles:
    - devops
    - access
    value: "/devops"
  audience: https://teleport.prod.zenops360.fr/v1/webapi/saml/acs/keycloak
  entity_descriptor_url: https://keycloak.prod.zenops360.fr/realms/prod/protocol/saml/descriptor
  service_provider_issuer: https://teleport.prod.zenops360.fr/v1/webapi/saml/acs/keycloak

Notre AppSet ArgoCD déploie également un ensemble de manifest via Kustomize, dont le connecteur SAML.

#kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- secrets.license.yaml
- keycloak.samlconnector.yaml
- devops.teleportroles.yaml

Notre connecteur faisant référence au rôle devops qui n'existe pas par défaut, nous devrons également créer le rôle.

  apiVersion: resources.teleport.dev/v1
  kind: TeleportRoleV7
  metadata:
    name: devops
  spec:
    allow:
      rules:
        - resources: ['*']
          verbs: ['*']  

🎯 Et ensuite ?

Cette configuration vous permet d'intégrer automatiquement une nouvelle installation de Teleport à votre référentiel d'identité, il s'agit d'un exemple pour démarrer, vous devrez adapter la configuration à votre cas d'usage.