$ 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.
update-ca-trust) cert-check) de l'expiration TLS sur tous les services — alerte Telegram si un cert expire dans moins de 14 jours 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.
192.168.1.0/24 vers le LAN complet headscale.pixelium.win — le seul service exposé publiquement -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.
default-src 'none' — politique deny-by-default, chaque type de ressource explicitement autorisé max-age=31536000; includeSubDomains; preload — HTTPS forcé pendant 1 an, éligible preload X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin 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.
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.