PostgreSQL und Datenbanken

Spezielle Fragen zu PostgreSQL, MySQL, SQLite, SQL ...
Antworten
Benutzeravatar
Honsek
Foriker
Beiträge: 408
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

PostgreSQL und Datenbanken

Beitrag von Honsek » Di 22. Okt 2019, 17:04

Hallo.

Nach dem letzten Post von tionov (in 'PostgreSQL und DB-Benutzer') war klar zu erkennen, in welche Richtung die Überlegungen gehen müssen. Damit taucht ein anderes Problem auf: Wenn ich einem Kapitel zum Thema 'Datenbanken - PostgreSQL und Gambas' ein Beispiel-Projekt mitgeben möchte - wie ich das immer anstrebe - steht die Frage: Was muss dem Datenbank-Projekt mitgegeben werden und in welcher Form/Datenformat? Mir fällt nur eine komplette Sicherung der benutzen Datenbank (Dump) mit den enthaltenen DB-Tabellen ein. Der Leser unseres Gambas-Buches muss dann diese Sicherung auf seinen PostgreSQL-Server einspielen. Oder sollte das Erzeugen der verwendeten Datenbank und der DB-Tabellen sowie deren Inhalt über den Quelltext eingespielt werden?

Mit freundlichen Grüßen

Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
PJBlack
Foriker
Beiträge: 29
Registriert: Sa 8. Dez 2018, 23:50
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von PJBlack » Di 22. Okt 2019, 18:06

Den entsprechenden Benutzer musst Du in PG sowieso anlegen ... und wenn Du dann schon da bist spielst Du schnell den Dump ein ...

Benutzeravatar
Honsek
Foriker
Beiträge: 408
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von Honsek » Di 22. Okt 2019, 18:46

Hallo PJBlack,

vielen Dank für die schnelle Antwort. Es wird darauf hinaus laufen, dass irgendwo im Kapitel stehen wird: Um das DB-Projekt PGExample1 nachvollziehen zu können, müssen Sie (1) einen DB-Benutzer testuser mit folgenden Rechten ... auf dem verwendeten PosgreSQL-Server anlegen und (2) den Dump pgexample1.sql einspielen. Die Zugangsdaten sind: ... . Den Datenbank-Client starten Sie mit dem Passwort xyz.

Mit freundlichem Gruß

Hans
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
PJBlack
Foriker
Beiträge: 29
Registriert: Sa 8. Dez 2018, 23:50
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von PJBlack » Di 22. Okt 2019, 21:48

Kein Problem Honsek, ich hatte aber gehofft, dass tionov auch seinen "Senf" dazugibt und sei es nur, weil ich seine Beiträge gerne lese.

Zum Abschluss des Abends würde ich gerne noch eine Korinthe produzieren:
Honsek hat geschrieben:
Di 22. Okt 2019, 18:46
Den Datenbank-Client starten Sie mit dem Passwort xyz.
Ok, sind 'ne Tüte Korinthen, aber den DB-Client startet man wie jedes andere Gambas Programm auch, oder? Nachdem es gestartet wurde ist eine Anmeldung mit [Benutzerkennung] und/oder [Passwort] erforderlich??!!

Benutzeravatar
Honsek
Foriker
Beiträge: 408
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von Honsek » Mi 23. Okt 2019, 14:17

Hallo PJBlack,

nach den Hinweisen von tionov
Damit nicht jede Person, die die App starten kann, nun freien Zugriff auf die Datenbank hat, liegen die Zugangsdaten (Credentials) selbstverständlich(!) nicht im Code der App, sondern verschlüsselt in den Settings und werden durch ein Passwort geschützt, das der Benutzer beim Starten der App eingeben muss. Zum Beispiel, es gibt auch viele andere Möglichkeiten, Credentials zu schützen.
gehe ich genau so vor: Ein User A startet das Programm und wird in einem Dialog-Fenster zur Eingabe eines Passwortes P gebeten, ist das korrekt, dann erst startet das Datenbankprogramm. Dem Datenbank-Programm wird eine Datei pu.enc mitgegeben, die beim ersten Start in das Verzeichnis /home/hans/.config/gambas3 (in meinem Fall) kopiert wird. Der Inhalt dieser Datei ist verschlüsselt. Der Inhalt wird gelesen und wird mit einem Teil von P entschlüsselt.

Inhalt (Beispiel):

DBUSER=testuser
PASS=@geheim@

Damit stehen dann im Programm die erforderlichen Zugangsdaten für den PostgreSQL-Server zur Verfügung. Jeder weitere Start des DB-Client nutzt die gleichen Zugangsdaten. Da aber PostgreSQL über Multiuserfähigkeit und Transaction Handling verfügt, reicht es, wenn jeder DB-Benutzer mit seinem DB-Client eine eigene DB-Verbindung zum PostgreSQL-Server aufbaut.

Ist das Passwort fehlerhaft, dann können die Zugangsdaten nicht korrekt angegeben werden - das Programm wird daher beendet, weil alles Andere Nonsens wäre.

Ein Grieche würde Korinthiaki rufen,
ich verabschiede mich mit freundlichem Gruß

Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
tionov
Site Admin
Beiträge: 314
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von tionov » Fr 25. Okt 2019, 08:40

PJBlack hat geschrieben:
Di 22. Okt 2019, 21:48
Kein Problem Honsek, ich hatte aber gehofft, dass tionov auch seinen "Senf" dazugibt und sei es nur, weil ich seine Beiträge gerne lese.
Danke, das freut mich. :-)

Ich musste/muss arbeiten. Was ihr euch hier ausgedacht habt, finde ich im Großen und Ganzen sehr gut, habe nur kleine Anmerkungen:

Bei PG gibt es verschiedene Arten von Dumps, die mit pg_dump erzeugt werden. So lange man keine Spezialitäten wie Checks und Trigger mit diversen Abhängigkeiten verwendet, bietet sich die Option "-F p" an, damit entsteht der Dump der Beispieldatenbank als Plain Text, also eine Folge von SQL Kommandos, die mit vielen Programmen wieder in die DB gespielt werden können. Plain Text SQL ist ziemlich versionsunabhängig.

Für Zugangsdaten in Beispielprogrammen freue ich mich immer über User/PW-Kombinationen wie user/demo, admin/demo. Die sind schnell einzugeben und zeigen, dass sie nur beispielhafte Platzhalter sind.

Credentials (Zugang zur DB) würde ich für die Produktion als (individuell) verschlüsselten JSON-String in den Settings des jeweiligen Useraccounts speichern. Die Idee mit "pu.enc" finde ich für das Demoprogramm gut. Man sollte dann aber darauf hinweisen, dass das keine sinnvolle Methode ist, wenn man das Programm verteilen und von verschiedenen Benutzern zum Zugriff auf die DB verwenden lassen möchte.
Alles Gute,

tionov

Benutzeravatar
Honsek
Foriker
Beiträge: 408
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von Honsek » Sa 26. Okt 2019, 10:39

Hallo.
Bei PG gibt es verschiedene Arten von Dumps, die mit pg_dump erzeugt werden. So lange man keine Spezialitäten wie Checks und Trigger mit diversen Abhängigkeiten verwendet, bietet sich die Option "-F p" an, damit entsteht der Dump der Beispieldatenbank als Plain Text, also eine Folge von SQL Kommandos, die mit vielen Programmen wieder in die DB gespielt werden können. Plain Text SQL ist ziemlich versionsunabhängig.
Ich nutze:

$ pg_dump -h localhost -p 5432 -U postgres -W --format=p --attribute-inserts -f test3.dump.sql -d testdb

Da ich die Option `-F p` bisher nicht nutzte, scheint das die Standard-Option zu sein, weil der Inhalt der Dump-Datei ohne die zusätzliche Option genauso aussah.
Für Zugangsdaten in Beispielprogrammen freue ich mich immer über User/PW-Kombinationen wie user/demo, admin/demo. Die sind schnell einzugeben und zeigen, dass sie nur beispielhafte Platzhalter sind.
Ja, das klingt vernünftig, weil dann Jedem klar wird, dass es sich um eine Demo-Version mit fiktivem DB-Benutzer handelt.
Credentials (Zugang zur DB) würde ich für die Produktion als (individuell) verschlüsselten JSON-String in den Settings des jeweiligen Useraccounts speichern. Die Idee mit "pu.enc" finde ich für das Demoprogramm gut. Man sollte dann aber darauf hinweisen, dass das keine sinnvolle Methode ist, wenn man das Programm verteilen und von verschiedenen Benutzern zum Zugriff auf die DB verwenden lassen möchte.
Folgende Fragen bleiben:
  • Warum gerade ein (verschlüsselter) JSON-String?
  • Worauf bezieht sich das `individuell`?
  • Warum ist mein Ansatz mit der Datei `pu.enc` nicht sinnvoll?
Mit freundlichem Gruß

Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
tionov
Site Admin
Beiträge: 314
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von tionov » Sa 26. Okt 2019, 13:01

Honsek hat geschrieben:
Sa 26. Okt 2019, 10:39
Folgende Fragen bleiben:
  • Warum gerade ein (verschlüsselter) JSON-String?
JSON finde ich bequem. Dafür verwende ich eine statische Klasse Config, die ihre eigenen Properties in einen JSON-String schreibt, der dann mit dem Passwort des Benutzers (verschlüsselt) in den Settings landet.

Hier stehen so Dinge wie: Der Name, Zugangsdaten zu Datenbanken, Zugangsdaten zu anderen Systemen, etc.
Umgekehrt kann dann Config zum Programmstart sich selbst aus den JSON-Daten aus den Settings befüllen und überall im Programm kann dann auf Config.Name, Config.DBHost, Config.DBUser usw zugegriffen werden.
  • Worauf bezieht sich das `individuell`?
Dass pro Benutzer eine eigene User/PW-Kombination existiert, mit der die Zugangsdaten zur DB verschlüsselt sind. Jetzt kann z.B. ein Admin beim Einrichten der App die Zugangsdaten zur DB eingeben, dann der Benutzer sein Passwort und dann wird das alles mit des Benutzers Passwort verschlüsselt. So kann nur die Person, die das PW kennt exakt diese eine App und ihre sämtlichen Zugänge entsperren.
  • Warum ist mein Ansatz mit der Datei `pu.enc` nicht sinnvoll?
Sorry, das war zu flapsig ausgedrückt. Es kann natürlich schon sinnvoll sein. Nur für eine Produktionsumgebung, wo eine App unter Umständen mehrere unterschiedliche Credentials braucht und verschiedene Benutzer unterschiedliches tun dürfen, ist es nicht besonders glücklich. Weil du musst natürlich jedem Benutzer dasselbe Passwort geben um pu.enc zu entschlüsseln. Du kannst also nicht differenzieren.

Sicherheitskonzepte sind komplexe Angelegenheiten und auch wieder je nach Problem individuell. Ich finde das geht viel zu weit, für eine Demo-Geschichte.

Wie würde ich so etwas in einem größeren Betrieb lösen? Wahrscheinlich mit einem Kerberos Server:
https://de.wikipedia.org/wiki/Kerberos_%28Informatik%29

Das ist nur eine Idee. Es gibt viele weitere Möglichkeiten.

Das ist alles furchtbar kompliziert und hat in einer Demo-App nichts zu suchen. Früher haben wir alle unsere Zugangsdaten im Klartext im Homedir gespeichert. Noch früher haben wir die Zugangsdaten in den Code geschrieben. In einer Demo würde ich das erstere tun.
Alles Gute,

tionov

Benutzeravatar
Honsek
Foriker
Beiträge: 408
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von Honsek » Sa 26. Okt 2019, 18:37

Hallo.

Die Antwort wirft mehr Fragen auf, als sie klärt - wie zum Beispiel der zweite Satz. Völlig nebulös:

Dass pro Benutzer eine eigene User/PW-Kombination existiert, mit der die Zugangsdaten zur DB verschlüsselt sind. Jetzt kann z.B. ein Admin beim Einrichten der App die Zugangsdaten zur DB eingeben, dann der Benutzer sein Passwort und dann wird das alles mit des Benutzers Passwort verschlüsselt. So kann nur die Person, die das PW kennt exakt diese eine App und ihre sämtlichen Zugänge entsperren. ***

Ich beschreibe noch einmal die Ausgangssituation: Es läuft ein PostgreSQL-Server. Ein DB-Administrator hat eine Datenbank 'demodb' angelegt. In der Datenbank existiert die DB-Tabelle 'demotable1'. Es existieren 3 DB-Benutzer:

