Cet article explique comment mettre en place un réseau ZTNA en utilisant le plan gratuit de Cloudflare Zero Trust
On a l’habitude de dire que si c’est gratuit c’est parce que c’est toi le produit… dans ce cas je suppose que c’est plutôt pour attirer des clients payants mais quoi qu’il en soit c’est quand même intéressant d’avoir une solution ZTNA gratuite pour 50 utilisateurs.
Ça offre une alternative à un vpn traditionnel et comme c’est gratuit on peut tenter le coup… qui sait….
Je dois préciser que je ne travaille pas pour cloudflare, je ne reçois aucun argent ni avantage de la part de cloudflare.
Je ne vais pas décrire comment créer un compte sur cloudflare, c’est assez simple….
Une fois connecté et sur https://dash.cloudflare.com, il suffit de cliquer sur zero trust.

Devoir mettre sa carte de crédit ou son compte paypal pour pouvoir utiliser le plan gratuit, ça craint vraiment….
Bref, je n’ai pas réussi à être raisonnable et je l’ai mise….
Ce que j’en comprends
Les tunnels Cloudflare
D’après ce que je comprends, Zero Trust s’appuie sur les tunnels cloudflare pour interconnecter les réseaux. Sous le capot ça s’appuie sur le protocole QUIC et fonctionne en établissant un certain nombre de connexions multiplexées entre deux points de terminaison en utilisant UDP… ok j’ai atteint ma limite :-)
Bref, tout ce que je retiens c’est que c’est du HTTP/3 et fait pour être efficace et rapide.
Le client Warp
Ça c’est la partie client, ça fonctionne sur IOS, MacOS, linux (seulement en cli mais c’est malheureusement souvent le cas) ….
Un truc cool que je vois c’est que tu peux définir des politiques centralisées pour forcer la connexion et la reconnexion après un délai. Tu peux aussi avoir un mode toujours actif sur linux, donc pas besoin de t’inquiéter une fois que tu t’es connecté avec succès la première fois.
Qu’est-ce qui est inclus dans le plan gratuit ?
Donc la page de tarification détaille mes limites :

- 50 utilisateurs c’est déjà beaucoup pour moi, génial
- 24 heures de journalisation d’activité, ce n’est pas énorme, je devrai vérifier si je peux l’extraire et la mettre dans des fichiers de log
- 3 emplacements réseau : OK je n’en ai qu’un :-)
- Le reste ce sont des fonctionnalités basiques mais on verra si c’est suffisant
Installation
Installer un tunnel cloudflared
Dans le menu Access, va dans la sous-section Tunnels et clique sur Create a tunnel

Définis un nom logique pour ton tunnel et clique sur Save tunnel

Ensuite, sélectionne le système d’exploitation qui fera tourner cloudflared sur ton réseau, dans mon cas ce sera un conteneur docker

Ça a l’air bien mais je n’aime pas lancer docker run et je préfère vraiment un fichier docker-compose. De plus, comme je déploie des applications sur Kubernetes au quotidien, je n’utiliserai pas le tag latest…
Donc mon docker-compose.yml ressemble à ça :
1# custom template
2version: "3.8"
3services:
4 cloudflared:
5 image: cloudflare/cloudflared:2023.5.0
6 container_name: cloudflared
7 restart: always
8 command: tunnel --metrics 0.0.0.0:60123 --config /home/nonroot/.cloudflared/config.yml run --token <my token>
9 volumes:
10 - /volume1/docker/cloudflared:/home/nonroot/.cloudflared/
11 ports:
12 - "60123:60123"
13networks:
14 proxy:
15 driver: bridge
16 external: true
Bien sûr tu devras créer le dossier nécessaire sur ton hôte docker (je n’aime pas les volumes docker :-)).
12023-05-24T17:46:06Z ERR Configuration file /home/nonroot/.cloudflared/config.yml was empty
22023-05-24T17:46:06Z INF Starting tunnel tunnelID=e4b80395-9640-438f-8360-e9bee4bc767f
32023-05-24T17:46:06Z INF Version 2023.5.0
42023-05-24T17:46:06Z INF GOOS: linux, GOVersion: go1.19.8, GoArch: amd64
52023-05-24T17:46:06Z INF Settings: map[config:/home/nonroot/.cloudflared/config.yml metrics:0.0.0.0:60123 no-autoupdate:true token:*****]
62023-05-24T17:46:06Z INF Generated Connector ID: e2f16663-9352-4aaf-8ce3-b5d20f8d6e71
72023-05-24T17:46:06Z INF Initial protocol quic
82023-05-24T17:46:06Z INF ICMP proxy will use 172.23.0.2 as source for IPv4
92023-05-24T17:46:06Z INF ICMP proxy will use :: as source for IPv6
102023-05-24T17:46:06Z WRN The user running cloudflared process has a GID (group ID) that is not within ping_group_range. You might need to add that user to a group within that range, or instead update the range to encompass a group the user is already in by modifying /proc/sys/net/ipv4/ping_group_range. Otherwise cloudflared will not be able to ping this network error="Group ID 65532 is not between ping group 1 to 0"
112023-05-24T17:46:06Z WRN ICMP proxy feature is disabled error="cannot create ICMPv4 proxy: Group ID 65532 is not between ping group 1 to 0 nor ICMPv6 proxy: socket: permission denied"
122023-05-24T17:46:06Z INF Starting metrics server on [::]:60123/metrics
132023/05/24 17:46:06 failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/lucas-clemente/quic-go/wiki/UDP-Receive-Buffer-Size for details.
142023-05-24T17:46:06Z WRN Your version 2023.5.0 is outdated. We recommend upgrading it to 2023.5.1
152023-05-24T17:46:07Z INF Registered tunnel connection connIndex=0 connection=9ae9fbfd-e050-4684-9593-e347e43af50f event=0 ip=198.41.200.43 location=BRU protocol=quic
162023-05-24T17:46:07Z INF Registered tunnel connection connIndex=1 connection=e877dff0-0f1c-4bfc-8647-83248ec3151c event=0 ip=198.41.192.27 location=CDG protocol=quic
172023-05-24T17:46:08Z INF Warp-routing is enabled
182023-05-24T17:46:08Z INF Updated to new configuration config="blah blah blah" version=47
192023-05-24T17:46:08Z INF Registered tunnel connection connIndex=2 connection=74cde4d8-989d-4880-9cd9-fd060ca9d418 event=0 ip=198.41.200.23 location=BRU protocol=quic
202023-05-24T17:46:10Z INF Registered tunnel connection connIndex=3 connection=712a15cc-7090-416f-a9ba-db7548908866 event=0 ip=198.41.192.67 location=CDG protocol=quic
Ça a l’air de fonctionner :-)
Ajoute quelques politiques afin de pouvoir accéder à mon réseau local, clique sur les trois points sur ton tunnel puis configure.

