Projekt

Allgemein

Profil

PG Authentication Delegation » Historie » Version 2

[E] Rocco Kreutz, 23.10.2024 12:36

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
** 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