1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Role für frei erreichbare Webseite

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Kampfgummibaerlie, 3 August 2019.

  1. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    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 ;)
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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=*>
    
    
     
    Walter gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden