Projekt

Allgemein

Profil

PG Authentication Delegation » Historie » Version 5

[E] Rocco Kreutz, 23.10.2024 12:58

1 1 [E] Rocco Kreutz
h1. PG Authentication Delegation
2
3 2 [E] Rocco Kreutz
h2. Option 1
4
5 1 [E] Rocco Kreutz
* <pre><code class="sql">
6
--create a user that you want to use the database as:
7
8
create role neil;
9
10
--create the user for the web server to connect as:
11
12
create role webgui noinherit login password 's3cr3t';
13
14
--let webgui set role to neil:
15
16
grant neil to webgui; --this looks backwards but is correct.
17
18
</code></pre>
19
* webgui is now in the neil group, so webgui can call set role neil . However, webgui did not inherit neil's permissions.
20
* Later, login as webgui:
21
<pre><code class="sql">
22
psql -d some_database -U webgui
23
(enter s3cr3t as password)
24
25
set role neil;
26
27
</code></pre>
28
* webgui does not need superuser permission for this.
29
* *die Variante beinhaltet enorme Sicherheitslücke:*
30
** <pre><code class="sql">
31
RESET ROLE;
32
SET ROLE admin;
33
</code></pre>
34
** da hierfür alle Rollen welche sich einlogen können sollen Mitglied der Login-Rolle sind (webgui), kann hiermit zu allen anderen Rollen gewechselt werden
35
36 2 [E] Rocco Kreutz
h2. Option 2
37
38 1 [E] Rocco Kreutz
* Funktionen welche als @SECURITY DEFINER@ deklariert sind, dürfen kein @SET ROLE@  (Änderungen des "current_user") und auch kein @SET AUTHORIZATION@ (Änderung des "session_user") aufrufen
39
* <pre><code class="sql">
40
CREATE OR REPLACE FUNCTION TSystem.grantrole(role_name text) RETURNS void AS $$
41
DECLARE
42
  _SQL varchar;
43
BEGIN
44
  _SQL = format('GRANT %I TO %I;', role_name, session_user);
45
  EXECUTE _SQL;
46
END;
47
$$ LANGUAGE plpgsql SECURITY DEFINER;
48
49
CREATE OR REPLACE FUNCTION TSystem.revokerole(role_name text) RETURNS void AS $$
50
DECLARE
51
  _SQL varchar;
52
BEGIN
53
  _SQL = format('REVOKE %I FROM %I;', role_name, session_user);
54
  EXECUTE _SQL;
55
END;
56
$$ LANGUAGE plpgsql SECURITY DEFINER;
57
58
CREATE OR REPLACE FUNCTION TSystem.switchrole(role_name text) RETURNS void AS $$
59
DECLARE
60
  _SQL varchar;
61
BEGIN
62
  -- check for permission here -> IF THEN  
63
  PERFORM TSystem.grantrole(role_name);
64
  _SQL = format('SET ROLE %I;', role_name);
65
  EXECUTE _SQL;
66
  PERFORM TSystem.revokerole(role_name);	
67
END;
68
$$ LANGUAGE plpgsql;
69
</code></pre>
70
* Niemand ausser der webui Rolle bekommt jetzt das Recht diese Funktionen auszuführen
71
* Für alle Tabellen mit alternativen Authentifizierungs-Feldern (llv.ll_rfid) wird RLS aktiviert @ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;@
72
** Lesen: SUPERUSER ODER session_user (nicht current_user !!!)
73
** Schreiben: session_user
74 4 [E] Rocco Kreutz
** Keine Werte speichern, stattdessen SALT's und Hashes speichern
75 1 [E] Rocco Kreutz
** die hier nicht aufgeführte Funktion zum überprüfen der alternativen Authentifizierung (NFC/RFID oder was auch immer in Zukunft nötig wird) wird mit @SECURITY DEFINER@ definiert und alleinig @EXECUTE@ für alle gesetzt
76 3 [E] Rocco Kreutz
* Damit ist alleinig für den Moment der Ausführung von TSystem.switchrole eine Rolle Mitglied der Login-Rolle
77
** Um dies dann als Sicherheitslücke ausnutzen zu können, müsste jemand in dem winzigen Moment in dem ein admin sich mittels der Login-Rolle einlogged und Mitglied der Login-Rolle ist; @RESET ROLE; SET ROLE admin;@ ausführen
78 4 [E] Rocco Kreutz
79
h3. Absicherung der Login-Rolle
80
81
* Keine Rechte für die Rolle ausser dem Ausführen der obigen Funktionen
82
* Das Passwort wird mittels Credential-Manager verwaltet (Damit kann nur der Windows-Account dieses lesen, unter welchem der WebServer läuft)
83
* Das Passwort der Login-Rolle wird initial im PG gesetzt von einem "Prodat-Admin"
84
* Dannach logged sich der "Prodat-Admin" im WebServer ein und übergibt die Kontrolle darüber an den WebServer
85
** WebServer benutzt initiales PW um sich in PG einzuloggen
86 5 [E] Rocco Kreutz
** WebServer erzeugt neues PW und ändert das PW der Login-Rolle auf das neue PW
87 1 [E] Rocco Kreutz
** Neues PW wird im CM gesichert
88 5 [E] Rocco Kreutz
* Niemand auser dem WebService (oder implizit alle welche das Passwort des Windows-Accounts kennen und wissen wonach sie schauen müssen und wie es funktioniert) kann sich damit mit der Login-Rolle in den PG einlogen