$ 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, certificats SSH éphémères sur 65 hôtes
Couche secrets
Vault de secrets centralisé (Infisical), précédé d'un proxy Agent Vault qui injecte les identifiants en transit — les agents ne détiennent jamais de secret en clair
Couche détection
Wazuh SIEM (38 agents), Grafana Alloy → logs Loki centralisés, 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), pour chaque service derrière le reverse proxySSO 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.
Secrets — vault Infisical
Les identifiants n'ont rien à faire en clair dans des fichiers de conf. Chaque token, clé API et secret de CA vit dans un vault centralisé, auto-hébergé — Infisical sur le CT 116 — avec une copie chiffrée hors-ligne en secours.
SSH durci + YubiKey FIDO2
Chaque host du homelab — 65 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 tout le parc.
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.
Certificats SSH éphémères
La clé d'automation statique a disparu de tout le parc — remplacée par des certificats de 15 minutes émis par un SSH CA Infisical. Les hôtes font confiance au CA (TrustedUserCAKeys) ; le client génère un cert court par connexion, donc la révocation se résume à l'expiration. Lire le récit →
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 38 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 completheadscale.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 preloadX-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-originPerson + WebSite schema sur chaque page — SEO sans trackingLes 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.