Accès distant sécurisé à vos services PHP avec Tailscale Serve

Mise en place d’un serveur PHP local sur Tailscale

Avant de publier un service, il est utile de vérifier ce que Tailscale expose déjà. Cela permet de savoir quels services sont accessibles sur votre tailnet et d’éviter les conflits de ports.

Commande :

tailscale serve status

Exemple de sortie :


https://$mac.$tn.ts.net (tailnet only)
|-- /           proxy http://127.0.0.1:5001
|-- /jelly      proxy http://127.0.0.1:8096
  

Explications :

  • $mac : nom de votre machine dans le tailnet
  • $tn : nom de votre tailnet
  • Les services listés sont déjà exposés via Tailscale Serve

Démarrer un service web local

Pour tester, vous pouvez créer un petit serveur PHP local accessible uniquement sur votre machine :

cd ~/Shared/Helloworld
php -S 127.0.0.1:9090

Le service est maintenant disponible sur http://127.0.0.1:9090.

Service exposé via Tailscale Serve

Exposer le service via Tailscale Serve

Pour publier le service sur votre tailnet :

tailscale serve --set-path=/helloworld --bg 9090

Puis vérifier :

tailscale serve status

Résultat attendu :


https://$mac.$tn.ts.net (tailnet only)
|-- /           proxy http://127.0.0.1:5001
|-- /jelly      proxy http://127.0.0.1:8096
|-- /helloworld proxy http://127.0.0.1:9090
  

Votre service est maintenant accessible via https://$mac.$tn.ts.net/helloworld.

Service exposé via Tailscale Serve

Configurer l’ACL pour autoriser l’accès

Pour que d’autres membres de votre tailnet puissent accéder au service, configurez les ACL dans l’admin Tailscale :

{
  "ACLs": [
		{
			"action": "accept",
			"src":    ["group:$name"],
			"dst": [
				"$ip:9090",
			],
		}
  ]
}
  • src : group:$name : Le groupe contenant l’utilisateur.
  • dst : $ip:9090 : le serveur faisant tourner le serveur PHP.

Considérations de sécurité

  • Limiter les utilisateurs : Ne partagez pas les services avec tout le tailnet si ce n’est pas nécessaire. Utilisez des groups et des ACL pour contrôler précisément qui peut accéder à chaque port ou service.
  • HTTPS automatique : Tailscale gère automatiquement le HTTPS via .ts.net, réduisant le risque d’interception du trafic.
  • Isolation des services : Faites tourner vos services dans des conteneurs (Docker/Podman) ou sur des machines virtuelles pour limiter l’impact en cas de compromission.
  • Surveillance et logs : Activez les logs sur vos services et utilisez des outils comme GoAccess pour analyser l’activité et détecter les comportements suspects.
  • Principe du moindre privilège : N’ouvrez que les ports nécessaires et configurez vos ACL pour que seuls les utilisateurs autorisés puissent accéder aux services.
  • Attention aux exit nodes : Le trafic passant par un exit node peut contourner certaines restrictions locales. Désactivez ou restreignez l’usage de l’exit node pour un contrôle strict des ACL.
  • Tags et machines : Utilisez les tag et tagOwners pour restreindre l’accès à certains services uniquement aux appareils autorisés. Vérifiez régulièrement que ces tags sont correctement appliqués.
  • Accès local : Même si les ACL restreignent les utilisateurs, une machine peut accéder à ses propres services localement. Prenez ce comportement en compte lors de la conception de vos règles.
  • Fail2Ban : Installez et configurez fail2ban pour protéger vos services contre les tentatives répétées de connexion non autorisée, comme les attaques SSH ou HTTP bruteforce.
  • Firewall : Activez un firewall local (ex. pf sur macOS ou ufw/iptables sur Linux) pour limiter l’accès aux ports essentiels. Même si Tailscale sécurise le trafic, un firewall ajoute une couche de protection supplémentaire contre les accès non autorisés ou les services exposés accidentellement.

Conclusion

Grâce à Tailscale Serve, vous pouvez exposer vos services locaux facilement et en toute sécurité. En combinant ACL et bonnes pratiques de sécurité, vous limitez les risques tout en offrant un accès pratique à vos collaborateurs.