Privilegi per il proprietario del database; utente dell'applicazione


15

Versione veloce:

Quale comando devo emettere per consentire a un proprietario del database di consentirgli di accedere alle tabelle in questo database e questo può essere fatto dall'account di quel proprietario?


Versione più lunga:

Sto creando un database su RDS. Ho un utente "root" che ho configurato con Amazon.

Amazon crea automaticamente il ruolo di gruppo 'rds_superuser' che è molto privilegiato, ma in realtà non è un superutente.

Sto creando un database e un utente per l'applicazione come segue:

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;

Ho aggiornato questo script per riflettere i suggerimenti di Craig Ringer su come dovrei gestirlo.

Quando l'app si connette (con le credenziali master_application) crea (e quindi possiede) le tabelle.

Il mio problema è che non riesco a utilizzare il mio accesso amministrativo (rootish) per eseguire query perché quell'utente non ha privilegi sulla tabella.

Sono stato in grado di risolverlo prima eseguendo quanto segue dall'account dell'applicazione:

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;

Ma sembra strano che un utente subordinato conceda i privilegi a un utente amministrativo.

Quindi ... Esiste un comando che posso eseguire prima o dopo aver creato le tabelle dall'applicazione che garantirà che il proprietario del database possa accedere alle tabelle all'interno del database?


aggiorna dopo aver provato di nuovo i privilegi di modifica ...

Ciò non consente ancora l'accesso alle tabelle; Vedo che viene suggerito altrove e ha perfettamente senso, ma non funziona per me. Da una shell psql:

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)

integration_root è il mio utente superutente e gli utenti è una tabella all'interno del mio database.


Aggiornare

Ho ricevuto una risposta abbastanza inutile da qualcuno di Amazon.

Mi hanno chiesto di chiamare ALTER DEFAULT PRIVILEGES dall'account di accesso master_application. Anche se questo probabilmente funzionerebbe, non risponderebbe alla mia domanda (che è come posso farlo accadere solo dall'account rds_superuser).

Ho chiesto loro di chiarire questo e sono andati via.

Risposte:


9

Tu vuoi ALTER DEFAULT PRIVILEGES.

Assegnare i rds_superuserdiritti di accesso predefiniti a tutte le nuove tabelle.

Questo riguarda solo le tabelle create dopo il ALTER. Per le tabelle esistenti è necessario GRANTdisporre dei diritti.


Avevo provato a farlo. L'ho scritto male nella domanda originale, l'ho modificato per mostrare esattamente il comando che stavo eseguendo. Ho sbagliato qualcosa?
Andy Davis,

Interessa solo le tabelle create dopo il ALTER. Quando l'hai fatto? Per le tabelle esistenti è necessario GRANTdisporre dei diritti.
Craig Ringer,

Ho modificato i privilegi predefiniti, quindi ho creato le tabelle. Ho intenzione di riprovare, forse ho fatto un errore.
Andy Davis,

Ancora nessuna fortuna, anche se sembra assolutamente il comando che dovrebbe risolvere il problema. Ho aggiornato il comando per includere l'output di \ ddp e \ dp da una delle tabelle.
Andy Davis,

Terribilmente strano. Riesci a riprodurre il problema in un PostgreSQL normale (non RDS)?
Craig Ringer

0

Lo schema pubblico dovrebbe essere visibile da tutti gli utenti. Non si dovrebbero limitare i diritti dello schema pubblico a un solo gruppo.

Quindi, se non si utilizza:

GRANT ALL ON SCHEMA public TO GROUP rds_superuser WITH GRANT OPTION;

Puoi lavorare in sicurezza con lo schema pubblico con tutti gli account.

Se non si desidera che account specifici confondano le tabelle dello schema pubblico, quindi creare un nuovo ruolo (per gli utenti della propria app) e revocare i diritti da questo particolare ruolo all'interno dello schema pubblico. Qualcosa di simile a:

CREATE USER mywebuser WITH PASSWORD '*****';
REVOKE ALL PRIVILEGES ON SCHEMA public FROM mywebuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mywebuser; (or whatever rights you need to provide)

Non viceversa mentre provi a farlo.


Eh? A GRANTnon dovrebbe mai essere in grado di ridurre i diritti di accesso. Non sono convinto. Si noti che i diritti su uno schema non vengono ereditati dalle nuove tabelle in quello schema, quindi avere accesso allo publicschema non significa che è possibile utilizzare le tabelle al suo interno.
Craig Ringer,

Finalmente sono riuscito a provarlo e non aiuta la situazione.
Andy Davis,

Ho modificato la domanda per eliminare la sovvenzione a cui si riferiva @Aleandros. Non sembra essere il problema, ma penso che sia stata una distrazione.
Andy Davis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.