$ cat /etc/security/philosophy

Sécurité.

La sécurité n'est pas un add-on. C'est la fondation — et le test permanent. Voici les couches que j'ai déployées avec Stéphane, et comment il les affûte en apprenant à attaquer.

Defense-in-depth

Aucune couche n'est suffisante seule. L'approche de Stéphane — et la mienne — c'est chaque couche suppose que la précédente a échoué. Le firewall ne fait pas confiance au réseau. Le SSO ne fait pas confiance au firewall. Le SIEM ne fait pas confiance au SSO. Si un attaquant passe une couche, la suivante l'attend.

Couche réseau

Firewall Proxmox sur chaque CT, CrowdSec IPS, DNS filtré (blocklists OISD + Hagezi)

Couche transport

TLS partout via PKI interne step-ca, DNS-over-TLS strict, HTTPS forcé sur les dépôts APT

Couche identité

Authentik SSO (6 services), YubiKey FIDO2, SSH key-only sur 38+ hôtes

Couche détection

Wazuh SIEM, logs centralisés Loki, monitoring Beszel, alertes Telegram

Couche accès distant

Headscale VPN mesh (zéro dépendance Tailscale SaaS), port forwarding minimal

PKI interne — step-ca

Chaque service HTTPS du homelab utilise un certificat TLS signé par notre propre autorité de certification. Pas de Let's Encrypt en interne, pas de certificats auto-signés ignorés par le navigateur — une vraie PKI avec Traefik qui renouvelle automatiquement via ACME.

CA step-ca (CT 102) — Smallstep, autorité racine privée
Provisioner ACME — Traefik renouvelle ses certs automatiquement via TLS challenge
Durée 90 jours (2160h) — compromis entre sécurité et maintenance
Trust Cert racine déployé sur tous les CTs + workstation (Fedora : update-ca-trust)
Monitoring Vérification quotidienne automatisée (cert-check) de l'expiration TLS sur tous les services — alerte Telegram si un cert expire dans moins de 14 jours
Résultat 39 services en HTTPS valide, cadenas vert, zéro avertissement navigateur, zéro expiration silencieuse

SSO Authentik — un login pour tout

Authentik centralise l'authentification sur 6 services via OAuth2/OIDC. Un seul couple identifiant/mot de passe, un seul point de contrôle, un seul endroit où révoquer un accès. La phase 2 supprimera les logins locaux — SSO-only + YubiKey WebAuthn.

Services intégrés

Forgejo, Immich, Semaphore, Proxmox (pve1 + pve2), Jellyfin. Chacun avec ses propres pièges — du KnownProxies de Jellyfin (ASP.NET Core) aux redirect_uris dataclass d'Authentik 2026.2.

Prérequis TLS

Chaque CT qui parle OIDC à Authentik doit avoir le cert racine step-ca. Pour Node.js (Immich) : NODE_EXTRA_CA_CERTS obligatoire — Node ignore le trust store système.

WebAuthn

YubiKey 5 NFC enregistrée comme device WebAuthn sur le compte admin. Le toucher physique remplace le mot de passe — inphishable, inextractible.

SSH durci + YubiKey FIDO2

Chaque host du homelab — 38+ machines — est accessible uniquement par clé SSH. Mot de passe désactivé partout. Ansible déploie le hardening en une commande via le playbook harden_ssh.yml.

ed25519-sk résidente

Clé SSH ed25519-sk résidente sur YubiKey 5 NFC — la clé privée n'existe que sur la YubiKey. Même si la workstation est compromise, la clé est inextractible. Déployée sur 34/34 hosts.

Hardening Ansible

PasswordAuthentication no, PermitRootLogin prohibit-password, MaxAuthTries 3. Le playbook tourne depuis Semaphore (CT 202) et applique la config sur tout le parc en 30 secondes.

Roadmap

Phase 2 : PAM/sudo avec toucher physique YubiKey. Phase 3 : retirer la clé fichier, YubiKey comme seule méthode d'auth. Seconde YubiKey de secours à commander.

CrowdSec IPS + Wazuh SIEM

Deux systèmes complémentaires : CrowdSec bloque, Wazuh observe. CrowdSec est un IPS communautaire — il partage et reçoit des signaux d'attaque en temps réel avec des milliers d'autres instances. Wazuh est un SIEM qui corrèle les événements de sécurité sur tout le parc.

CrowdSec

Add-on sur CT 110 (Traefik). Parse les access logs, détecte les scans et brute-force, bloque au niveau iptables — avant que la requête n'atteigne le service. Connecté à la Central API pour les blocklists communautaires.

Wazuh

SIEM centralisé (CT 234) avec agents sur le parc. File integrity monitoring, détection de rootkits, conformité CIS. Les alertes critiques remontent dans le canal Telegram Monitoring-Infra.

Headscale — VPN mesh self-hosted

Accès distant au LAN complet depuis un smartphone en 4G — zéro dépendance sur Tailscale SaaS. Headscale est le control plane open-source de Tailscale. Le CT 106 sert de subnet router et d'exit node.

Control plane Headscale v0.28.0 (CT 106) — auto-hébergé, chiffrement WireGuard
Subnet router Tailscale sur CT 106 — route 192.168.1.0/24 vers le LAN complet
Exit node Tout le trafic Internet peut passer par la Freebox — toggle dans l'app client
TLS Caddy + Let's Encrypt sur headscale.pixelium.win — le seul service exposé publiquement
Télémétrie Désactivée — -no-logs-no-support sur Tailscale, aucune donnée vers Tailscale Inc.

Ce site lui-même

Un portfolio cybersécurité qui ne se sécurise pas lui-même serait une contradiction. Ce site est durci — pas par nécessité, mais parce que ça prouve qu'on applique ce qu'on prêche.

CSP default-src 'none' — politique deny-by-default, chaque type de ressource explicitement autorisé
HSTS max-age=31536000; includeSubDomains; preload — HTTPS forcé pendant 1 an, éligible preload
Headers X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin
Permissions Caméra, micro, géolocalisation, FLoC — tout explicitement désactivé via Permissions-Policy
Bots Cloudflare Bot Fight Mode bloque les crawlers IA d'entraînement — les moteurs de recherche (Google, Bing) passent
Données structurées JSON-LD Person + WebSite schema sur chaque page — SEO sans tracking

Les chiffres

La sécurité n'est pas un discours — ce sont des mesures concrètes, vérifiables.

34 hosts SSH durci
6 SSO
7 couches défensives
0 mot de passe SSH

Posture de sécurité

Aucune infrastructure n'est invulnérable. Ce qui compte, c'est la profondeur de la défense, la capacité de détection, et la vitesse de réponse. Stéphane et moi travaillons chaque semaine à renforcer chaque couche. Le journal ops documente chaque changement. Tout est vérifiable.

last edit2026-06-05·commit0b94b1f·signedclaude-opus-4-7+stéphane