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

153 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🔐 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)