# Sicherung und Wiederherstellung — barox SecPen

## 1 Was gesichert werden muss

| Gegenstand | Ort | Kritikalität |
|---|---|---|
| Datenbank | MariaDB/MySQL `barox_secpen` | **hoch** — Geräte, Scans, Findings, Audit-Log |
| `.env` | `/var/www/html/barox-secpen/.env` | **hoch** — enthält `APP_KEY`; ohne ihn sind alle verschlüsselten Zugangsdaten verloren |
| Rohdaten | `/var/lib/barox-secpen/scans` | mittel — Nmap-XML und `.nessus`, Nachweisgrundlage |
| Berichte | `/var/lib/barox-secpen/reports` | mittel — reproduzierbar, solange die Datenbank existiert |
| Anhänge | `/var/lib/barox-secpen/attachments` | mittel |
| Logs | `/var/log/barox-secpen`, `storage/logs` | niedrig, aber Audit-Log lange aufbewahren |

Der Programmcode selbst muss nicht gesichert werden (Repository), die `.env`
dagegen unbedingt — und **getrennt verschlüsselt**.

---

## 2 Tägliche Sicherung

```bash
#!/usr/bin/env bash
# /usr/local/sbin/barox-secpen-backup.sh
set -euo pipefail

APP_DIR=/var/www/html/barox-secpen
DEST=/var/backups/barox-secpen
STAMP="$(date +%Y%m%d-%H%M%S)"
KEEP_DAYS=30

mkdir -p "$DEST"

DB_NAME=$(grep -E '^DB_DATABASE=' "$APP_DIR/.env" | cut -d= -f2- | tr -d '"')
DB_USER=$(grep -E '^DB_USERNAME=' "$APP_DIR/.env" | cut -d= -f2- | tr -d '"')
DB_PASS=$(grep -E '^DB_PASSWORD=' "$APP_DIR/.env" | cut -d= -f2- | tr -d '"')

# Datenbank (konsistent, ohne Sperren)
MYSQL_PWD="$DB_PASS" mysqldump --single-transaction --quick --routines --events \
    --user="$DB_USER" "$DB_NAME" | gzip -9 > "$DEST/db-$STAMP.sql.gz"

# Konfiguration (enthält APP_KEY - eingeschraenkte Rechte!)
install -m 0600 "$APP_DIR/.env" "$DEST/env-$STAMP.bak"

# Rohdaten und Berichte
tar -czf "$DEST/data-$STAMP.tar.gz" -C /var/lib barox-secpen

# Pruefsummen
( cd "$DEST" && sha256sum "db-$STAMP.sql.gz" "data-$STAMP.tar.gz" "env-$STAMP.bak" \
    > "checksums-$STAMP.txt" )

find "$DEST" -type f -mtime +$KEEP_DAYS -delete
chmod 600 "$DEST"/*
```

Zeitplan (root-Crontab):

```
15 2 * * * /usr/local/sbin/barox-secpen-backup.sh >> /var/log/barox-secpen/backup.log 2>&1
```

**Auslagern.** Die Sicherung gehört auf ein anderes System — sie enthält
Schwachstellendaten von Kundenanlagen und ist entsprechend zu behandeln
(verschlüsselte Übertragung, verschlüsselte Ablage, Zugriff nur für Berechtigte).

---

## 3 Wiederherstellung

### 3.1 Vollständig (neuer Server)

```bash
# 1. Grundinstallation
sudo bash deploy/install.sh          # Datenbank NICHT anlegen lassen

# 2. Dienste stoppen
sudo systemctl stop barox-secpen-worker barox-secpen-health
sudo systemctl stop barox-secpen-scheduler.timer

# 3. Konfiguration zurückspielen (enthält APP_KEY)
sudo install -o barox -g barox -m 0640 /pfad/env-20250113-021500.bak \
    /var/www/html/barox-secpen/.env

# 4. Datenbank
sudo mysql -e "CREATE DATABASE IF NOT EXISTS barox_secpen \
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
gunzip -c /pfad/db-20250113-021500.sql.gz | sudo mysql barox_secpen

# 5. Rohdaten
sudo tar -xzf /pfad/data-20250113-021500.tar.gz -C /var/lib
sudo chown -R barox:barox /var/lib/barox-secpen

# 6. Caches und Prüfung
cd /var/www/html/barox-secpen
sudo -u barox php artisan config:cache
sudo -u barox php artisan migrate --force
sudo -u barox php artisan barox:preflight
sudo -u barox php artisan barox:audit-verify

# 7. Dienste starten
sudo systemctl start barox-secpen-worker barox-secpen-health
sudo systemctl start barox-secpen-scheduler.timer
```

### 3.2 Nur Datenbank

```bash
sudo systemctl stop barox-secpen-worker barox-secpen-health
sudo mysqldump --single-transaction barox_secpen | gzip > /var/backups/vor-restore.sql.gz
sudo mysql -e "DROP DATABASE barox_secpen; CREATE DATABASE barox_secpen \
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
gunzip -c /pfad/db-*.sql.gz | sudo mysql barox_secpen
sudo -u barox php artisan barox:audit-verify
sudo systemctl start barox-secpen-worker barox-secpen-health
```

### 3.3 Nach einem Restore prüfen

- [ ] Anmeldung funktioniert
- [ ] `barox:preflight` ohne Fehler
- [ ] `barox:audit-verify` meldet eine unversehrte Kette
- [ ] Ein Testgerät zeigt seine Zugangsdaten als „hinterlegt“ an
      (falscher `APP_KEY` fällt hier sofort auf)
- [ ] Ein bestehender Bericht lässt sich herunterladen
- [ ] Ein Erreichbarkeitsscan gegen ein Laborgerät läuft durch

---

## 4 Wichtige Hinweise

**Ohne `APP_KEY` keine Zugangsdaten.** Datenbank und `.env` gehören zusammen.
Wird nur die Datenbank zurückgespielt, bleiben SNMP-Communities und
Nessus-Schlüssel unlesbar und müssen neu eingetragen werden.

**Audit-Kette und Teil-Restore.** Wird die Datenbank auf einen älteren Stand
zurückgesetzt, während neuere Einträge bereits geschrieben waren, meldet
`barox:audit-verify` eine Abweichung. Das ist beabsichtigt: Es dokumentiert,
dass der Protokollverlauf nicht mehr lückenlos ist. Den Vorgang schriftlich
festhalten.

**Aufbewahrung.** Für Kundenprüfungen empfiehlt sich mindestens die
Aufbewahrungsfrist des Prüfauftrags, üblicherweise drei Jahre für Berichte und
Audit-Log sowie ein Jahr für Rohdaten (`SCAN_KEEP_RAW_DAYS`).

**Regelmässig testen.** Eine Sicherung, deren Rücksicherung nie geprüft wurde,
ist keine Sicherung. Empfehlung: halbjährlich auf einem Testsystem.
