Projekt

Allgemein

Profil

PG Authentication Delegation » Historie » Version 1

[E] Rocco Kreutz, 23.10.2024 12:35

1 1 [E] Rocco Kreutz
h1. PG Authentication Delegation
2
3
* *Option 1*
4
* <pre><code class="sql">
5
--create a user that you want to use the database as:
6
7
create role neil;
8
9
--create the user for the web server to connect as:
10
11
create role webgui noinherit login password 's3cr3t';
12
13
--let webgui set role to neil:
14
15
grant neil to webgui; --this looks backwards but is correct.
16
17
</code></pre>
18
* webgui is now in the neil group, so webgui can call set role neil . However, webgui did not inherit neil's permissions.
19
* Later, login as webgui:
20
<pre><code class="sql">
21
psql -d some_database -U webgui
22
(enter s3cr3t as password)
23
24
set role neil;
25
26
</code></pre>
27
* webgui does not need superuser permission for this.
28
* *die Variante beinhaltet enorme Sicherheitslücke:*
29
** <pre><code class="sql">
30
RESET ROLE;
31
SET ROLE admin;
32
</code></pre>
33
** 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
34
35
* *Option 2*
36
* 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
37
* <pre><code class="sql">
38
CREATE OR REPLACE FUNCTION TSystem.grantrole(role_name text) RETURNS void AS $$
39
DECLARE
40
  _SQL varchar;
41
BEGIN
42
  _SQL = format('GRANT %I TO %I;', role_name, session_user);
43
  EXECUTE _SQL;
44
END;
45
$$ LANGUAGE plpgsql SECURITY DEFINER;
46
47
CREATE OR REPLACE FUNCTION TSystem.revokerole(role_name text) RETURNS void AS $$
48
DECLARE
49
  _SQL varchar;
50
BEGIN
51
  _SQL = format('REVOKE %I FROM %I;', role_name, session_user);
52
  EXECUTE _SQL;
53
END;
54
$$ LANGUAGE plpgsql SECURITY DEFINER;
55
56
CREATE OR REPLACE FUNCTION TSystem.switchrole(role_name text) RETURNS void AS $$
57
DECLARE
58
  _SQL varchar;
59
BEGIN
60
  -- check for permission here -> IF THEN  
61
  PERFORM TSystem.grantrole(role_name);
62
  _SQL = format('SET ROLE %I;', role_name);
63
  EXECUTE _SQL;
64
  PERFORM TSystem.revokerole(role_name);	
65
END;
66
$$ LANGUAGE plpgsql;
67
</code></pre>
68
* Niemand ausser der webui Rolle bekommt jetzt das Recht diese Funktionen auszuführen
69
* Für alle Tabellen mit alternativen Authentifizierungs-Feldern (llv.ll_rfid) wird RLS aktiviert @ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;@
70
** Lesen: SUPERUSER ODER session_user (nicht current_user !!!)
71
** Schreiben: session_user
72
** 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