DB-Name: demou, DB-Passwort: demop
DB-Name: demou1, DB-Passwort: demop1
DB-Name: demou2, DB-Passwort: demop2

Szenario1
Alle k DB-Clients starten mit den gleichen Zugangsdaten (Credentials) mit eigener DB-Verbindung zum PostgreSQL-Server. Da PostgreSQL über Multiuserfähigkeit und Transaction Handling verfügt, reicht es, wenn jeder DB-Benutzer mit seinem DB-Client eine *eigene* DB-Verbindung zum PostgreSQL-Server aufbaut. Alle Benutzer haben die gleichen DB-Rechte in Bezug auf die Datenbank 'demodb' und die Arbeit mit der DB-Tabelle 'demotable1'.

Fazit1:
Für das Szenario1 reicht es, allen DB-Clients die verschlüsselte Datei 'pu.enc' mitzugeben oder die Zugangsdaten von DB-Benutzer 'demou' mit ausgewählten DB-Rechten in Bezug auf die Datenbank 'demodb' und die Arbeit mit der DB-Tabelle 'demotable1' in einem verschlüsselten String (JSON-String) in den Settings zu hinterlegen.

Szenario2
  • DB-Client1 startet mit den Zugangsdaten von DB-Benutzer 'demou1' mit ausgewählten DB-Rechten in Bezug auf die Datenbank 'demodb' und die Arbeit mit der DB-Tabelle 'demotable1'.
  • DB-Client2 startet mit den Zugangsdaten von DB-Benutzer 'demou2' mit ausgewählten DB-Rechten in Bezug auf die Datenbank 'demodb' und die Arbeit mit der DB-Tabelle 'demotable1'.
  • Die DB-Rechte von DB-Benutzer 'demou1' und DB-Benutzer 'demou2' unterscheiden sich.
Fazit2:
Für das Szenario2 sind die Zugangsdaten von DB-Benutzer 'demou1' und 'demou2' in einem verschlüsselten String (JSON-String) in den Settings von DB-Client1 und DB-Client2 zu hinterlegen.

Formal dürfte das bis hier her richtig sein und kann auch in ein Kapitel unseres Gambas-Buches. Allein mir fehlt die Wegbeschreibung, das für Szenario2 zu realisieren. Das hat nun wieder etwas mit dem o.a. Satz *** zu tun, den ich nicht verstehe. Bedeutet das zum Beispiel, dass der DB-Administrator jeden DB-Client individuell konfiguriert? Wird von den 2 DB-Clients ein Installationspaket geschnürt oder wird nur das Projekt weitergegeben?

Mit freundlichem Gruß

Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
tionov
Site Admin
Beiträge: 314
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von tionov » So 27. Okt 2019, 10:34

Hallo Honsek,

bitte entschuldige, dass ich mit meinen ganzen Einwürfen mehr durcheinanderbringe als ich eigentlich will.

Zu Szenario 1:

Nachdem du allen Benutzern dieselbe pu.enc mitgibst und das selbe Passwort, mit denen sie die Datei entschlüsseln können ... warum verschlüsselst du überhaupt? Jeder Benutzer kann die pu.enc des anderen öffnen, jeder kann an die Zugangsdaten der DB, jeder kann alles tun, es gibt k(aum )einen Sicherheitsgewinn. Du könntest auch ganz banal die Zugangsdaten demou/demop beim ersten Start der Applikation abfragen, in die Settings schreiben und dann bei jedem neuen Start wieder verwenden.

Für die Demo, bei der die selbe App mehrfach auf dem Computer des Lesers deines Buches gestartet werden kann und damit einen mehrfachen Zugang zur DB simuliert, würde ich das so machen, also definitiv nicht verschlüsseln.

Szenario 2 würde ich dir gar nicht empfehlen für eine Demonstration des Umgangs von Gambas mit Postgresql.

Warum?

Es gibt eine grundlegende Funktion von PG als relationaler Datenbank: Viele Leute können an den Daten arbeiten und sie verändern. PG passt auf, dass sich die Leute die Daten nicht inkonsistent gegenseitig überschreiben. Das ist die Hauptfunktion von PG und diese darzustellen, ist schon nicht ganz einfach. Aber das ist das, was man mit PG so gut wie immer macht und wofür man PG benutzt. Sein Einsatzzweck.

