Zugriffsrechte für Datenbank

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
T.T. Kreischwurst
User
Beiträge: 52
Registriert: Dienstag 2. Februar 2016, 10:56

Servus zusammen!

Ich habe vor, mit meinem Script eine kleine SQL(ite)-Datenbank aufzubauen und zu verwalten. Da dort prinzipiell auch Daten gespeichert werden könnten, die eher sensibel sind und jetzt nicht unbedingt im Klartext dastehen sollten, will ich die Zugriffs- und Nutzungsmöglichkeiten der Datenbankdatei einschränken. Ich sehe zwei Optionen: entweder die Daten verschlüsselt speichern (nicht so toll aus mehreren Gründen), oder die Zugriffsrechte auf die Datenbnak einschränken, sodass man die Datei weder mit meinem Script noch mit einem anderen Programm öffnen kann. Zugang gibts durch ein Passwort in meinem Script, welches dann die Zugriffsrechte vorübergehend ändert; mit dem Ende des betreffenden Programmlaufes werden die Rechte dann wieder eingeschränkt. Ich hab das mit os.chmod bereits erfolgreich implementiert, aber: setze ich die Rechte für alle nur auf lesen, kann man zwar die Datei nicht mehr ändern oder löschen. Es geht aber (unter Win) faktisch der Schreibschutz an. Nun kann ein halbwegs schlauer Nutzer den Haken in den Dateieinstellungen der .db Datei einfach abwählen und voilà: er hat Zugriff auf die Daten. Ungünstig. Kann ich das i-wie restriktiver gestalten bzw. habe ich irgendwo einen Denk(fehler) drin? Code kann ich bei Bedarf gerne posten.
Danke!
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@T.T. Kreischwurst: Dein Denkfehler ist, dass Du glaubst, mit irgendeinem Programm einen Zugriffsschutz implementieren zu können. Das kann (in begrenztem Maße) nur das Betriebssystem. Das einfachste wäre, eine Datenbank mit Benutzerrechten zu nehmen, die unter einem Benutzer läuft, wo nicht jeder Zugriff hat. Dann kannst Du Rechte auf einzelne Tabellen vergeben.
Die Passwortabfrage muß dann natürlich auch direkt von der Datenbank geprüft werden und nicht in Deinem Skript. Passwörter in Skripten sind nicht der Mühe wert, überhaupt darüber nachzudenken.
T.T. Kreischwurst
User
Beiträge: 52
Registriert: Dienstag 2. Februar 2016, 10:56

Danke.
Das einfachste wäre, eine Datenbank mit Benutzerrechten zu nehmen, die unter einem Benutzer läuft, wo nicht jeder Zugriff hat.
Also einen Benutzer anlegen (oder verwenden), der dann als einziger Zugriffsberechtigung auf die Datenbank hat? Und dann im Skript die Rechte nach Bedarf setzen?
Die Passwortabfrage muß dann natürlich auch direkt von der Datenbank geprüft werden und nicht in Deinem Skript. Passwörter in Skripten sind nicht der Mühe wert, überhaupt darüber nachzudenken.
Wie kann ich denn in einer Datenbank eine Passwortabfrage durchführen? Oder meinst du die Speicherung des Passwortes in der Datenbank (in verschlüsster Form)? Dass es nicht den geringsten SInn hat, Passwörter im Skript zu speichern ist vollkommen klar. Derzeit funktioniert das so, dass ich ein Passwort setze, einen SHA256 Hash daraus generiere und diesen speichere. Bei erneutem Start des Programms muss der Nutzer sein PW eingeben, dieses wird wiederum gehasht. Passt der Hash zum gespeicherten, fährt das Programm fort, andernfalls nicht.
Natürlich ist auch das in letzter Konsequenz in Python Firlefanz, weil Pythoncode ja nicht analog C/Java kompiliert wird und deswegen im Quelltext sichtbar (und manipulierbar) bleibt. Es geht mir hier aber auch eher um das Prinzip, sowas mal zu schreiben - schließlich bin ich Anfänger im Programmieren und lerne auf Python. Die Daten sind auch kein Staatsgeheimnisse, sodass fortgeschrittene Hackerattacken zu erwarten sind.
BlackJack

@T.T. Kreischwurst: Ich denke es war eher eine Datenbank mit Benutzern und Rechten gemeint, also Benutzer und Rechte die nicht zum Betriebssystem gehören sondern zur Datenbank. So etwas hat SQLite nicht, aber MySQL/MariaDB und PostgreSQL beispielsweise.

Das wie der Passwortüberprüfung stellt sich in dem Fall nicht, denn das macht die Datenbank ja schon von Haus aus.

Für das Hashen von Passwörtern gibt es geeignetere Algorithmen als SHA.

Wenn der Schutz darauf baut das der Angreifer nicht den Quelltext hat, dann taugt der nicht viel, denn auch C oder Java bleibt manipulierbar. Java sogar relativ einfach, weil der Bytecode sehr viel Informationen enthält die bei C zum Beispiel nach dem kompilieren üblicherweise nicht mehr enthalten ist. Aber auch bei C-Code kann man sich den Assemblercode anschauen und eigenen Code dort rein patchen oder Bibliotheks- oder Systemaufrufe auf eigenen Code umbiegen.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@T.T. Kreischwurst: nein, ich meine, dass die Datenbank eine Nutzerverwaltung hat (also kein SQLite, sondern PostgreSQL, MariaDB, o.ä.).

Ob das Passwort nun als Hash vorliegt oder im Klartext, ist eigentlich egal. Ob die Datei kompiliert ist, oder als Source vorliegt, ist auch nur ein Rückübersetzungsschritt. Das hat mit Zugriffsschutz einfach nichts zu tun.
T.T. Kreischwurst
User
Beiträge: 52
Registriert: Dienstag 2. Februar 2016, 10:56

