Print
Category: OPNsense
Hits: 16397

Wer regelmäßig Änderungen an der Konfiguration einer OPNsense Firewall durchführt, der tut gut daran diese zu sichern. Das einfachste wäre die schon vorhandene Option zum Download der Konfigurationsdatei über die GUI durchzuführen, doch das wird schnell etwas mühselig, gerade dann, wenn der Bedarf an Sicherungen hoch ist. Die anderen Methoden etwa mit Hilfe von Google Drive oder Nextcloud sind meines Erachtens nicht optimal. Eine Nextcloud Instanz besitzt nicht jeder und ein Aufsetzten ist mühselig. Und auch das Hochladen der Konfiguration in die Google Cloud ist nicht jedermanns Sache. Wünschenswert wäre eher eine flexiblere Lösung etwa über einen secure Shell Dienst wie scp. Damit lässt sich ein z.B. ein Ziel im heimischen Netzwerk ansteuern, etwa ein ungenutzter Raspberry pi. Eine Implementierung dieser Art in der OPNsense ist zwar seit längerem vorgesehen, bisher aber nicht umgesetzt worden. Selbst in dem Buch "Der OPNsense Praktiker" wird der Vorschlag diskutiert.

Wollen wir also einen entsprechenden ssh Dienst implementieren, ist einiges an Vorarbeit zu erledigen. Zunächst stellt der ssh Dienst heutzutage den Standard dar, wenn es ums sichere Verbinden übers Netzwerk geht. Er bildet auch die Grundlage für das sichere Übertragen von Dateien mittels der Kopierfunktion scp. Bei der Verwendung von scp verläuft die gegenseitige Authentifizierung und die Übertragung der Daten entweder per Passwort oder per Schlüsselpaar gesichert ab. Sensible Daten wie etwa unsere Konfigurationsdateien können damit sicher über das Netzwerk bewegt werden.

Die Kopierfunktion scp ist standardmäßig nicht auf die Verwendung von Schlüsselpaaren eingerichtet, sondern es wird auf ein Passwort zurückgegriffen, um den Benutzer zu authentifizieren. Dies ist aber für eine automatisierte Übertragung von Daten jedoch nicht geeignet. Stattdessen brauchen wir für unseren Fall ein Schlüsselpaar welches die Verbindung von Client und Server sicherstellt. Das Schlüsselpaar wird zunächst generiert und anschließend der öffentliche Teil des Schlüssels auf unseren Server übertragen. Der ssh Dienst verfügt für diese Funktion normalerweise über ein eigenes Tool mit sich. Der OPNsense fehlt jedoch die Funktionalität zur Übertragung des Schlüssels. Deshalb sei an dieser Stelle darauf hingewiesen, dass wir die Copy/Paste Methode anwenden müssen. Zudem werden die ansonsten automatisiert eingerichteten Verzeichnisberechtigungen nicht durchgeführt, was nachgeholt werden muss.

Sind die Vorarbeiten soweit abgeschlossen können wir das Skript, welches uns dankenswerterweise vom User TheEvilCoder42 von zum Download angeboten wird herunterladen. Sind die entsprechenden Anpassungen am Skript vorgenommen und dieses ins richtige Verzeichnis unserer OPNsense kopiert worden, erscheint in der GUI unserer Firewall der Befehl "Backup config file".

Vorgehensweise:

1. Generierung des öffentlichen/privaten Schlüsselpaares
2. Übertragung des öffentlichen Schlüssels auf den Server
3. Deaktivieren des Zugangs mittels Passwortauthentifizierung
4. Vergabe der korrekten Verzeichnisberechtigungen am Klienten
5. Abspeichern des Shell Scripts und der Konfigurationsdatei
6. Anlegen eines Backup Jobs

1. auf unserem Klient Rechner manövrieren wir in das /.ssh Verzeichnis und generieren zunächst das Schlüsselpaar mit dem folgenden Befehl:

ssh-keygen -t ras -b 4096

Als Dateinamen benutzen wir id_rsa. Die Vergabe eines sicheren Passworts für usenren Key ist optional und wird an dieser Stelle übersprungen.

2. Mit dem Befehl

nano .ssh/id_rsa.pub

kopieren wir den öffentlichen Schlüssel und fügen diesen auf unserem Server in die Datei .ssh/authorized_keys im Homeverzeichnis hinzu. Die Verwendung des nano Editors ist besonders einfach und kann manuell nachinstalliert werden, falls noch nicht geschehen. Mit den nun folgenden Befehlen definieren wir die Verzeichnisberechtigungen.

chmod 700 .ssh
chmod 600 .ssh/authorized-keys

3. Zum Deaktivieren des Zugangs mittels Passwort öffnen wir auf unserem Server die Datei sshd_config und suchen nach folgenden Einträgen und passen diese an:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

Um die Änderungen anzuwenden starten wir den SSH Dienst neu

sudo systemctl reload sshd

4. Es kann passieren, dass eine Fehlermeldung wie folgt auftritt:

Permissions 0777 for '/users/username/.ssh/id_rsa' are too open.

Die Verwendung anderer Datei- und Verzeichnisberechtigungen am Klient Rechner ist oft die Lösung. Dazu verwenden wir den Befehl:

chmod 400 ~/verzeichnis-rsa-key

5. Um unser Shell Skript nutzen zu können verbinden wir uns etwa mit putty auf unsere OPNsense. Danach starten wir eine Shell und wechseln in das Verzeichnis

cd /usr/local/opnsense/service/conf/actions.d/

Dort erstellen wir eine Datei mit dem Namen actions_scp-backup.conf.

touch actions_scp-backup.conf

Danach kopieren wir den Inhalt der Datei, wie sie unter github.com/TheEvilCoder42/actions_scp-backup.conf zu finden ist. Folgende Änderung ist vorzunehmen:

wir ersetzten den Eintrag {USER} mit dem Namen des Users welcher den SSH-Key zum Backup Server besitzt, in unserem Fall root.

Danach starten wir unseren Dienst neu

service configd restart

Als nächstens laden wir uns die Datei scp-backup.sh herunter und kopieren sie in das Verzeichnis /usr/home/. Wir passen unsere Datei wie folgt an:

Wir ersetzen {USERID} mit der ID des {USERS} und tragen für {HOST} die IP-Adresse unseres Servers ein. Die gesamte Datei sieht anschließend wie folgt aus:

#!/bin/sh

if [ $(id -u) -eq 0 ]; then
        APPENDIX="$(hostname)-$(date +"%Y%m%dT%H%M%S")"

        echo "Uploading config-$APPENDIX.xml"
        scp /conf/config.xml This email address is being protected from spambots. You need JavaScript enabled to view it.:/home/pi/config-$APPENDIX.xml
        #sftp {USER}@{HOST}:{PATH} <<< $"put /conf/config.xml config-$APPEND>
fi


6. Als letzten Schritt verbinden wir uns auf die GUI der OPNsense und fügen unter System -> Einstellungen -> Cron einen neuen Eintrag hinzu. Als Befehl nutzen wir "Backup config file"


Einzelnachweise:
https://github.com/TheEvilCoder42/opnsense-scp-backup/blob/master/scp-backup.sh
https://stackoverflow.com/questions/9270734/ssh-permissions-are-too-open-error
https://docs.opnsense.org/manual/software_included.html