Role für frei erreichbare Webseite

Kampfgummibaerlie

Datenbank-Guru
Beiträge
734
Ich denke mit der Idee am richtigen Weg zu sein, dass man die ganze Homepage (nein, noch immer nicht live ^^), noch besser schützen kann, wenn man mehrere Rollen erstellt, welche wiederum folgenden Sinn und Zweck erfüllen:

Die erste Rolle hätte den Sinn für einen nicht registrierten Benutzer, welcher einfach nur so die blanke Homepage besucht.

Die zweite Rolle wäre für die registrierten Benutzer, welche auch bereits bestätigt worden sind, dass sie keine Bots, oder evtl. Angreifer der kleinen Firma sind.

Um ehrlich zu sein, habe ich folgende Fragen zum Thema Roles:
1.: Hat es überhaupt einen Sinn, einen Benutzer anzulegen, der sich nicht einloggen kann? Meine Idee wäre, einfach bei einer Wartungsarbeit oder so, dieser Rolle das Recht sich einzuloggen wegnimmt, und nach der Arbeit wieder gibt.
2.: Was bringt es effektiv, einen User, welcher nicht Super-User ist, anzulegen, kann man einer entsprechenden anderen Rolle als "postgres" auch nur einzelne Attribute geben? Wie zB "Kann select ausführen, aber kein insert"...

Hätte jetzt gerne ein wenig Hilfe dabei, eine Rolle zu erstellen, welche zugriff auf die Datenbank "hat", aber auch "nicht hat", damit er nichts in die Datenbank hineinpfuschen kann.

So long, und danke an euch ;)
 
Werbung:
1. ja, kann sinnvoll sein.
2. ja, man kann so z.B. read-only-User anlegen

hier mal ein kleines Demo, hab ich mal vor Jahren für jemanden gemacht. Mit einem User, der DDL-Befehle ausführen darf, einem Schreib-User und einem ReadOnly-User.
Alle sind in einer Ober-Role, diese hat Login-Rechte. Und nur diese Ober-Role steht dann in der pg_hba.conf.
Ich hoffe, die Kommentare reichen aus, Dir den Rest zu erklären ...

Code:
--
-- in der pg_hba.conf
--
local   demo            +demo_mitarbeiter                       md5


--
-- in einer beliebigen DB Reload der Config
--
test=*# select pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 Zeile)


--
-- weiter, Anlegen der Nutzer
--
test=*# create role demo_mitarbeiter with login;
CREATE ROLE

test=*# create role demo_ddl in role demo_mitarbeiter;
CREATE ROLE
test=*# create role demo_rw in role demo_mitarbeiter;
CREATE ROLE
test=*# create role demo_read_only in role demo_mitarbeiter;
CREATE ROLE



--
-- anlegen der DB
--

test=# create database demo;
CREATE DATABASE

test=*# grant connect on database demo to demo_mitarbeiter;
GRANT


--
-- alle Rechte wegnehmen
--
test=# revoke all on database demo from public;
REVOKE


--
-- ich verbinde mich als Superuser zur neuen DB
--

test=# \c demo
psql (9.6.2, Server 9.5.6)
Sie sind jetzt verbunden mit der Datenbank »demo« als Benutzer »akretschmer«.

--
-- vom public-schema alles entfernen
--
demo=*# revoke all on schema public from public;
REVOKE


--
-- ich erzeuge ein neues Schema
--
demo=# create schema demo_schema;
CREATE SCHEMA

--
-- alle Mitarbeiter haben Usage-Rechte
--

demo=*# grant usage on schema demo_schema to demo_mitarbeiter;
GRANT


--
-- demo_ddl darf neue Dinge erstellen
--

demo=*# grant create on schema demo_schema to demo_ddl;
GRANT


--
-- Default-Rechte für von demo_ddl erstellte Objekte setzen
--
demo=*# alter default privileges for role demo_ddl grant select on tables to demo_read_only;
ALTER DEFAULT PRIVILEGES
demo=*# alter default privileges for role demo_ddl grant select on tables to demo_rw;
ALTER DEFAULT PRIVILEGES
demo=*# alter default privileges for role demo_ddl grant select on sequences to demo_read_only;
ALTER DEFAULT PRIVILEGES
demo=*# alter default privileges for role demo_ddl grant select on sequences to demo_rw;
ALTER DEFAULT PRIVILEGES
demo=*# alter default privileges for role demo_ddl grant insert, update, delete on tables to demo_rw;
ALTER DEFAULT PRIVILEGES
demo=*# alter default privileges for role demo_ddl grant usage, update on sequences to demo_rw;
ALTER DEFAULT PRIVILEGES


test=# create user admin1 in role demo_ddl password 'admin1';
CREATE ROLE
test=# revoke create on database demo from admin1;
REVOKE

test=# create user rw_user1 in role demo_rw password 'rw_user1';
CREATE ROLE
test=# create user ro_user1 in role demo_read_only password 'rw_user1';
CREATE ROLE

--
-- nun ein paar tests
--

-- als demo_ddl Tabelle anlegen

test=# \c demo demo_ddl
Passwort für Benutzer demo_ddl:
psql (9.6.2, Server 9.5.6)
Sie sind jetzt verbunden mit der Datenbank »demo« als Benutzer »demo_ddl«.
demo=> \dn
     Liste der Schemas
    Name     | Eigentümer  
-------------+-------------
 demo_schema | akretschmer
 public      | postgres
(2 Zeilen)

demo=> create table demo_schema.foo (id serial primary key, name text);
CREATE TABLE
demo=*> commit;
COMMIT
demo=> insert into demo_schema.foo values (default, 'Andreas');
INSERT 0 1
demo=*> commit;
COMMIT

-- als demo_rw auch was in die Tabelle schreiben

demo=> \c - demo_rw
Passwort für Benutzer demo_rw:
psql (9.6.2, Server 9.5.6)
Sie sind jetzt verbunden mit der Datenbank »demo« als Benutzer »demo_rw«.
demo=> insert into demo_schema.foo values (default, 'Tamara');
INSERT 0 1
demo=*> commit;
COMMIT

-- als demo_read_only lesen und schreiben

demo=> \c - demo_read_only
Passwort für Benutzer demo_read_only:
psql (9.6.2, Server 9.5.6)
Sie sind jetzt verbunden mit der Datenbank »demo« als Benutzer »demo_read_only«.
demo=> select * from demo_schema.foo;
 id |  name   
----+---------
  1 | Andreas
  2 | Tamara
(2 Zeilen)

demo=*> insert into demo_schema.foo values (default, 'Max');
FEHLER:  keine Berechtigung für Relation foo
demo=*>
 
Zurück
Oben