• oracle-privilegi

    Privilegi in Oracle

    Quando più utenti possono accedere agli oggetti del database, l’autorizzazione può essere controllata a questi oggetti con i privilegi. In questo articolo vedremo la differenza tra privilegi di sistema e privilegi sugli oggetti.

    Tre categorie di privilegi in Oracle

    In un precedente articolo dal titolo Utenti, ruoli e privilegi in Oracle su questo blog abbiamo introdotto il concetto di utenti, ruoli e privilegi in Oracle.  In questo articolo vedremo …

    Affinché gli sviluppatori di database possano eseguire le istruzioni SQL sugli oggetti di un database, l’utenza che utilizzano deve avere i privilegi per l’esecuzione dell’istruzione stessa.
    Esistono tre categorie generali di privilegi:

    1. Privilegi di sistema: fornisce la possibilità di eseguire una determinata attività/istruzione nel database;
    2. Privilegi sugli oggetti: fornisce la possibilità di eseguire una determinata attività/istruzione su un oggetto specifico;
    3. Ruoli: è un insieme di uno o più privilegi di sistema e/o privilegi sugli oggetti e/o altri ruoli.

     

    Privilegi di sistema

    I privilegi di sistema consentono di eseguire alcune attività nel database. Per esempio, per accedere al database, ad un account utente deve essere concesso il privilegio di sistema CREATE SESSION. Per creare una tabella, ad un account utente deve essere garantito il privilegio di sistema CREATE TABLE.

    I privilegi di sistema sono molto numerosi (oltre 100). Eccone elencati alcuni:

    • CREATE SESSION
    • CREATE TABLE
    • CREATE VIEW
    • CREATE SEQUENCE
    • CREATE SYNONYM
    • CREATE PUBLIC SYNONYM.
    • CREATE ROLE
    • CREATE PUBLIC SYNONYM
    • DROP PUBLIC SYNONYM
    • CREATE ANY TABLE
    • ALTER ANY TABLE
    • DELETE ANY TABLE
    • DROP ANY TABLE
    • INSERT ANY TABLE
    • SELECT ANY TABLE
    • UPDATE ANY TABLE
    • CREATE ANY VIEW
    • DROP ANY VIEW
    • CREATE ANY INDEX
    • ALTER ANY INDEX
    • DROP ANY INDEX
    • CREATE ANY SEQUENCE
    • ALTER ANY SEQUENCE
    • DROP ANY SEQUENCE
    • SELECT ANY SEQUENCE
    • CREATE ANY SYNONYM
    • DROP ANY SYNONYM
    • CREATE ANY DIRECTORY
    • DROP ANY DIRECTORY
    • ALTER ANY ROLE
    • DROP ANY ROLE
    • GRANT ANY ROLE
    • FLASHBACK ANY TABLE
    • CREATE USER
    • ALTER USER
    • DROP USER
    • GRANT ANY PRIVILEGE
    • GRANT ANY OBJECT PRIVILEGE

    I privilegi di sistema differiscono dai privilegi sugli oggetti in quanto i privilegi di sistema sono quelli che l’account utente deve avere per creare oggetti di database, ad esempio. Quindi, una volta creato l’oggetto, possono essere concessi ad altri utenti i privilegi su quel particolare oggetto.

    Ad esempio, il diritto di eseguire l’istruzione CREATE TABLE per creare una nuova tabella di database è un privilegio di sistema. La possibilità di modificare righe di dati su una determinata tabella di proprietà di un account utente è un privilegio su oggetto, perché è il diritto di fare qualcosa su un oggetto particolare.

    Un privilegio di sistema è come una patente di guida: è la possibilità di guidare un’auto in generale. Se il proprietario di una specifica auto ti autorizza a guidarla, quello è un privilegio su un oggetto. Per guidarla hai bisogno di entrambi: la patente di guida e l’autorizzazione del proprietario. Lo stesso vale per il database: è necessario avere i privilegi di sistema per eseguire determinate attività e i privilegi sugli oggetti su cui eseguire tali attività.

     

    Concedere privilegi di sistema con GRANT

    Adesso vediamo la parte operativa. I privilegi di sistema sono concessi con l’istruzione GRANT. Ad esempio, con questa sessione SQL che accede all’account SYSTEM di Oracle da un client (ad esempio SQL Developer) viene creato un nuovo utente e viene concesso al nuovo account utente qualche privilegio di sistema utilizzando tre istruzioni GRANT:

    Queste istruzioni vengono eseguite con l’account SYSTEM, un account predefinito creato automaticamente con l’installazione di Oracle che ha il ruolo DBA (DataBase Administrator). L’utente SYSTEM si connette al sistema con i privilegi di SYSDBA, che sono dei privilegi per eseguire alcune azioni di amministrazione del database (come CREATE USER in questo caso).

    Una volta connessi con utente SYSTEM con privilegi di amministratore, vediamo una per una le righe mostrate sopra:

    1. Viene creato un nuovo utente DATABASEMASTER con password S3cr3t;
    2. Viene utilizzata l’istruzione GRANT per concedere il privilegio CREATE SESSION all’utente DATABASEMASTER; questo consente all’utente di effettuare il login al database con l’account DATABASEMASTER;
    3. Viene concessa all’utente DATABASEMASTER la possibilità di creare oggetti, anche se non è istruzione da utilizzare in produzione con queste modalità (si assegna una quota di spazio ad un tablespace);
    4. Viene concesso all’utente DATABASEMASTER il diritto di creare tabelle sul proprio account.

     

    Se adesso ci si connette al database con l’account DATABASEMASTER e si prova a creare una tabella e poi una sequence con le seguenti istruzioni, cosa succede?

    La prima istruzione viene eseguita senza problemi, mentre la seconda genera il seguente errore:

    L’utente DATABASEMASTER non ha i privilegi per creare una sequence. Un utente con privilegi di amministratore (ad esempio SYSTEM) deve concederglieli:

    e l’utente potrà così creare la propria sequence senza errori legati all’insufficienza di privilegi.

    In questi esempi, è stato utilizzato l’account SYSTEM per concedere questi privilegi, ma è possibile concederli con qualsiasi account con privilegi di amministratore di sistema (e anzi è consigliabile)

    La sintassi di base per l’istruzione GRANT è semplice:

    In questa sintassi privilege è uno dei privilegi di sistema definiti nel database. È possibile concedere più privilegi contemporaneamente separando i privilegi con una virgola.

    Rimuovere privilegi di sistema con REVOKE

    La sintassi di base per l’istruzione REVOKE è la seguente:

    Una volta che un privilegio di sistema viene revocato ad un utente (ad esempio viene revocato il privilegio CREATE SEQUENCE), il suo effetto è immediato, ma le operazioni eseguite prima del REVOKE rimangono (le nuove creazioni di sequence andranno in errore, ma le sequence create prima non verranno toccate).

    Per conoscere i privilegi concessi al proprio account basta lanciare la seguente query dalla propria utenza:

     

    Il risultato per l’account DATABASEMASTER appena creato è il seguente:

    privilegi-utente-oracle

     

    La clausola ANY

    Alcuni privilegi di sistema includono la parola chiave ANY. Ad esempio CREATE ANY TABLE fornisce la possibilità di creare tabelle in ciascun account utente del database. Vediamo alcuni esempi. Colleghiamoci con l’utente SYSTEM e creiamo due utenti:

    Al primo utente (LAUREL) viene concesso il GRANT di creazione di tabelle sul proprio schema, mentre al secondo (CLOBBER) viene concesso il diritto di poter creare tabelle su qualunque schema.

    Colleghiamoci con l’utente LAUREL e creiamo una tabella:

    Colleghiamoci con l’utente HARDY e creiamo un’altra tabella, ma sullo schema di LAUREL:

    Le due tabelle vengono create senza errori, entrambe nello schema LAUREL. La prima creata dall’utente LAUREL, la seconda all’utente HARDY, ma entrambe appartengono all’utente LAUREL, come si vede dalla seguente query eseguita da utente SYSTEM:

    Quando un privilegio di sistema utilizza la parola chiave ANY, il privilegio autorizza l’utente ad eseguire un task come se stesse utilizzando un altro account utente. Nell’esempio, HARDY ha creato una tabella nell’account di LAUREL, anche se si tratta di un task tipicamente riservato all’utente LAUREL, ma reso possibile dal privilegio di creare tabelle in qualsiasi account.

    La clausola WITH ADMIN OPTION

    La sintassi di base per l’istruzione GRANT è la seguente:

    In questa sintassi, option è una clausola aggiuntiva che può essere inclusa nell’istruzione GRANT ad esempio nel seguente modo:

    In questo caso l’utente riceve il privilegio specificato insieme al diritto di poter concedere lo stesso privilegio ad un altro utente.

    grant-with-admin-option

    L’istruzione REVOKE invece non usa la clausola WITH ADMIN OPTION. Quando viene revocato un privilegio di sistema ad utente, quell’utente perde il privilegio (ma non gli utenti a cui l’ha concesso, se non esplicitamente revocato).

    La clausola ALL PRIVILEGES

    Piuttosto che specificare i privilegi da assegnare ad un utente uno per uno, un utente con privilegi di amministrazione può assegnare tutti i privilegi di sistema in un unico comando:

    In questo caso si può anche aggiungere la clausola WITH ADMIN OPTION.

    L’utilizzo della clausola ALL PRIVILEGES deve essere usata con cautela.

    L’account PUBLIC

    L’account PUBLIC è un account utente creato automaticamente nel database Oracle (al momento dell’installazione) e rappresenta tutti gli utenti. Tutti gli oggetti di proprietà di PUBLIC sono trattati come se fossero di proprietà di tutti gli utenti nel database, presente e futuro. Nel contesto dei privilegi, l’istruzione GRANT può utilizzare la parola chiave PUBLIC al posto del nome dell’account utente. Per esempio:

    Questa istruzione concede il privilegio CREATE ANY TABLE a tutti gli utenti del database (anche se è sconsigliabile). Piuttosto è comune assegnare a PUBLIC un privilegio su uno specifico oggetto.

     

     

    Giulio Cantali – IT Consultant

    Creatore di Database Master, il primo percorso per diventare esperti di database

Lascia un commento

Se vuoi condividere la tua opinione, lascia un commento

Puoi usare questi tag e attributi: HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">