Sentinel Grafana Loki CrowdSec
Self-hosted · Docker · Windows 11

Infrastructure that runs itself.

25+ containers orchestrated through Docker Compose on WSL2, secured behind Authelia SSO, CrowdSec, and Microsoft Sentinel + Defender XDR with live threat-intel feeds. Network-layer detection via Suricata IDS and netifyd DPI on the GL-BE9300 router, with router syslog also shipped into Sentinel. Internal apps use *.home.aahmed.ca, with selected public endpoints on dedicated hostnames.

0
Containers
0
TI Indicators
0
Alert Rules
0
Security Layers
Ingress Flow
Every request passes through five layers before reaching a service.
Internet :80 / :443 Caddy reverse proxy CrowdSec IPS · LAPI Authelia SSO · 2FA 127.0.0.1 CrowdSec Infisical Grafana Uptime Kuma + 20 more services TLS · Cloudflare DNS-01 certificates · https://{service}.home.aahmed.ca
Request lifecycle from WAN to service
Core Stack
🔑

Secrets Management

Central store for operational secrets, with local scripts handling export and render steps for runtime config.

Infisical
📋

Status

Public status page tracking service and probe health.

Uptime Kuma
🔔

Notifications

Alert and status delivery to mobile devices for both infrastructure and security events.

ntfyTelegram
🔧

Dependency & Image Hygiene

Automated dependency updates, container image refresh, and vulnerability scanning.

RenovateWatchtowerTrivy
Defense in Depth

Caddy Reverse Proxy

  • HTTPS via Cloudflare DNS-01 certificate renewal
  • All backends bound to 127.0.0.1
  • JSON access logs feed CrowdSec in real time
🔑

Authelia SSO

  • forward_auth on every Caddy route
  • Two-factor: passkey + biometric or TOTP
  • OIDC provider for Grafana
🛡

CrowdSec IPS

  • Community blocklists + log analysis
  • Bouncer queries LAPI every 15s
  • Collections: caddy, authelia, http-cve
🔎

Microsoft Sentinel

  • 5 scheduled analytics rules + a router SSH brute-force rule over the native Syslog table
  • Deployed as code with Bicep — no click-ops
  • "Homelab Security Operations" workbook for triage
  • SOAR notification playbook (Logic App) on incident creation
Microsoft Security Stack
The self-hosted SIEM was retired in favor of the same enterprise tooling used in production security operations.
🛡

Defender XDR + MDE

  • 5 custom detection rules (KQL), sourced from Sigma
  • 2-device managed fleet — Windows + macOS — onboarded to Defender for Endpoint
  • EDR telemetry feeds advanced hunting for both devices
📱

Microsoft Intune

  • Windows + macOS compliance baselines defined as code
  • Attack Surface Reduction rules deployed in audit mode
  • macOS Defender onboarding profiles pushed via Intune
  • Both fleet devices report Compliant
☁️

Defender for Cloud

  • Foundational cloud security posture management (CSPM)
  • Compliance tracked against MCSB and CIS benchmarks
Threat Detection
Layered detection across hosts, the network edge, and live threat intelligence.

Defender Custom Detections

  • Suspicious child from Office / Browser — T1566.001
  • Encoded / download commands — T1059.001
  • Lsass credential access — T1003.001
  • Remote thread injection — T1055
  • Registry persistence & C2 named pipes
🧬

Threat Intelligence

  • Microsoft Defender Threat Intelligence (MDTI) data connector
  • AlienVault OTX via TAXII
  • abuse.ch ThreatFox via STIX upload
  • ~206,000 indicators feeding Sentinel analytics rules
📡

Suricata IDS & netifyd DPI

  • Suricata in LXC on GL-BE9300 — shares host netns, sniffs br-lan
  • netifyd nDPI engine — flow classification with ndpi_risk_score
  • High-risk flows forwarded via syslog into Sentinel's native Syslog table
  • Router SSH brute-force rule tags matches with MITRE T1110
Detection-as-Code
Detections are source-controlled, tested, and deployed like any other code.
🗂️

Sigma + CI/CD

  • Sigma rules are the single source of truth for every detection
  • GitHub Actions: Sigma validation, rules-in-sync check, Bicep build, schema checks on every PR
  • OIDC deploy to Azure on merge — no stored cloud credentials
  • Main is branch-protected
🧪

Continuous Purple-Team Validation

  • Isolated MDE-onboarded detonation-range VM, separate from the production fleet
  • Validation loop runs Atomic Red Team techniques against the VM
  • Each run auto-confirms the matching detection fired, via advanced hunting
  • Emits an ATT&CK Navigator coverage layer after every run
  • First run caught 2 custom detections that filtered on an empty field and would have never fired
The validation harness caught bugs that code review couldn't: two detections keyed on the wrong field — for CreateRemoteThreadApiCall and OpenProcessApiCall the target process lives in FileName, not AdditionalFields.TargetProcessName — so they would have stayed silent forever.
Observability
30s
Scrape
15d
Metrics
30d
Logs
30+
Alerts
8
Probes
SOURCES cAdvisor windows-exporter CrowdSec metrics Blackbox probes SNMP · Router Prometheus 30s scrape · 15d 20+ jobs · rules rules fire Alertmanager group · route · notify ntfy Telegram Grafana dashboards · SSO metrics + logs LOG SOURCES Docker containers /var/log · syslog Promtail ship · label Loki 30d retention Uptime Kuma · status page
Metrics pipeline (left) and log pipeline (right) converge in Grafana
🔥

Prometheus

  • 20+ scrape jobs: exporters, cAdvisor, blackbox, SNMP
  • Alert rules: health, network, compliance, security, router
  • Alertmanager routes to ntfy + Telegram
📊

Grafana

  • Dashboards: system health, security operations, router, logs
  • Datasources: Prometheus + Loki
  • SSO via Authelia at grafana.home.aahmed.ca
📝

Loki + Promtail

  • All Docker containers + /var/log
  • Syslog on 1514/UDP for network devices
  • 30-day retention, local filesystem
🔍

Exporters & Probes

  • TCP, DNS, TLS, ICMP, HTTP blackbox probes
  • CrowdSec metrics exporter for bouncer decisions
  • cAdvisor, windows-exporter, Uptime Kuma
Network Topology
WAN / ISP GL-BE9300 Flint3 192.168.8.1 · Suricata · netifyd DOCKER HOST · Windows 11 · WSL2 proxy_net 172.30.0.0/16 Caddy Infisical Grafana +20 all bound to 127.0.0.1 Tailscale Mesh 100.x.x.x · remote access CoreDNS home.aahmed.ca zone
Docker host networks, VPN isolation, and remote access overlay
🌐

Router Telemetry to Sentinel

  • GL-BE9300 syslog shipped off-box to Microsoft Sentinel
  • Azure Monitor Logs Ingestion API into the native Syslog table
  • Data Collection Endpoint + Data Collection Rule defined as code
📡

Split DNS + Tailscale

  • CoreDNS for home.aahmed.ca on Tailscale
  • Mesh VPN for remote access everywhere
  • Docker bridge proxy_net 172.30.0.0/16
🛰

Router IDS �?" GL-BE9300 Flint3

  • Suricata in LXC container — host netns, sniffs br-lan directly
  • netifyd nDPI daemon — per-flow risk scoring on all LAN traffic
  • High-risk DPI events → syslog → Sentinel → analytics rule
  • Public file access at homefiles.aahmed.ca
Tooling & Scripts

PowerShell

  • $ validate-stack.ps1
  • $ prepare-monitoring.ps1
  • $ harden-rdp.ps1
  • $ enforce-policy.ps1
  • $ vm-control.ps1
  • $ cf-update-dns.ps1

Python

  • > add_missing_kuma_monitors.py
  • > telegram-bot/app.py
  • > detonation_orchestrator.py
  • > coverage_layer.py

Scheduled

  • Watchtower — daily 4 AM
  • Certificate renewal check — daily
  • Purple-team validation run — against detonation VM
  • ATT&CK coverage layer — regenerated per run
Platform
OS
Windows 11 Pro
Docker Desktop + WSL2
GPU
NVIDIA
GPU acceleration
Remote
Tailscale mesh
RDP
Config
Environment-driven
Conventional commits