BlackJack hat geschrieben:@T.T. Kreischwurst: Ich denke es war eher eine Datenbank mit Benutzern und Rechten gemeint, also Benutzer und Rechte die nicht zum Betriebssystem gehören sondern zur Datenbank. So etwas hat SQLite nicht, aber MySQL/MariaDB und PostgreSQL beispielsweise.

Das wie der Passwortüberprüfung stellt sich in dem Fall nicht, denn das macht die Datenbank ja schon von Haus aus.

Für das Hashen von Passwörtern gibt es geeignetere Algorithmen als SHA.

Wenn der Schutz darauf baut das der Angreifer nicht den Quelltext hat, dann taugt der nicht viel, denn auch C oder Java bleibt manipulierbar. Java sogar relativ einfach, weil der Bytecode sehr viel Informationen enthält die bei C zum Beispiel nach dem kompilieren üblicherweise nicht mehr enthalten ist. Aber auch bei C-Code kann man sich den Assemblercode anschauen und eigenen Code dort rein patchen oder Bibliotheks- oder Systemaufrufe auf eigenen Code umbiegen.
Ah, danke. OK, dann werde ich mich mal MySQL auseinander setzen.
Zum Thema Passwort nochmal: Also der Schutz baut nicht darauf auf, dass der Angreifer den Quelltext nicht bekommt. Ich meinte eher, dass der Quelltext umgeschrieben werden kann, um das Setzen der Benutzerrechte zu umgehen/umzugestalten, aber das hat mit der eigtl. Passwortabfrage ja nichts zu tun. Ich nehme an, dass
Ob das Passwort nun als Hash vorliegt oder im Klartext, ist eigentlich egal.
sichauf die Zugriffskontrolle bezieht, denn jedes Passwort muss ja irgendwann mal abgefragt werden, und das geschieht nunmal im Quelltext.
BlackJack

@T.T. Kreischwurst: Die Passwortabfrage darf, egal welche Sprache man verwendet, nicht in einem Programm passieren das der Benutzer manipulieren kann. Das heisst es darf nicht in dem Programm passieren das mit den Rechten des Benutzers läuft, sondern muss zum Beispiel in der Datenbank passieren mit der der Benutzer nur per IPC kommunizieren kann.
T.T. Kreischwurst
User
Beiträge: 52
Registriert: Dienstag 2. Februar 2016, 10:56

:K Danke dir, aber da komme ich nicht ganz mit. Das hieße ja, wenn ich es richtig verstanden habe, dass ich zwangsläufig einen vollständigen SQL Server (der den Passwortablgeich durchführen kann) brauche, wenn ich den Zugriff auf irgendwelche Daten per Passwort einschränken will...
Eigentlich brauche ich nur eine eingebettete (offline)Datenbank, in der ein paar Daten gespeichert werden, die wiederum mit dem Pythonskript verwaltet werden sollen - XML ist etwas zu unpraktisch dafür. Die Sichtbarkeit bzw. Zugänglichkeit dieser Daten wollte ich etwas einschränken, aber wenn das nur über volle SQL DB Systeme wie MySQL geht, dann ist das eher der Overkill - ich suche besser andere Lösungen oder ein anderes Projekt. Das ist mir zu hoch für das bisserl Datensalat :?
T.T. Kreischwurst
User
Beiträge: 52
Registriert: Dienstag 2. Februar 2016, 10:56

EDIT: nach der Lektüre dieses Beitrages (viewtopic.php?t=37018, ist meinem Problem sehr, sehr ähnlich) beginne ich zu verstehen: imm wenn das PW (als Hash oder Klartext) auf demselben Rechner liegt, kann es ein unbefugter Dritter finden, löschen und durch sein eigenes ersetzen. Speichern des Passwortes in der (verschlüsselten/zugriffsbeschränkten/wie auch immer) Datenbank geht nicht, da man es ja zum erneuten Öffnen erst zum Abgleichen auslesen müsste... ein Problem, das übrigens beim Verschlüsseln der Daten genauso besteht. Der Nutzer (der also das PW kennt) ist gar nicht das Problem, der darf die Datenbank ja jederzeit in jeder Weise manipulieren, wenn er das denn will. Es geht eben um Leute, die in den Daten schnüffeln wollen.

Gibt es denn keine Möglichkeit, offline Daten irgendwie halbwegs effizient zu speichern? Zur Not auch in nicht-Datenbankform. Ich möchte eine Onlinelösung ehrlich gesagt vermeiden, zumal eine Aufwendige Konfiguration eines möglichen DB-Servers wie MySQL möglichst vermieden werden soll.
BlackJack

@T.T. Kreischwurst: Ich bin mir immer noch nicht sicher wogegen Du Dich oder das Programm/die Daten schützen willst‽ Wenn der Benutzer alles damit machen kann/darf, dann ist SQLite doch in Ordnung. Geschützt wird das durch das Betriebssystem, so wie der Benutzer auch alle seine anderen Daten schützt. Also Benutzer/Rechte und gegebenenfalls Verschlüsselung auf Dateisystem-Ebene.
T.T. Kreischwurst
User
Beiträge: 52
Registriert: Dienstag 2. Februar 2016, 10:56

Ah, dann passt alles. Ich dachte aufgrund des ersten Posts von Sirius, dass auch die betriebssystemseitigen Maßnahmen unsicher seien. Aber:
Also Benutzer/Rechte und gegebenenfalls Verschlüsselung auf Dateisystem-Ebene.
Wunderbar, mehr brauch ich nicht. Hab Sirius' Post misverstanden. :oops:
Antworten