- Go Agent (FreeBSD/amd64) fuer OPNsense - Go Backend (Linux/amd64) mit REST API + SQLite - Collector: Hardware, CPU, Memory, Disks, Network, Services, WireGuard, DHCP (KEA/ISC/dnsmasq), Routes, Gateways, Certificates, Plugins, Updates - Persistente Agent-ID - TLS + API-Key Auth - WebSocket-Infrastruktur (WIP): bidirektionaler Command-Kanal, TCP-Tunnel fuer Remote-Zugriff auf Firewall-WebUI - Lastenheft und README
323 lines
7.3 KiB
Markdown
323 lines
7.3 KiB
Markdown
# OPNsense RMM System
|
|
|
|
Remote Monitoring & Management System fuer OPNsense Firewalls.
|
|
|
|
## Ueberblick
|
|
|
|
Dieses System besteht aus zwei Komponenten:
|
|
|
|
- **Backend** (Go) - REST API Server mit TLS und SQLite-Datenbank, laeuft auf einem Linux-Server
|
|
- **Agent** (Go) - Laeuft auf OPNsense/FreeBSD, sammelt Systemdaten und sendet sie an das Backend
|
|
|
|
## Architektur
|
|
|
|
```
|
|
┌──────────────────┐ HTTPS (TLS) ┌──────────────────┐
|
|
│ OPNsense FW │ ────────────────────────► │ RMM Backend │
|
|
│ (FreeBSD) │ POST /agent/register │ (Linux) │
|
|
│ │ POST /agent/heartbeat │ │
|
|
│ rmm-agent │ │ REST API │
|
|
│ - Hardware │ │ SQLite DB │
|
|
│ - CPU/RAM │ │ :8443 │
|
|
│ - Disk/Net │ │ │
|
|
│ - Services │ │ 192.168.85.13 │
|
|
│ │ │ │
|
|
│ 192.168.85.33 │ │ │
|
|
└──────────────────┘ └──────────────────┘
|
|
```
|
|
|
|
## Voraussetzungen
|
|
|
|
- Go 1.22+
|
|
- make
|
|
- OpenSSL (fuer manuelle Zertifikat-Generierung)
|
|
- SSH-Zugang zu den Zielservern
|
|
|
|
## Build
|
|
|
|
```bash
|
|
# Beide Komponenten bauen
|
|
make all
|
|
|
|
# Nur Backend (linux/amd64)
|
|
make backend
|
|
|
|
# Nur Agent (freebsd/amd64)
|
|
make agent
|
|
|
|
# TLS-Zertifikate generieren (optional, Backend generiert automatisch)
|
|
make certs
|
|
```
|
|
|
|
Die Binaries landen in `build/`.
|
|
|
|
## Konfiguration
|
|
|
|
### Backend (`backend/config.yaml`)
|
|
|
|
```yaml
|
|
listen_addr: ":8443"
|
|
tls_cert: "certs/server.crt"
|
|
tls_key: "certs/server.key"
|
|
db_path: "rmm.db"
|
|
api_keys:
|
|
- "01532e5a7c9e70bf2757df77a2f5b9b9"
|
|
```
|
|
|
|
| Parameter | Env-Variable | Beschreibung |
|
|
|-------------|------------------|-------------------------------------|
|
|
| listen_addr | RMM_LISTEN_ADDR | Bind-Adresse (default: `:8443`) |
|
|
| tls_cert | RMM_TLS_CERT | Pfad zum TLS-Zertifikat |
|
|
| tls_key | RMM_TLS_KEY | Pfad zum TLS-Key |
|
|
| db_path | RMM_DB_PATH | Pfad zur SQLite-Datenbank |
|
|
| api_keys | - | Liste erlaubter API-Keys |
|
|
|
|
Das Backend generiert automatisch self-signed TLS-Zertifikate wenn keine vorhanden sind.
|
|
|
|
### Agent (`agent/config.yaml`)
|
|
|
|
```yaml
|
|
backend_url: "https://192.168.85.13:8443"
|
|
api_key: "01532e5a7c9e70bf2757df77a2f5b9b9"
|
|
interval_seconds: 60
|
|
agent_name: "opnsense-fw01"
|
|
insecure: true
|
|
```
|
|
|
|
| Parameter | Beschreibung |
|
|
|-----------------|-------------------------------------------------|
|
|
| backend_url | URL des Backend-Servers |
|
|
| api_key | API-Key fuer Authentifizierung |
|
|
| interval_seconds | Heartbeat-Intervall in Sekunden (default: 60) |
|
|
| agent_name | Name des Agents |
|
|
| insecure | TLS-Zertifikatpruefung ueberspringen |
|
|
|
|
## Deployment
|
|
|
|
### Backend (192.168.85.13)
|
|
|
|
```bash
|
|
make deploy-backend
|
|
```
|
|
|
|
Dies:
|
|
1. Baut das Backend fuer linux/amd64
|
|
2. Kopiert Binary + Config nach `/opt/rmm/`
|
|
3. Erstellt einen systemd-Service
|
|
4. Startet den Service
|
|
|
|
### Agent (192.168.85.33 / OPNsense)
|
|
|
|
```bash
|
|
make deploy-agent
|
|
```
|
|
|
|
Dies:
|
|
1. Baut den Agent fuer freebsd/amd64
|
|
2. Kopiert Binary + Config nach `/opt/rmm/`
|
|
3. Erstellt ein rc.d-Script
|
|
4. Aktiviert und startet den Service
|
|
|
|
## API-Dokumentation
|
|
|
|
Alle Endpoints erfordern den Header `X-API-Key` mit einem gueltigen API-Key.
|
|
|
|
### POST /api/v1/agent/register
|
|
|
|
Agent registrieren.
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"name": "opnsense-fw01",
|
|
"hostname": "fw01.local",
|
|
"ip": "192.168.85.33",
|
|
"opnsense_version": "OPNsense 24.1.1"
|
|
}
|
|
```
|
|
|
|
**Response (201):**
|
|
```json
|
|
{
|
|
"id": "a1b2c3d4e5f6...",
|
|
"message": "Agent erfolgreich registriert"
|
|
}
|
|
```
|
|
|
|
### POST /api/v1/agent/heartbeat
|
|
|
|
Systemdaten senden.
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"agent_id": "a1b2c3d4e5f6...",
|
|
"system_data": {
|
|
"hostname": "fw01.local",
|
|
"opnsense_version": "OPNsense 24.1.1",
|
|
"freebsd_version": "14.0-RELEASE-p5",
|
|
"uptime_seconds": 86400,
|
|
"hardware": {
|
|
"manufacturer": "Protectli",
|
|
"model": "VP2420",
|
|
"serial": "ABC123",
|
|
"bios_version": "1.0.0"
|
|
},
|
|
"cpu": {
|
|
"model": "Intel(R) Celeron(R) J6412 @ 2.00GHz",
|
|
"cores": 4,
|
|
"threads": 4,
|
|
"freq_mhz": 2000,
|
|
"usage_percent": 12.5
|
|
},
|
|
"memory": {
|
|
"total_bytes": 8589934592,
|
|
"used_bytes": 2147483648,
|
|
"free_bytes": 6442450944
|
|
},
|
|
"disks": [
|
|
{
|
|
"filesystem": "/dev/ada0p3",
|
|
"total_bytes": 107374182400,
|
|
"used_bytes": 5368709120,
|
|
"free_bytes": 93736247296,
|
|
"mount_point": "/"
|
|
}
|
|
],
|
|
"network_interfaces": [
|
|
{
|
|
"name": "igb0",
|
|
"role": "WAN",
|
|
"ip": "203.0.113.1",
|
|
"mac": "00:11:22:33:44:55",
|
|
"status": "up",
|
|
"rx_bytes": 1073741824,
|
|
"tx_bytes": 536870912
|
|
},
|
|
{
|
|
"name": "igb1",
|
|
"role": "LAN",
|
|
"ip": "192.168.1.1",
|
|
"mac": "00:11:22:33:44:56",
|
|
"status": "up",
|
|
"rx_bytes": 2147483648,
|
|
"tx_bytes": 1073741824
|
|
}
|
|
],
|
|
"services": [
|
|
{
|
|
"name": "configd",
|
|
"description": "",
|
|
"status": "running"
|
|
},
|
|
{
|
|
"name": "dhcpd",
|
|
"description": "",
|
|
"status": "running"
|
|
},
|
|
{
|
|
"name": "unbound",
|
|
"description": "",
|
|
"status": "running"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Response (200):**
|
|
```json
|
|
{
|
|
"message": "OK"
|
|
}
|
|
```
|
|
|
|
### GET /api/v1/agents
|
|
|
|
Alle registrierten Agents auflisten.
|
|
|
|
**Response (200):**
|
|
```json
|
|
[
|
|
{
|
|
"id": "a1b2c3d4e5f6...",
|
|
"name": "opnsense-fw01",
|
|
"hostname": "fw01.local",
|
|
"ip": "192.168.85.33",
|
|
"opnsense_version": "OPNsense 24.1.1",
|
|
"registered_at": "2024-01-28T10:00:00Z",
|
|
"last_heartbeat": "2024-01-28T12:30:00Z"
|
|
}
|
|
]
|
|
```
|
|
|
|
### GET /api/v1/agents/{id}
|
|
|
|
Agent-Details mit letzten Systemdaten.
|
|
|
|
**Response (200):**
|
|
```json
|
|
{
|
|
"agent": {
|
|
"id": "a1b2c3d4e5f6...",
|
|
"name": "opnsense-fw01",
|
|
"hostname": "fw01.local",
|
|
"ip": "192.168.85.33",
|
|
"opnsense_version": "OPNsense 24.1.1",
|
|
"registered_at": "2024-01-28T10:00:00Z",
|
|
"last_heartbeat": "2024-01-28T12:30:00Z"
|
|
},
|
|
"system_data": { ... }
|
|
}
|
|
```
|
|
|
|
### GET /api/v1/agents/{id}/system
|
|
|
|
Nur die aktuellen Systemdaten eines Agents.
|
|
|
|
**Response (200):**
|
|
```json
|
|
{
|
|
"hostname": "fw01.local",
|
|
"opnsense_version": "OPNsense 24.1.1",
|
|
"uptime_seconds": 86400,
|
|
"hardware": { ... },
|
|
"cpu": { ... },
|
|
"memory": { ... },
|
|
"disks": [ ... ],
|
|
"network_interfaces": [ ... ],
|
|
"services": [ ... ]
|
|
}
|
|
```
|
|
|
|
### DELETE /api/v1/agents/{id}
|
|
|
|
Agent entfernen.
|
|
|
|
**Response (200):**
|
|
```json
|
|
{
|
|
"message": "Agent geloescht"
|
|
}
|
|
```
|
|
|
|
### Fehlermeldungen
|
|
|
|
```json
|
|
{
|
|
"error": "unauthorized"
|
|
}
|
|
```
|
|
|
|
HTTP Status Codes:
|
|
- `200` - Erfolg
|
|
- `201` - Erstellt
|
|
- `400` - Ungueltige Anfrage
|
|
- `401` - Nicht autorisiert (fehlender/falscher API-Key)
|
|
- `404` - Nicht gefunden
|
|
- `500` - Server-Fehler
|
|
|
|
## Lizenz
|
|
|
|
Intern.
|