- 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
153 lines
4.6 KiB
Markdown
153 lines
4.6 KiB
Markdown
# 🔐 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
|
||
|
||
```bash
|
||
# 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
|
||
|
||
- [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker)
|
||
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
|
||
- [NIST Cybersecurity Framework](https://www.nist.gov/cyberframework)
|
||
- [CIS Ubuntu Linux Benchmark](https://www.cisecurity.org/benchmark/ubuntu_linux)
|