Nun komme ich zu dem, von dem ich denke, dass es in der Demoapp nicht dargestellt werden sollte. Und zwar ist das Sicherheit des Zugangs, also wer darf was und wem wird was verboten. Das ist ein weiterer Aspekt, der natürlich wichtig ist, aber bei dem es je nach Wichtigkeit unterschiedliche Lösungsansätze gibt. Und zwar unglaublich viele unterschiedliche Lösungsansätze. Das geht von schlichter Obsfugation (Verschleiern, wie Du es mit pu.enc vorschlägst), über Möglichkeiten, Credentials individuell zu Verpacken und beim Start zu entpacken (so wie ich es erklären wollte, auch ein Verschleiern), über Möglichkeiten, in der DB User und Rechte anzulegen und zu vergeben, zu Möglichkeiten, weitere externe Sicherheitsserver hinzuzuziehen (Kerberos/Ldap) bis hin zu bewaffneten Wachmannschaften mit Bodyscannern am Gebäudeeingang wie Snowden sie beschrieb. Darüber kann man jede Menge eigene Bücher schreiben.

Woher sollst du wissen, welchen Grad an Sicherheit, dein Leser benötigt? Was du vorschlägst, ist ein sehr geringer. Kann gut sein, dass das falsch ist. Darum: Wenn es um Sicherheit und Zugang geht, verweise im Fall von Postgresql auf die Literatur und das hervorragende Manual:

https://www.postgresql.org/docs/10/runt ... ction.html
https://www.postgresql.org/docs/10/user-manag.html
Alles Gute,

tionov

Benutzeravatar
Honsek
Foriker
Beiträge: 408
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von Honsek » So 27. Okt 2019, 13:18

Guten Tag tionov,

jetzt kommt Klarheit in meine Gedanken.
Nachdem du allen Benutzern dieselbe pu.enc mitgibst und das selbe Passwort, mit denen sie die Datei entschlüsseln können ... warum verschlüsselst du überhaupt? Jeder Benutzer kann die pu.enc des anderen öffnen, jeder kann an die Zugangsdaten der DB, jeder kann alles tun, es gibt k(aum )einen Sicherheitsgewinn. Du könntest auch ganz banal die Zugangsdaten demou/demop beim ersten Start der Applikation abfragen, in die Settings schreiben und dann bei jedem neuen Start wieder verwenden.
Für die Demo, bei der die selbe App mehrfach auf dem Computer des Lesers deines Buches gestartet werden kann und damit einen mehrfachen Zugang zur DB simuliert, würde ich das so machen, also definitiv nicht verschlüsseln.
Ich dachte an ein Passwort P, mit dem ausgewählte Benutzer den DB-Client starten können. Läuft der Client, dann wird mit einem Teil des Passwortes P der Inhalt der Datei pu.enc entschlüsselt und eine (exklusive) Verbindung mit den dann bekannten Zugangsdaten zum PostgreSQL-Server hergestellt. Damit wäre meine kleine Sicherheitswelt in Ordnung. Genau für diesen Fall werde ich ein Demonstrationsprojekt entwickeln und hier vorstellen.

Für Szenario 2 entscheide ich mich für die Wiedergabe Deiner Gedanken zu dem Thema im Gambas-Buch. Auch vor dem Hintergrund, dass es um Gambas und seinen Einsatz für DB-Projekte geht.

Mit freundlichem Gruß

Hans
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
tionov
Site Admin
Beiträge: 314
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von tionov » So 27. Okt 2019, 13:34

Ich sehe schon, du willst verschlüsseln. ;-)

Warum nur mit "einem Teil" des Passwortes?

Ansonsten finde ich das gut.
Alles Gute,

tionov

Benutzeravatar
Honsek
Foriker
Beiträge: 408
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: PostgreSQL und Datenbanken

Beitrag von Honsek » So 27. Okt 2019, 13:51

Warum nur mit "einem Teil" des Passwortes?
... weil das Passwort den Zugang zum DB-Client gestattet und ein Teil des Passwortes P - P2 - entschlüsselt die DB-Zugangsdaten. Dieses Passwort P2 interessiert den DB-Benutzer nicht!

Mit flottem Gruß

Hans
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste