- 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
4.6 KiB
4.6 KiB
🔐 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
- Identifikuj – logy, monitoring
- Izoluj – zastavit kontejner / odpojit síť
- Analyzuj – root cause, scope
- Oprav – patch, konfigurace
- Dokumentuj – incident log v
~/Skripty/incident-YYYY-MM-DD.md
Recovery
restore-all.shpro 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
.envsouborech - Token nikdy v
docker-compose.yml - Token nikdy v git history
- Token pouze v keychainu nebo env variables