- Mitglied seit
- 18. Jan 2021
- Beiträge
- 24
- Punkte für Reaktionen
- 14
- Punkte
- 59
Hallo zusammen,
ich wollte gerne dass meine DS verschlüsselt ist, sich beim hochfahren selbst entschlüsselt und wenn sie geklaut wird und beim Dieb wieder an den Strom kommt sich selbst nicht entschlüsseln kann.
Das habe ich geschafft umzusetzen und ich möchte hier beschreiben wie, für alle, die sich etwas ähnliches bauen möchten.
Wie habe ich es gelöst?
Ich habe auf einem extra Server (ein Raspberry PI reicht) einen Webserver installiert, der auf Anfrage einer bestimmten ID von einer bestimmten IP hin einenen String (bzw. ein Passwort) zurückliefert.
Meine DS fragt kurz nach dem Hochfahren die Passwörter der geteilten Ordner ab und entschlüsselt diese dann.
Da der extra Server nur in meinem lokalen Netzwerk zu erreichen ist, kann sich die DS nicht entschlüsseln, sollte sie geklaut werden.
Was habe ich getan, um die Passwörter auf dem extra Server zu sichern?
Auf dem extra Server habe ich das verzeichniss, auf dem der Webserver und die Passwörter liegen verschlüsselt. Hier muss bei einem Neustart das Passwort von Hand eingegeben werden um den Webserver wieder starten zu können. Da dieser Server bei mir nur diese eine Aufgabe hat, läuft er eh 24/7. Außerdem bleiben die Daten so auch dann sicher, wenn ein Dieb die DS und den extra Server klaut.
Die Kommunikation zwischen dem extra Server und der DS läuft verschlüsselt über https, so wird auch im Netzwerk selbst das Mitlesen erschwert. Zwar läuft es über ein selbst signiertes Zertifikat, aber anders geht es in meinem lokalen Netzwerk nicht.
Außerdem gibt der extra Server nur dann ein Passwort raus, wenn der richtigte Identifier genannt wird und nur dann, wenn die Anfrage von der richtigen IP kommt.
BTW: es wird wirklich nicht viel Leistung und Bandbreite genutzt. Man kann es also ganz bequem auf einem Raspberry PI Zero W über Wifi machen. Dieser lässt sich Wunderbar irgendwo in der Wohnung verstecken.
Schritt für Schritt Anleitung
Da es unabhänig von der server Hardware funktioniert werde ich hier nicht erklären, wie ihr einen Raspberry PI aufsetzt. Dazu gibt es viele gute Anleitungen im Internet. Ebenfalls sollten die Ordner auf eurer DS bereits verschlüsselt sein (wie das geht erkläre ich hier nicht).
1. Per SSH auf den extra Server aufschalten und erstmal die Paketquellen und alles weitere aktualisieren
2. Die benötigten Programme installieren. Wir brauchen NodeJS und NPM für den Webserver. EcryptFS brauchen wird um einen Ordner zu verschlüsseln.
3. Einen neuen Ordner anlegen und verschlüsseln. Wo, ist eigentlich egal. Mein Ordner heißt hier und im Folgenden "crypt".
1 ; PASSWORT_EINGEBEN ; enter ; enter ; enter ; enter ; yes ; yes
4. In den jetzt neuen und jetzt geschützten Ordner gehen
5. Ein selbst signiertes Schlüsselpaar erzeugen.
6. package.json für den Webserver anlegen. Das ist eine Datei die den Server beschreibt und welche Abhänigkeiten benötigt werden.
7. server.js erstellen. Das ist der eigentliche Webserver.
Ändern müsst ihr:
NAS_IP -> Die feste IP von eurer DS.
FOLDER_A_IDENTIFIER -> eine art Passwort, dass eure DS dem Server nennen wird um das richtige Passwort für den Ordner A zu bekommen. (Müsst ihr euch ausdenken/generieren lassen)
FOLDER_A_PW -> Das Passwort, das die DS braucht um den Ordner A zu entschlüsseln.
Die letzten zwei gibt es auch für folder B. Je nachdem wie viele verschiedene Ordner mit unterschiedlichen Passwörter ihr hab, müsst ihr die den "else if" Teil dublizieren oder löschen. (Sorry für alle die noch nie Programmiert haben. Vielleicht schreibe ich den Code mal um wenn ich Zeit habe, so das dieser Schritt weniger kompliziert ist.)
8. Den Webserver starten und ausloggen.
Damit wäre der extra Server fertig.
Wichtig ist, der Server muss immer die gleich IP in eurem Netzwerk bekommen.
Das könnt in eurem Router einstellen. (Euere DS muss ebenfalls eine feste IP haben.)
Was, wenn der extra Server neugestartet wird?
Wird dieser Server neugestartet müsst ihr die folgenden Schritte wiederholen.
0. Per SSH auf den Server verbinden.
1. Ordner entschlüsseln (hier wieder ein paar Eeingaben: 1 ; PASSWORT_EINGEBEN ; enter ; enter ; enter ; enter )
An der DS
Hier müsst ihr in eurem Aufgabenplaner (Systemsteuerung->Aufgabenplaner) einen "Ausgelöste Aufgabe" erstellen.
Hier müsst ihr einen Namen geben.
Die Aufgabe muss als root ausgeführt werden.
Und das Ereignis soll Hochfahren sein.
Dann geht ihr Oben auf "Aufgabeneinstellungen" und fügt dort das folgende Script ein:
FOLDER_IDENTIFIER müsst ihr zu dem ändern, was ihr in der "server.js" für diesen Ordner eingetragen habt.
SERVER_IP muss die feste IP des extra Servers ein.
OK anklicken und Fertig.
Wenn ihr mehr als einen Ordner entschlüsselt haben wollt, könnt ihr entweder mehrere Aufgaben im Aufgabenplaner erstellen oder in einer Aufgabe das Script mehrmal untereinander einfügen und jeweils den Ordnernamen und Identifier ändern.
Liebe Moderatoren, könntet ihr bitten den folgenden Teil oben einarbeiten? Oder noch besser, mir dauerhaft das Recht geben den Beitrag da oben zu bearbeiten. Dann kann ich den selbst pflegen. Da sind z.B. nochn paar Tippfehler drin vielleicht aktualisiere ich auch mal den Code.
Danke
Wichtig!
Manche Pakete müssen nach dem Entschlüssel nochmal extra gestartet werden. Zum Beipsiel die Webstation. Dafür müsst ihr in der geplanten Aufgabe zum Entschlüsseln nach dem:
Ich habe es bisher nur bei der Webstation und Apache beobachtet. Docker z.B. lief einwandfrei auch ohne die extra Zeile in der geplanten Aufgabe.
Hier eine Auflistung der meisten Paketnamen:
Eine vollständige Auflistung findet ihr hier:
https://tech.setepontos.com/2018/03/25/control-synology-dsm-services-via-terminal-ssh/
ich wollte gerne dass meine DS verschlüsselt ist, sich beim hochfahren selbst entschlüsselt und wenn sie geklaut wird und beim Dieb wieder an den Strom kommt sich selbst nicht entschlüsseln kann.
Das habe ich geschafft umzusetzen und ich möchte hier beschreiben wie, für alle, die sich etwas ähnliches bauen möchten.
Wie habe ich es gelöst?
Ich habe auf einem extra Server (ein Raspberry PI reicht) einen Webserver installiert, der auf Anfrage einer bestimmten ID von einer bestimmten IP hin einenen String (bzw. ein Passwort) zurückliefert.
Meine DS fragt kurz nach dem Hochfahren die Passwörter der geteilten Ordner ab und entschlüsselt diese dann.
Da der extra Server nur in meinem lokalen Netzwerk zu erreichen ist, kann sich die DS nicht entschlüsseln, sollte sie geklaut werden.
Was habe ich getan, um die Passwörter auf dem extra Server zu sichern?
Auf dem extra Server habe ich das verzeichniss, auf dem der Webserver und die Passwörter liegen verschlüsselt. Hier muss bei einem Neustart das Passwort von Hand eingegeben werden um den Webserver wieder starten zu können. Da dieser Server bei mir nur diese eine Aufgabe hat, läuft er eh 24/7. Außerdem bleiben die Daten so auch dann sicher, wenn ein Dieb die DS und den extra Server klaut.
Die Kommunikation zwischen dem extra Server und der DS läuft verschlüsselt über https, so wird auch im Netzwerk selbst das Mitlesen erschwert. Zwar läuft es über ein selbst signiertes Zertifikat, aber anders geht es in meinem lokalen Netzwerk nicht.
Außerdem gibt der extra Server nur dann ein Passwort raus, wenn der richtigte Identifier genannt wird und nur dann, wenn die Anfrage von der richtigen IP kommt.
BTW: es wird wirklich nicht viel Leistung und Bandbreite genutzt. Man kann es also ganz bequem auf einem Raspberry PI Zero W über Wifi machen. Dieser lässt sich Wunderbar irgendwo in der Wohnung verstecken.
Schritt für Schritt Anleitung
Da es unabhänig von der server Hardware funktioniert werde ich hier nicht erklären, wie ihr einen Raspberry PI aufsetzt. Dazu gibt es viele gute Anleitungen im Internet. Ebenfalls sollten die Ordner auf eurer DS bereits verschlüsselt sein (wie das geht erkläre ich hier nicht).
1. Per SSH auf den extra Server aufschalten und erstmal die Paketquellen und alles weitere aktualisieren
sudo apt update
sudo apt upgrade
2. Die benötigten Programme installieren. Wir brauchen NodeJS und NPM für den Webserver. EcryptFS brauchen wird um einen Ordner zu verschlüsseln.
sudo apt install nodejs
sudo apt install npm
sudo apt install ecryptfs-utils
3. Einen neuen Ordner anlegen und verschlüsseln. Wo, ist eigentlich egal. Mein Ordner heißt hier und im Folgenden "crypt".
Beim zweiten Befehl werdet ihr nach ein paar Eingaben gefragt. Diese könnt ihr wie folgt abhandeln:mkdir crypt
sudo mount -t ecryptfs crypt/ crypt/
1 ; PASSWORT_EINGEBEN ; enter ; enter ; enter ; enter ; yes ; yes
4. In den jetzt neuen und jetzt geschützten Ordner gehen
cd crypt/
5. Ein selbst signiertes Schlüsselpaar erzeugen.
Hier werden auch wieder Eingaben verlangt. Diese sind in unserem Fall egal. Ihr könnt also eintragen was ihr wollt oder einfach immer direkt Enter Drücken.openssl req -nodes -new -x509 -keyout server.key -out server.cert
6. package.json für den Webserver anlegen. Das ist eine Datei die den Server beschreibt und welche Abhänigkeiten benötigt werden.
Hier fügt ihr folgenden Inhalt ein:nano package.json
Für alle die den Editor nano nicht kennen: Ihr kommt wieder raus indem ihr Strg+x drückt und wenn ihr Speichern wollt, müsst ihr dann nochmal mit y bestätigen.{
"name": "crypt-pi",
"version": "0.2",
"description": "Network decryption service.",
"main": "server.js",
"author": "mergey",
"dependencies": {
"express": "^4.17.1"
}
}
7. server.js erstellen. Das ist der eigentliche Webserver.
Hier müsst ihr wieder etwas einfügen. Aus bequemlichkeit habe ich keine extra Konfigurationsdatei erstellt. Ihr müsst also ein paar Dinge in dieser Datei für euch napassen.nano server.js
Ändern müsst ihr:
NAS_IP -> Die feste IP von eurer DS.
FOLDER_A_IDENTIFIER -> eine art Passwort, dass eure DS dem Server nennen wird um das richtige Passwort für den Ordner A zu bekommen. (Müsst ihr euch ausdenken/generieren lassen)
FOLDER_A_PW -> Das Passwort, das die DS braucht um den Ordner A zu entschlüsseln.
Die letzten zwei gibt es auch für folder B. Je nachdem wie viele verschiedene Ordner mit unterschiedlichen Passwörter ihr hab, müsst ihr die den "else if" Teil dublizieren oder löschen. (Sorry für alle die noch nie Programmiert haben. Vielleicht schreibe ich den Code mal um wenn ich Zeit habe, so das dieser Schritt weniger kompliziert ist.)
/*
* Network decryption service
*
* @author mergey
* @version 0.2
*/
var expr = require('express');
var https = require('https');
var port = 4000;
var nasIP = 'NAS_IP';
var bodyParser = require('body-parser');
const fs = require('fs')
var app = expr();
app.disable('x-powered-by');
// needed for receiving post requests
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
https.createServer({
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.cert')
}, app).listen(port, () => {
console.log('Listening...')
});
// -------------------- website ---------------------------------------
app.get('/*', function (requ, resp) {
resp.send('wrong path');
});
app.post('/*', function (requ, resp) {
console.log(requ.body.id);
console.log(requ.ip);
if (requ.body.id === 'FOLDER_B_IDENTIFIER' && requ.ip.includes(nasIP)) {
console.log('ok'); // FOLDER A
resp.send('FOLDER_A_PW');
}
else if (requ.body.id === 'FOLDER_B_IDENTIFIER' && requ.ip.includes(nasIP)) {
console.log('ok'); // FOLDER B
resp.send('FOLDER_B_PW');
}
else{
console.log('fail');
resp.send('wrong path');
}
});
8. Den Webserver starten und ausloggen.
node server.js & logout
Damit wäre der extra Server fertig.
Wichtig ist, der Server muss immer die gleich IP in eurem Netzwerk bekommen.
Das könnt in eurem Router einstellen. (Euere DS muss ebenfalls eine feste IP haben.)
Was, wenn der extra Server neugestartet wird?
Wird dieser Server neugestartet müsst ihr die folgenden Schritte wiederholen.
0. Per SSH auf den Server verbinden.
1. Ordner entschlüsseln (hier wieder ein paar Eeingaben: 1 ; PASSWORT_EINGEBEN ; enter ; enter ; enter ; enter )
2. In den Ordner gehensudo mount -t ecryptfs crypt/ crypt/
3. Den Webserver starten und ausloggen.cd crypt/
node server.js & logout
An der DS
Hier müsst ihr in eurem Aufgabenplaner (Systemsteuerung->Aufgabenplaner) einen "Ausgelöste Aufgabe" erstellen.
Hier müsst ihr einen Namen geben.
Die Aufgabe muss als root ausgeführt werden.
Und das Ereignis soll Hochfahren sein.
Dann geht ihr Oben auf "Aufgabeneinstellungen" und fügt dort das folgende Script ein:
Ihr müsst FOLDER_NAME zu dem Namen des Ordners in eurer DS ändern, den ihr entschlüsseln wollt.synoshare --enc_mount FOLDER_NAME $( curl --data 'id=FOLDER_IDENTIFIER' --insecure https://SERVER_IP:4000 )
FOLDER_IDENTIFIER müsst ihr zu dem ändern, was ihr in der "server.js" für diesen Ordner eingetragen habt.
SERVER_IP muss die feste IP des extra Servers ein.
OK anklicken und Fertig.
Wenn ihr mehr als einen Ordner entschlüsselt haben wollt, könnt ihr entweder mehrere Aufgaben im Aufgabenplaner erstellen oder in einer Aufgabe das Script mehrmal untereinander einfügen und jeweils den Ordnernamen und Identifier ändern.
Liebe Moderatoren, könntet ihr bitten den folgenden Teil oben einarbeiten? Oder noch besser, mir dauerhaft das Recht geben den Beitrag da oben zu bearbeiten. Dann kann ich den selbst pflegen. Da sind z.B. nochn paar Tippfehler drin vielleicht aktualisiere ich auch mal den Code.
Danke
Wichtig!
Manche Pakete müssen nach dem Entschlüssel nochmal extra gestartet werden. Zum Beipsiel die Webstation. Dafür müsst ihr in der geplanten Aufgabe zum Entschlüsseln nach dem:
noch eine zweite Zeile einfügen, die da lautet:synoshare --enc_mount FOLDER_NAME $( curl --data 'id=FOLDER_IDENTIFIER' --insecure https://SERVER_IP:4000 )
beziehungsweise diese Zeile, wenn das Paket läuft, aber einen Neustart braucht:synoservicecfg --start PAKET_NAME
synoservice --restart PAKET_NAME
Ich habe es bisher nur bei der Webstation und Apache beobachtet. Docker z.B. lief einwandfrei auch ohne die extra Zeile in der geplanten Aufgabe.
Hier eine Auflistung der meisten Paketnamen:
pkgctl-Apache2.4
pkgctl-AudioStation
pkgctl-CMS
pkgctl-CloudSync
pkgctl-DNSServer
pkgctl-Docker
pkgctl-DownloadStation
pkgctl-FileStation
pkgctl-Git
pkgctl-HyperBackup
pkgctl-Java8
pkgctl-LogCenter
pkgctl-MariaDB
pkgctl-MariaDB10
pkgctl-Node.js_v4
pkgctl-PEAR
pkgctl-PHP5.6
pkgctl-PHP7.0
pkgctl-Plex Media Server
pkgctl-StorageAnalyzer
pkgctl-TextEditor
pkgctl-VPNCenter
pkgctl-WebStation
pkgctl-adminer
pkgctl-domoticz
pkgctl-filebot
pkgctl-filebot-node
pkgctl-git
pkgctl-python
pkgctl-sickrage
Eine vollständige Auflistung findet ihr hier:
https://tech.setepontos.com/2018/03/25/control-synology-dsm-services-via-terminal-ssh/
Zuletzt bearbeitet von einem Moderator: