Sicherheit
Ein Tagebuch braucht Schutz, und ehrliche Worte darüber
In ein Tagebuch schreibt man, was sonst niemand wissen soll. Darum liegt in nexdiary alles verschlüsselt, jede Person mit eigenem Schlüssel, der zweite Faktor ist ab Werk Pflicht, und der Server prüft selbst, ob er fürs Internet bereit ist. Hier steht, was das schützt, und genauso, wo es aufhört.
Verschlüsselt, jede Person mit eigenem Schlüssel
Alles, was jemand in nexdiary schreibt, liegt verschlüsselt in der Datenbank. Das ist ab Werk so und lässt sich nicht abschalten.
Was verschlüsselt ist
Seiten mit Titel, Text, Tags, Werten und der Wahl des Titelbilds, Notizen und ihre Fragen, Entwürfe, die eigenen Werte und Fragen, Vorlagen, Antworten auf die Familienfrage, Zeitkapseln, Fotos samt Vorschau, der Zugang zu Immich, die Geräte für Benachrichtigungen und die Namen der API-Token.
Wie
Jede Person hat einen eigenen Datenschlüssel, der mit dem Hauptschlüssel der Installation verpackt ist. Jedes Feld wird einzeln mit AES-256-GCM versiegelt und an Person, Tabelle, Spalte und Zeile gebunden. Ein Text, den jemand in eine andere Zeile kopiert, lässt sich dort nicht öffnen. Wird ein Konto gelöscht, geht sein Schlüssel mit, und alles dieser Person ist danach unlesbar.
Was das schützt
Wer die Datenbank oder eine Sicherung öffnet, sieht nur Zeichensalat. Eine kopierte Datei, ein verlorenes Sicherungsmedium, ein neugieriger Blick in den Datenordner bringen niemandem etwas.
Was es nicht schützt
Der Hauptschlüssel liegt auf demselben Server, damit nexdiary selbst lesen kann, für die Suche, die Statistik, die KI und das Buch. Wer den ganzen Server in der Hand hat, kommt also hinein, und das sagt nexdiary in der Oberfläche auch selbst. Eine Ende-zu-Ende-Verschlüsselung ist es nicht. Für eine Familie, die sich ihren Server teilt, reicht das; wer niemandem traut, der den Server betreibt, sollte dort kein Tagebuch führen.
Gut zu wissenDie Schlüssel hängen nicht am Passwort. Wer sein Passwort zurücksetzt, verliert deshalb nichts von seinem Tagebuch.
Unverschlüsselt bleibt, was der Server zum Ordnen braucht: Kontoname, Anzeigename, Mailadresse, Rolle, Profilbild und Einstellungen wie Farbe und Zeitzone, dazu je Tag das Datum und die Zeitpunkte, je Notiz Datum und Uhrzeit, je Foto Datum und Größe, wer wem welchen Tag geteilt hat, bei Zeitkapseln Absender, Empfänger und Tage, und je Sitzung Adresse und Browser für die Geräteliste. Der Inhalt steht nirgends im Klartext.
Der Hauptschlüssel gehört getrennt aufbewahrt
Der Hauptschlüssel liegt auf dem Server als keys/master.key, nur für den Besitzer lesbar. Er ist mit Absicht in keiner Sicherung enthalten. Ohne ihn ist eine Sicherung nicht lesbar, auch nicht für den Betreiber.
- Sichern: Unter „Einstellungen“, „Sicherung“, Karte „Verschlüsselung“ lädt der Betreiber ihn mit „Hauptschlüssel sichern“ herunter. Dafür fragt nexdiary sein Passwort und seinen zweiten Faktor. Ohne eigenen zweiten Faktor gibt nexdiary den Schlüssel nicht heraus.
- Aufbewahren: getrennt von den Sicherungen, etwa im Passwortmanager oder auf einem Stick im Schrank. Wann er zuletzt gesichert wurde, zeigt die Karte und „Bereit fürs Internet?“.
- Beim Start: Fehlt der Schlüssel, passt er nicht oder liegt er am falschen Ort, startet nexdiary nicht und überschreibt nichts.
Gut zu wissenDie Sicherung selbst ist eine ZIP-Datei, die nicht verschlüsselt ist. Die Tagebücher darin sind es, aber Kontonamen, Mailadressen, Zeitpunkte und das Geheimnis des Servers, mit dem sich Mailpasswort, KI-Schlüssel und das Geheimnis des Anmeldeanbieters öffnen lassen, liegen offen darin. Behandle eine Sicherung deshalb wie etwas Vertrauliches. Ältere Sicherungen enthalten auch die Schlüssel von Konten, die inzwischen gelöscht sind. Wie Sicherung und Umzug gehen, steht in der Anleitung unter Sicherung.
Anmelden mit zweitem Faktor, ab Werk Pflicht
Ein erratenes oder gestohlenes Passwort soll nicht reichen, um ein Tagebuch zu lesen. Darum verlangt nexdiary ab Werk von jedem Konto, das sich mit Passwort anmeldet, einen zweiten Faktor.
Passwort und Code
Ein Passwort hat mindestens 12 Zeichen und wird mit Argon2id gespeichert. Gleich nach dem ersten Anmelden richtet jede Person einen Code aus einer Authenticator-App ein, erst dann geht es weiter. Danach zeigt nexdiary einmal acht Wiederherstellungscodes, die auf Papier gehören. Jeder bringt einmal hinein, wenn das Handy weg ist.
Passkeys
Mit einem Passkey meldest du dich mit Fingerabdruck, Gesicht oder der PIN des Geräts an, ohne Passwort und ohne Code. Ein Passkey zählt selbst als zwei Faktoren und lässt sich nicht abfischen. Bis zu zehn je Konto legst du unter „Mein Konto“, „Sicherheit“ an. Passkeys brauchen https und die öffentliche Adresse des Servers.
Der Betreiber kann die Pflicht unter „Einstellungen“, „Anmeldung“ mit „Zweiten Faktor verlangen“ abschalten. Er muss das mit seinem Passwort bestätigen, und „Bereit fürs Internet?“ meldet es danach als offen. Auch wer über einen Anmeldeanbieter wie authentik hereinkommt, richtet ab Werk hier einen zweiten Faktor ein, außer der Betreiber erklärt, dass der Anbieter selbst einen prüft.
Mit dem Haken „Auf diesem Gerät angemeldet bleiben“, der vorgewählt ist, endet eine Anmeldung erst nach 30 Tagen ohne Nutzung. Ohne den Haken endet sie mit dem Browser, spätestens nach 12 Stunden. Die Fehlermeldung beim Anmelden verrät nie, ob der Name oder das Passwort falsch war.
Du siehst, wo du angemeldet bist
Angemeldete Geräte
Unter „Mein Konto“, „Sicherheit“ steht jedes Gerät, auf dem dein Konto angemeldet ist, mit Browser, Netz und letzter Nutzung. Jedes lässt sich einzeln abmelden, und „Überall sonst abmelden“ beendet alle anderen auf einmal. Wer sein Passwort ändert, meldet damit ebenfalls alle anderen Geräte ab.
Bescheid bei einer neuen Anmeldung
Meldet sich dein Konto in einem Browser an, der noch nie mit ihm angemeldet war, bekommst du Bescheid, per Push auf deine Geräte und per Mail, wenn ein Mailserver eingerichtet ist und dein Konto eine Adresse hat. Darin steht, welches Gerät, welcher Browser, ungefähr von wo und wann. Antippen führt zu „Mein Konto“, „Sicherheit“, wo du das Gerät mit einem weiteren Tipp abmeldest.
„Ungefähr von wo“ heißt das Netz, auf seine ersten Stellen gekürzt, ohne Ortsabfrage bei einem fremden Dienst. Der Schalter „Bei einer neuen Anmeldung Bescheid geben“ ist ab Werk an.
Raten lohnt sich nicht
Nach fünf falschen Anmeldeversuchen wartet das Konto 15 Minuten, und die Adresse, von der die Versuche kamen, ebenso. Jeder Versuch steht im Log. Einstellen lässt sich das nicht, es ist immer an.
- Du sperrst dich nicht aus, wenn ein Fremder dein Konto mit Raten blockiert. Ein Browser, in dem du schon einmal angemeldet warst, kommt mit dem richtigen Passwort trotzdem hinein.
- Ein Link zum Zurücksetzen des Passworts hebt die Wartezeit auf.
- Hinter einem Proxy muss nexdiary die echten Adressen der Besucher sehen, sonst hält es alle für einen. Wie das geht, steht weiter unten.
Gut zu wissenDie Zähler für die Konten liegen in der Datenbank, die für Adressen nur im Speicher. Ein Neustart vergisst die Adressen also, die Konten nicht. „Bereit fürs Internet?“ probiert die Bremse bei jedem Öffnen an einer Kopie aus.
nexdiary prüft selbst, ob es fürs Internet bereit ist
Viele werden nexdiary auch von unterwegs erreichen wollen. Unter „Einstellungen“, „Anmeldung“ steht deshalb ganz oben die Karte „Bereit fürs Internet?“. Sie prüft acht Punkte jedes Mal neu, wenn der Betreiber die Seite öffnet, markiert jeden mit „erfüllt“, „prüfen“ oder „offen“ und sagt, was zu tun ist.
| Punkt | Was nexdiary prüft |
|---|---|
| Öffentliche Adresse mit https | ob die öffentliche Adresse mit https beginnt und die Anfrage auch über https kam. Ohne https gehen Passwörter offen durchs Netz, und Web Push und Passkeys funktionieren gar nicht. |
| Zweiter Faktor für alle | ob jedes Konto mit Passwort einen Code oder einen Passkey braucht |
| Dein eigenes Konto | ob das Konto des Betreibers, das alles einstellen darf, selbst einen zweiten Faktor hat |
| Schutz vor Raten | ob die Bremse ihren eigenen Test besteht und keine öffentlichen Netze als Proxy eingetragen sind |
| Einträge verschlüsselt | ob der Hauptschlüssel da ist und nur für seinen Besitzer lesbar |
| Sitzungen und Cookies | ob die Anmelde-Cookies nur über https gehen und für Skripte nicht lesbar sind |
| Hinter dem Proxy | ob die echte Adresse der Besucher ankommt oder ein unbekannter Proxy dazwischensitzt |
| Hauptschlüssel gesichert | ob und wann der Hauptschlüssel zuletzt heruntergeladen wurde |
Was die Karte nicht sehen kann
Die Karte prüft, was nexdiary über sich selbst wissen kann. Ob dein Router, dein Proxy und dein Server auf dem neuesten Stand sind, sieht sie nicht. Sie deckt die Dinge ab, die man beim Einrichten am leichtesten übersieht.
Zusätzlich kann der Betreiber die Einstellungen ganz auf das Heimnetz beschränken. Mit NEXDIARY_OPERATOR_NETWORKS, etwa 192.168.0.0/16, lehnt nexdiary jede Änderung der Einstellungen von außerhalb ab.
Hinter einem Proxy, mit https
Im Beispiel zum Selbsthosten ist nexdiary nur auf dem Rechner selbst erreichbar, unter 127.0.0.1:8550. Davor gehört ein Reverse Proxy, der https spricht. Wer nexdiary ohne https ins Heimnetz stellt, schickt Passwörter und Codes im Klartext über das Netz.
Den Proxy nennen
NEXDIARY_TRUSTED_PROXIES nennt die Adresse oder das Netz des Proxys. Nur dessen Angabe zur echten Adresse der Besucher glaubt nexdiary. Ohne sie scheint jede Anmeldung vom Proxy zu kommen, und der Schutz vor Raten kann die Leute nicht auseinanderhalten. Öffentliche Netze in dieser Liste meldet „Bereit fürs Internet?“ als offen.
Die Adresse nennen
NEXDIARY_PUBLIC_URL oder die Einstellung „Öffentliche Adresse“ nennt die Adresse, unter der man nexdiary erreicht. Daraus entstehen Einladungslinks, die Rückkehr vom Anmeldeanbieter, Passkeys und der Kontakt für Push. Die Cookies schützt nexdiary über https von selbst; den Kopf für HSTS schickt der Proxy.
Strenge Kopfzeilen
Die Seite lädt nur Dateien vom eigenen Server, lässt sich nicht in fremde Seiten einbetten und hat Kamera, Mikrofon und Standort abgeschaltet.
Rechte auf dem Server
Jede Anfrage wird auf dem Server geprüft. Ein fremder Tag, eine fremde Notiz, ein fremdes Foto antworten, als gäbe es sie nicht.
Kein root
Der Container läuft mit no-new-privileges und fast ohne Fähigkeiten, und nexdiary selbst läuft nie als root.
Fremde Seiten bleiben draußen
Jede ändernde Anfrage trägt eine Kopfzeile, die eine fremde Webseite nicht mitschicken kann. Cookies sind für Skripte nicht lesbar.
Ein Log ohne Inhalt
Im Log steht nie ein Wort aus Seiten oder Notizen, nie ein Passwort, Schlüssel oder Token. Tokens in Adressen werden unkenntlich gemacht.
Fotos neu gezeichnet
Ein hochgeladenes Foto wird aus seinen Pixeln neu gezeichnet, ohne Ort, Gerät und Aufnahmezeit, und liegt wie alles andere verschlüsselt auf der Platte.
Was nach draußen geht
Der Browser spricht nur mit eurem eigenen Server. Schriften, Symbole und Skripte bringt nexdiary mit, es gibt keine Statistik, keine Fehlerberichte, keine Karten und keine Bilder von fremden Diensten. Der Server selbst baut nur diese Verbindungen auf, und die meisten erst, wenn jemand sie einschaltet.
| Verbindung | Wann | Ab Werk | Was hinausgeht |
|---|---|---|---|
| Frage nach einer neuen Version | wenn jemand „Über nexdiary“ öffnet und die letzte Antwort älter als einen Tag ist | an | nur die Frage an GitHub, ohne Namen, Einträge oder Kennung. Der Betreiber schaltet das mit „Einmal am Tag nachsehen“ ab. |
| Web Push | Erinnerungen, Zeitkapseln, Bescheid bei neuer Anmeldung oder zurückgesetztem zweiten Faktor, wartender Entwurf | erst, wenn ein Gerät angemeldet ist | eine verschlüsselte Nachricht an den Push-Dienst des Browsers, die nur das Gerät lesen kann. Sie enthält nie einen Eintrag, kann aber die Frage des Tages, den Namen eines Absenders oder das Netz einer neuen Anmeldung nennen. |
| KI-Dienst | auf Knopfdruck, oder am Morgen, wenn Betreiber und Person es beide einschalten | keine KI | die Notizen eines Tages, ohne Namen, Datum, Fotos und Werte, beim Zusammenfassen die Seiten einer Woche oder eines Monats. Einzelheiten auf der Seite KI. |
| Immich | wenn eine Person ihr Immich verbunden hat und Fotos auswählt | geschlossen | ihr Schlüssel für Immich und ein Datum oder Suchbegriff, nichts aus dem Tagebuch, nur an Adressen, die der Betreiber erlaubt |
| Mailserver | Einladung, Link zum Zurücksetzen, Bescheid bei neuer Anmeldung oder zurückgesetztem zweiten Faktor, Testmail | keiner eingetragen | Kontoname, Link, Gerät und Zeit, nie ein Eintrag |
| Anmeldeanbieter | wenn ein Anbieter wie authentik eingerichtet ist und jemand ihn benutzt | nicht eingerichtet | die üblichen Anfragen von OpenID Connect, kein Eintrag |
| authentik einrichten | nur, wenn der Betreiber auf „Einrichten“ drückt | aus | Aufrufe an authentik mit einem Token, das nexdiary weder speichert noch ins Log schreibt |
Gut zu wissenWeb Push, KI und Immich prüfen ihre Zieladressen, folgen keiner Weiterleitung, und Adressen, unter denen Cloud-Anbieter ihre internen Metadaten anbieten, sind dort immer gesperrt. Diese drei und die Frage nach einer neuen Version beachten außerdem keinen Proxy aus HTTP_PROXY oder HTTPS_PROXY. Wer nur über einen solchen Proxy ins Internet kommt, sollte das wissen.
Eine Sicherheitslücke melden
Wer eine Lücke findet, meldet sie bitte nicht öffentlich, sondern vertraulich über GitHub: im Repository unter „Security“, „Report a vulnerability“. Am meisten hilft, was du gefunden hast, wie man es nachstellt und welche Version lief.
Eine Antwort kommt innerhalb einer Woche. Die Korrektur erscheint als neue Version, und die Notizen zur Version nennen das Problem, sobald die Korrektur da ist.
Sicherheitskorrekturen gibt es nur für die neueste Version. Aktualisieren heißt docker compose pull und docker compose up -d; vor einer Änderung der Datenbank legt nexdiary selbst eine Sicherung an. Von allein aktualisiert sich nexdiary nie.