watchdog-docker/README.md

383 lines
8.9 KiB
Markdown
Raw Permalink Normal View History

# Watchdog Docker v0.1
Docker Container für OPNsense Monitoring mit Web-Interface und E-Mail-Benachrichtigungen.
## Features
- 🔍 **DHCP Lease Monitoring** - Überwachung neuer IP-Vergaben
- 📱 **Device Detection** - Erkennung neuer Geräte via ARP (mit Abgleich bekannter Geräte)
- 🔌 **Interface Monitoring** - Status-Änderungen von Netzwerk-Interfaces
- 🌐 **Gateway Monitoring** - Überwachung von Gateway-Status
- 📧 **E-Mail Benachrichtigungen** - Automatische Alerts bei Events
- 🖥️ **Web Dashboard** - Übersichtliches Interface mit Echtzeit-Updates
- 🔐 **Passwort-Schutz** - Gesicherter Zugang zum Dashboard
## Überwachte Events
| Event-Typ | Beschreibung | Interface-Filter |
|-----------|--------------|------------------|
| DHCP Lease | Neue IP-Adresse vergeben | ✓ |
| New Device | Neues Gerät im Netzwerk erkannt | ✓ |
| Interface Status | Interface up/down Änderungen | ✓ |
| Gateway Status | Gateway Status-Änderungen | - |
## Voraussetzungen
- Docker & Docker Compose
- OPNsense Firewall mit aktivierter API
- SMTP Server für E-Mail-Benachrichtigungen (optional)
## OPNsense API Setup
### 1. API Key & Secret generieren
1. In OPNsense: **System → Access → Users**
2. Wähle deinen Admin-User oder erstelle einen neuen
3. Scrolle zu **API keys** und klicke auf **+** (Add)
4. Notiere dir **Key** und **Secret** - sie werden nur einmal angezeigt!
### 2. API Zugriff testen
```bash
curl -k -u "YOUR_KEY:YOUR_SECRET" https://192.168.1.1/api/core/menu/search/
```
Falls erfolgreich, erhältst du JSON-Daten zurück.
## Installation
### 1. Repository klonen
```bash
git clone <repository-url>
cd watchdog-docker
```
### 2. Konfiguration anpassen
Bearbeite `config/config.yaml`:
#### OPNsense Einstellungen
```yaml
opnsense:
host: "https://192.168.1.1" # Deine OPNsense IP
api_key: "YOUR_API_KEY_HERE"
api_secret: "YOUR_API_SECRET_HERE"
verify_ssl: false # Auf true setzen bei gültigem Zertifikat
```
#### Admin-Passwort generieren
Passwort-Hash für das Web-Interface generieren:
```python
from werkzeug.security import generate_password_hash
# Ersetze 'dein_passwort' mit deinem gewünschten Passwort
password = "dein_passwort"
hash = generate_password_hash(password)
print(hash)
```
Kopiere den generierten Hash in die `config.yaml`:
```yaml
web:
admin_password_hash: "scrypt:32768:8:1$..." # Dein generierter Hash
```
#### E-Mail Konfiguration (optional)
```yaml
email:
enabled: true
smtp_server: "mail.yourdomain.com"
smtp_port: 587
smtp_use_tls: true
smtp_username: "watchdog@yourdomain.com"
smtp_password: "YOUR_PASSWORD"
from_address: "watchdog@yourdomain.com"
to_addresses:
- "admin@yourdomain.com"
```
Falls du keine E-Mails versenden möchtest, setze `enabled: false`.
#### Monitoring-Einstellungen
```yaml
monitoring:
polling_interval: 60 # Sekunden zwischen Checks
# Nur bestimmte Interfaces überwachen (leer = alle)
monitored_interfaces:
- lan
- wan
# Events ein/ausschalten
events:
dhcp_leases: true
new_devices: true
interface_status: true
gateway_status: true
```
### 3. Docker Container starten
```bash
# Container bauen und starten
docker-compose up -d
# Logs anzeigen
docker-compose logs -f
# Status prüfen
docker-compose ps
```
### 4. Web-Interface öffnen
Öffne im Browser: `http://localhost:5000`
- **Benutzername:** `admin`
- **Passwort:** Dein konfiguriertes Passwort
## Verzeichnisstruktur
```
watchdog-docker/
├── Dockerfile # Docker Image Definition
├── docker-compose.yml # Docker Compose Konfiguration
├── requirements.txt # Python Dependencies
├── README.md # Diese Datei
├── config/
│ └── config.yaml # Hauptkonfiguration
├── app/
│ ├── main.py # Flask App & Routes
│ ├── opnsense_api.py # OPNsense API Client
│ ├── monitor.py # Event Monitoring Logik
│ ├── database.py # SQLite Datenbank Handler
│ ├── email_handler.py # E-Mail Versand
│ └── templates/
│ ├── login.html # Login-Seite
│ └── dashboard.html # Dashboard
└── data/ # Auto-generiert beim ersten Start
├── watchdog.db # SQLite Datenbank
└── watchdog.log # Log-Datei
```
## API Endpoints
Das Dashboard verwendet folgende REST-API Endpoints:
- `GET /api/events` - Events abrufen
- Parameter: `limit`, `type`, `interface`
- `GET /api/stats` - Statistiken abrufen
- `GET /health` - Health Check
Beispiel:
```bash
curl http://localhost:5000/api/events?type=dhcp_lease&limit=10
```
## Datenbank
Die SQLite-Datenbank wird automatisch beim ersten Start erstellt.
### Tabellen
#### events
| Spalte | Typ | Beschreibung |
|--------|-----|--------------|
| id | INTEGER | Primary Key |
| timestamp | DATETIME | Event-Zeitpunkt |
| type | TEXT | Event-Typ |
| interface | TEXT | Interface-Name |
| details | TEXT | Event-Details |
| data | JSON | Vollständige Event-Daten |
#### known_devices
| Spalte | Typ | Beschreibung |
|--------|-----|--------------|
| mac | TEXT | MAC-Adresse (Primary Key) |
| name | TEXT | Geräte-Name |
| first_seen | DATETIME | Erstmals gesehen |
| last_seen | DATETIME | Zuletzt gesehen |
### Datenbank-Wartung
Alte Events werden automatisch nach der konfigurierten Retention-Zeit gelöscht (Standard: 90 Tage).
## E-Mail Benachrichtigungen
### Event-Typen
- **DHCP Lease** 🔵 - Neue IP-Vergabe
- **New Device** 🔴 - Unbekanntes Gerät (nur bei unbekannten Geräten)
- **Interface Status** ⚠️ - Interface up/down
- **Gateway Status** ⚠️ - Gateway-Änderungen
### E-Mail Beispiel
![Email Notification](docs/email-example.png)
Jede E-Mail enthält:
- Event-Typ mit Icon
- Zeitpunkt
- Interface/Gateway
- IP, MAC, Hostname (bei Geräten)
- Detaillierte Beschreibung
## Troubleshooting
### Container startet nicht
```bash
# Logs prüfen
docker-compose logs
# Container Status
docker-compose ps
```
### OPNsense API-Verbindung schlägt fehl
1. Prüfe ob OPNsense erreichbar ist:
```bash
ping 192.168.1.1
```
2. Teste API manuell:
```bash
curl -k -u "KEY:SECRET" https://192.168.1.1/api/core/menu/search/
```
3. Prüfe Firewall-Regeln auf OPNsense
### Keine E-Mails werden versendet
1. Prüfe SMTP-Einstellungen in `config.yaml`
2. Teste SMTP-Verbindung:
```bash
telnet mail.yourdomain.com 587
```
3. Prüfe Container-Logs auf SMTP-Fehler
### Login funktioniert nicht
1. Prüfe ob Passwort-Hash korrekt generiert wurde
2. Versuche neuen Hash zu generieren:
```python
from werkzeug.security import generate_password_hash
print(generate_password_hash("dein_passwort"))
```
3. Hash in `config.yaml` ersetzen und Container neu starten
### Dashboard zeigt keine Events
1. Prüfe ob Monitoring läuft:
```bash
docker-compose logs | grep "Monitoring started"
```
2. Prüfe ob OPNsense API antwortet:
```bash
docker-compose logs | grep "OPNsense"
```
3. Erhöhe Log-Level auf DEBUG in `config.yaml`:
```yaml
logging:
level: "DEBUG"
```
## Update
```bash
# Container stoppen
docker-compose down
# Neueste Version pullen
git pull
# Container neu bauen und starten
docker-compose up -d --build
```
**Hinweis:** Die Datenbank (`data/watchdog.db`) bleibt bei Updates erhalten.
## Backup
### Datenbank sichern
```bash
# Backup erstellen
docker-compose exec watchdog sqlite3 /app/data/watchdog.db ".backup /app/data/backup.db"
# Backup aus Container kopieren
docker cp watchdog:/app/data/backup.db ./backup.db
```
### Konfiguration sichern
```bash
# Config sichern
cp config/config.yaml config/config.yaml.backup
```
## Sicherheitshinweise
- ⚠️ Ändere das `secret_key` in der `config.yaml`
- ⚠️ Verwende ein sicheres Admin-Passwort
- ⚠️ Aktiviere SSL-Verifizierung (`verify_ssl: true`) in Produktion
- ⚠️ Verwende HTTPS für das Web-Interface (z.B. mit Reverse Proxy)
- ⚠️ Speichere keine API-Secrets in Git (nutze `.env` Dateien)
## Entwicklung
### Lokale Entwicklung ohne Docker
```bash
# Virtual Environment erstellen
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Dependencies installieren
pip install -r requirements.txt
# App starten
python app/main.py
```
### Tests
```bash
# OPNsense API Connection testen
python -c "from app.opnsense_api import OPNsenseAPI; import yaml; config = yaml.safe_load(open('config/config.yaml')); api = OPNsenseAPI(**config['opnsense']); print(api.test_connection())"
```
## Support
Bei Problemen oder Fragen:
1. Prüfe die [Troubleshooting](#troubleshooting) Sektion
2. Aktiviere DEBUG-Logging und prüfe die Logs
3. Erstelle ein Issue mit:
- Container-Logs (`docker-compose logs`)
- Konfiguration (ohne Secrets!)
- Fehlerbeschreibung
## Lizenz
MIT License
## Changelog
### v0.1 (Initial Release)
- OPNsense Monitoring (DHCP, Devices, Interfaces, Gateways)
- Web Dashboard mit Echtzeit-Updates
- E-Mail Benachrichtigungen
- SQLite Datenbank
- Docker Support