Files
mates-infra/docs/security.md
T
mates 444191d16d feat: initial infra repo
- docker-services: 14 generic compose templates (portainer, npm, vaultwarden, gitea, jotty, nextcloud-aio, rustdesk, audiobookshelf, calibre-web, plex, erugo, jswiki, speedtest, watchtower)
- install-scripts: bash scripts for Ubuntu server bootstrap, docker, portainer, npm, backup, restore
- ansible: 4 playbooks (bootstrap, deploy-services, update-services, security-hardening) + roles skeleton
- hermes-install: Hermes CLI setup on macOS
- macos-setup: Brewfile + osx-defaults + fish-config
- home-nas-tools: metadata index for NAS projects (no binaries)
- docs: architecture, security, contributing
- README, LICENSE (MIT), .gitignore
2026-08-01 16:25:58 +02:00

4.6 KiB
Raw Blame History

🔐 Security

Bezpečnostní checklisty, hardening, threat model.

🛡 Defense in depth

Layer 1: Fyzický

  • Server v uzamčené místnosti
  • UPS (nepřerušitelný zdroj)
  • Teplotní monitoring (smart home)

Layer 2: Síť (perimetrie)

  • UFW firewall (default deny)
  • fail2ban (3 SSH pokusy = ban)
  • Cloudflare Tunnel (žádná veřejná IP)
  • VLAN izolace (IoT vs servery)

Layer 3: OS

  • Ubuntu LTS (pravidelné bezpečnostní updaty)
  • unattended-upgrades (auto security updates)
  • SSH klíče (hesla zakázána)
  • PermitRootLogin no
  • Auditd (logování)

Layer 4: Docker

  • Bridge network isolation
  • Read-only filesystémy kde to jde
  • USER_UID/GID pro file ownership
  • No --privileged (pokud to není nutné)
  • No --net=host (kromě Plex)
  • Health checks pro monitoring
  • Logging: json-file driver, 10 MB × 3

Layer 5: Aplikace

  • HTTPS terminuje NPM (Let's Encrypt)
  • 2FA na všech web službách
  • API klíče v keychainu, ne v env souborech
  • Rate limiting (NPM, fail2ban)

Layer 6: Data

  • Backup na NAS (denně)
  • Off-site backup (Backblaze B2)
  • Šifrované citlivé volumes (LUKS, v budoucnu)
  • Retention policy (7 dní denně, 4 týdny týdně, 12 měsíců měsíčně)

🔑 Správa hesel

  • Vaultwarden single source of truth
  • API klíče v macOS keychainu (security add-generic-password)
  • SSH klíče ~/.ssh/id_ed25519, passphrase v keychainu
  • 2FA TOTP, hardwarový klíč (doporučeno YubiKey)

🚨 Incident Response

Detekce

  • Watchtower notifikace (image outdated)
  • fail2ban email alert
  • Speedtest alert (interní outage)
  • Cloudflare Tunnel logy

Postup

  1. Identifikuj logy, monitoring
  2. Izoluj zastavit kontejner / odpojit síť
  3. Analyzuj root cause, scope
  4. Oprav patch, konfigurace
  5. Dokumentuj incident log v ~/Skripty/incident-YYYY-MM-DD.md

Recovery

  • restore-all.sh pro Docker data
  • Vaultwarden backup pro credentials
  • DNS failover (Cloudflare)

🛠 Hardening checklist

Server

  • Ubuntu LTS nainstalován
  • UFW aktivní, default deny
  • fail2ban nakonfigurován
  • SSH klíče, root login zakázán
  • unattended-upgrades aktivní
  • auditd běží
  • Docker nainstalován z oficiálního repo

Docker

  • Bridge networks (žádný host network, kromě Plex)
  • USER_UID=1000, USER_GID=1000 pro všechny kontejnery
  • Volumes na hostu (./data), ne anonymous
  • Health checks v compose
  • Logging: 10 MB × 3 soubory
  • Restart: unless-stopped

Služby

  • HTTPS terminuje NPM
  • Let's Encrypt auto-renew
  • 2FA na všech účtech
  • Admin heslo změněno z default
  • Registrace vypnuta (pokud ne private)
  • SMTP nastaveno (pro notifikace)

Zálohy

  • rsync skript cron (denně 03:00)
  • Off-site backup (Backblaze B2)
  • Test obnovy (čtvrtletně)
  • Šifrované zálohy (GPG + age)

📜 Compliance

  • GDPR osobní data v Nextcloud (kontrola přístupu)
  • PCI DSS N/A (žádné platby)
  • NIS2 pokud provozuješ služby pro třetí strany

🔍 Threat model

Hrozba Pravděpodobnost Dopad Mitigace
Brute force SSH Vysoká Nízký fail2ban, key-only
Phishing Střední Vysoký 2FA, edukace
Docker escape Nízká Kritický Bridge isolation, USER_UID, pravidelné updaty
Supply chain (image) Nízká Vysoký Oficiální image, Watchtower, GPG signing
Insider threat Nízká Střední Audit logy, 2FA, hesla v keychainu
Ransomware Nízká Kritický Off-site backup, 3-2-1 rule
DDoS Střední Střední Cloudflare, fail2ban
DNS hijack Nízká Vysoký DNSSEC, HTTPS
Zero-day v OS Střední Kritický unattended-upgrades, WAF

🔐 API token management

# Uložení do keychainu
security add-generic-password \
    -s "service:api:192.168.0.148" \
    -a "user" \
    -w "TOKEN" -U

# Čtení v skriptech
TOKEN=$(security find-generic-password \
    -s "service:api:192.168.0.148" \
    -a "user" -w)

Pravidla:

  • Token nikdy v .env souborech
  • Token nikdy v docker-compose.yml
  • Token nikdy v git history
  • Token pouze v keychainu nebo env variables

📚 Reference