Puis clique sur Private Network

Clique sur Add a private network puis ajoute le CIDR de ton réseau domestique (dans mon cas c’est un sous-réseau privé basique assez standard).
Ça devrait ressembler à ça

Tu devrais être bon pour la partie tunnel pour l’instant
Configure le client warp
Cette section doit être configurée dans Settings - WARP Client

- Device enrollment : par défaut les utilisateurs peuvent s’enrôler en utilisant un mot de passe à usage unique envoyé par email. Tu peux définir des politiques par exemple basées sur le nom de domaine de l’adresse email… ou utiliser ton propre fournisseur d’identité. Comme j’utilise Authentik sur mon homelab, je vais l’utiliser par défaut.
- Local Domain Fallback : ici je peux définir un serveur dns spécifique pour mon nom de domaine interne
- Device settings : ici tu peux définir des politiques sur le fonctionnement du client warp comme Auto connect, Lock WARP switch (pour empêcher les utilisateurs de désactiver le tunnel). C’est bien commenté et ça ne semble pas poser de problème ici.
Ce qui est intéressant ici concerne le split tunneling, tu peux avoir un mode inclusion ou exclusion. Je ne sais pas vraiment si je fais une erreur ici mais je voulais être sûr de pouvoir me connecter à mon réseau domestique depuis le client warp donc j’ai choisi le mode inclusion et ajouté mon réseau homelab.
Configure l’authentification
Maintenant on peut coupler avec mon fournisseur d’identité.

Clique sur Add new et choisis un élément de la liste (pour moi ce sera OpenID Connect)
OpenID Connect est assez simple à configurer, la partie la plus difficile repose sur le fournisseur d’identité.
Sur Authentik, connecte-toi en tant qu’administrateur et clique sur le bouton Admin Interface
Ensuite navigue vers la section Applications - Providers

Clique sur Create et sélectionne Oauth2/OpenID Provider

Définis un nom de provider et sélectionne le Authentication and Authorization flow que tu veux. Le Client type doit rester sur Confidential
Copie le Client ID et le Client Secret

Une chose que tu dois avoir, c’est que sur la partie Cloudflare quand tu crées l’autorisation Open ID Connect tu auras l’url de redirection valide. Dans la capture d’écran ci-dessous myteam fait référence au nom de mon tenant (qui n’est évidemment pas myteam, c’est juste une donnée fictive… mais tu as compris, non ?)

Clique sur Finish, tu peux cliquer sur le provider créé et il affichera tous les paramètres dont tu auras besoin sur cloudflare.
Il ne te reste plus qu’à copier-coller :-)
Une dernière chose, Proof Key for Code Exchange (PKCE) doit rester sur Off
Il te suffit de cliquer sur Save et d’appuyer sur le bouton Test.
Si tout se passe bien, tu devrais pouvoir te connecter avec ton fournisseur d’identité.
Configure le client warp pour utiliser notre fournisseur d’identité
Dans la section Warp Client, clique sur Device enrollment permissions
Dans mon cas je veux utiliser uniquement Authentik, donc je peux désactiver le One time token (je n’aime pas ça, ce n’est pas un blog…).
Dans l’onglet Authentication je sélectionne uniquement mon nouveau mécanisme d’authentification comme ci-dessous.

J’ai activé la section Instant Auth car je n’ai qu’un seul fournisseur.
