Sicurezza in Oracle

Oracle fornisce caratteristiche di sicurezza concedendo e revocando ad ogni singolo utente una determinata lista di privilegi. Queste caratteristiche sono indipendenti da qualsiasi altra forma di sicurezza presente nel sistema.


Utenti, ruoli e privilegi

Un utente di Oracle ha un nome utente e una password, e possiede tabelle, viste e tutte le risorse da lui create. Un ruolo in Oracle consiste in una serie di privilegi. I ruoli possono essere assegnati ad utenti appropriati. Esistono privilegi di sistema del DB, che consentono di eseguire particolari serie di comandi e privilegi di oggetti del DB.


Creazione di un utente

Oracle è fornito con due utenti già creati, SYSTEM e SYS. Per creare altri utenti, occorre accedere a system cui è concesso questo privilegio.
La sintassi per creare un nuovo utente è:

create user utente identified [ by password | externally ];
La parola chiave externally è utilizzata per accedere ad Oracle direttamente con la password di sistema.
Con il comando:
create user segretario identified by segr;
viene creato un utente segretario con password segr (Figura 2.1).

Figura 2.1 Creazione utente

Creazione Utente


Per cambiare la password occorre utilizzare il comando ALTER USER.
Con il comando:
alter user segretario identified by newpassw;
l'utente segretario ha la password newpassw al posto di segr.


Gestione della password

In Oracle (dalla versione 8 in poi) le password possono scadere e gli account possono essere bloccati dopo vari tentativi di connessione falliti.
Oracle conserva una storia delle password inserite in modo da evitare il riutilizzo delle password già utilizzate.
Queste caratteristiche sono determinate dal profilo assegnato all'account stesso. I profili sono gestiti dal DBA e creati con il comando CREATE PROFILE.
I profili possono imporre le seguenti limitazioni:

Con il comando password in SQL*Plus la password che è cambiata non è visualizzata sullo schermo.
L'utente DBA può modificare la password di ogni utente nel seguente modo:
PASSWORD
changing password for utente
Old password:
New password:
Retype new password
il messaggio di conferma
password changed
conferma il buon esito dell'operazione.


Ruoli standard

Un utente con account e password non ha nessun privilegio di sistema, quindi non può accedere a nessuna risorsa del DBMS. Oracle fornisce tre ruoli standard, compatibili con le versioni precedenti, che forniscono privilegi di sistema:


Concessione e revoca di privilegi

Il comando GRANT permette di assegnare privilegi di sistema secondo la seguente sintassi:

grant {privilegio sistema | ruolo}
[,{privilegio sistema | ruolo},...]
[with admin option]
la clausola with admin option consente al beneficiario di assegnare il privilegio o ruolo ad altri utenti o ruoli.
In figura 2.2 si è dato il privilegio di SELECT sulla tabella anagrafe all'utente segretario.

Figura 2.2 Concessione Privilegi

Concessione Privilegi


Il comando Revoke permette di annullare i privilegi concessi secondo la seguente sintassi:
revoke {privilegio sistema | ruolo}
[, {privilegio sistema | ruolo}, ...]
from {utente | ruolo } [, {utente | ruolo}] ...
[with admin option]

Con questo comando si revocano soltanto tutte le concessioni ad un utente, ma non sono distrutte tutte le risorse da lui possedute; gli è semplicemente proibito di accedervi.
Esempio, supponiamo ora che la tabella anagrafe deve essere controllata dall'amministratore di sistema. Affinché il segretario non legga dati inconsistenti, per il tempo del controllo, gli si revoca il privilegio di SELECT concessogli in precedenza.(Figura 2.3)

Figura 2.3 Revoca Privilegi

Revoca Privilegi


Per rimuovere un utente e tutte le risorse da lui possedute esiste il comando DROP USER
drop user segretario [cascade];
l'opzione cascade rimuove l'utente segretario con tutti gli oggetti da lui posseduti compresi i vincoli di integrità referenziale.


Utilizzo di privilegi non concessi

Si supponga di effettuare una operazione non concessa su di una tabella, Oracle segnala con

ERROR at line 1: ORA 1031: insufficent privileges
il tentativo fallito di accedere ad una risorsa senza averne il diritto. Si noti che l'utente a cui viene segnalato questo errore ha almeno un privilegio sulla tabella.
Nel caso particolare in cui non si ha alcun privilegio su una tabella e si cerca di accedere ad essa Oracle segnala il seguente errore:
ERROR at line 1: ORA-0942: table or view does not exist
questo messaggio non comunica che non si ha alcun privilegio di accesso, ma che la tabella non esiste. Ciò garantisce maggior sicurezza, poiché non rende visibile neppure l'eventuale esistenza della tabella.
Continuando il nostro esempio, vediamo come il segretario che non ha più privilegi sulla tabella anagrafe, quando cerca di accedere ad essa gli verrà segnalato la sua inesistenza.(Figura 2.4)

Figura 2.4 Errore di Accesso

Errore di Accesso



Trasmissione di privilegi

Un utente può concedere ad altri utenti l'autorità per accedere solo alle sue tabelle.
Con l'opzione with grant option si può estendere al beneficiario la possibilità di concedere a sua volta il privilegio concessogli ad altri utenti.


Creazione di Ruoli

Oltre ai tre ruoli standard di sistema è possibile creare propri ruoli.
Per creare un ruolo è necessario avere il privilegio di sistema CREATE ROLE.
La sintassi è la seguente:

create role capo_segr
[not identified|identified [by password|externally]];
Un ruolo appena creato non ha associato alcun privilegio.
Nel nostro esempio abbiamo creato il ruolo capo_segr che consiste nel ruolo di capo dei segretari.


Concessione di privilegi a un ruolo

Una volta che un ruolo è stato creato è possibile concedergli i privilegi.
La sintassi del comando GRANT per i ruoli è identica a quella per gli utenti.
Esempio:

grant select on anagrafe to capo_segr;
Abbiamo concesso al ruolo capo_segr il privilegio di SELECT sulla tabella anagrafe. (Figura 2.5)

Figura 2.5 Concessioni Privilegi ad un Ruolo

Concessioni Privilegi ad un Ruolo


Concessione di un ruolo ad un altro ruolo

I ruoli possono essere concessi ad altri ruoli attraverso il comando GRANT come mostrato nel codice seguente:

grant capo_segr to capo2_segr;
in questo esempio capo_segr è concesso a capo2_segr.
Praticamente capo2_segr conserva i suoi privilegi aggiungendo ad essi quelli posseduti da capo_segr, matematicamente capo2_segr=(capo_segr U capo2_segr).
Anche in questo caso con la clausola with admin option si concede al destinatario della concessione l'autorità di concedere il ruolo ad altri utenti o ruoli e può anche modificare o rimuovere il ruolo stesso.


Concessione di ruoli a utenti

E' possibile concedere ruoli ad utenti. I ruoli, così , possono essere considerati come un insieme di privilegi cui è stato assegnato un nome. In questo modo a ciascun utente si concederà i privilegi del ruolo. Nota che i privilegi a utenti concessi attraverso ruoli non possono essere utilizzati come base per viste, procedure, funzioni, package o riferimenti esterni. Con questi tipi di oggetti del DB, occorre concedere direttamente i privilegi necessari. Esempio, concediamo il ruolo di capo_segr all'utente segretario.(Figura 2.6)

grant capo_segr to segretario;

Figura 2.6 Concessioni di Ruoli a Utenti

Concessioni di Ruoli a Utenti


Aggiunta di una password a un ruolo

Per default, i ruoli non hanno associata una password. Per conferire ulteriore sicurezza ad un ruolo si deve utilizzare la parola chiave IDENTIFIED nel comando ALTER ROLE, come mostrato di seguito:

alter role capo_segr identified by csegr;
Con questo comando, ogni volta che un utente cerca di attivare questo ruolo, viene richiesta la password; se però il ruolo è impostato come ruolo di default per l'utente, non è richiesta alcuna password quando questi si connette.
Un'altra possibilità permette di legare i ruoli ai privilegi del sistema operativo, utilizzando nel comando ALTER ROLE la clausola IDENTIFIED EXTERNALLY come mostrato di seguito:
alter role capo_segr identified externally;
Quando il ruolo viene attivato, Oracle controlla il sistema operativo per verificare l'accesso.
Nel nostro esempio è stata data la password csegr al ruolo capo_segr. In VMS il processo di verifica utilizza gli identificatori di diritti del sistema operativo.
Nei sistemi UNIX il processo di verifica impiega il file denominato /etc/group. Per utilizzare questa caratteristica in altri sistemi operativi, si deve porre a TRUE il parametro OS_ROLES del DB nel file init.ora. Ora verrà mostrato un esempio del processo di verifica per un'istanza del DB chiamato Local su un sistema UNIX.
Il file /etc/group del server può contenere la seguente istruzione:
ora_local_caposegr_d:NONE:1:segretario
Con questa istruzione si è concesso il ruolo caposegr all'account (utente) segretario dove: Se il ruolo è concesso a più di un utente la sintassi è:
ora_local_caposegr_d:NONE:1:segretario1,segretario2, ....
Con questa opzione, i ruoli nel DB sono attivati attraverso il sistema operativo.
Se si vuole rimuovere una password da un ruolo si deve utilizzare l'opzione NOT IDENTIFIED, come mostrato di seguito:
alter role capo_segr not identified
Abbiamo rimosso la password dal ruolo capo_segr


Attivazione e disattivazione ruoli

Quando si modifica un account di un utente può essere creato un elenco di ruoli di default attraverso la clausola ALTER USER, come mostra la sintassi:
alter user nomeutente
default role {[ruolo1, ruolo2]
[all|all except ruolo1, ruol2] [NONE]};
L'azione di default di questo comando imposta tutti i ruoli di un utente come ruoli di default, attivandoli tutti ogni volta che l'utente si connette.
Per attivare un ruolo non di default occorre utilizzare il comando SET ROLE come mostrato di seguito:
set role capo_segr;

Si possono, inoltre, utilizzare anche le clausole ALL e ALL EXCEPT in questo modo:
set role all;
set role all except capo_segr;
Se un ruolo ha associato una password, essa si deve specificare in questo modo:
set role capo_segr identified by csegr;
Per disattivare i ruoli nella propria sessione bisogna prima disattivarli tutti con il comando NONE come mostrato:
set role none;
In seguito attivare quelli desiderati.


Revoca dei privilegi da un ruolo

Per revocare i privilegi da un ruolo si utilizza il comando REVOKE come mostrato nell'esempio:

revoke SELECT on anagrafe from capo_segr;
Ogni utente del ruolo capo_segr non può più effettuare query sulla tabella anagrafe.
Infine per rimuovere i ruoli si utilizza il comando DROP come mostrato di seguito:
drop role capo_segr;
I ruoli specificati verranno rimossi completamente dal DB.


Revoca dei privilegi

Per annullare i privilegi concessi si utilizza la seguente sintassi:

revoke privilegio oggetto [, privilegio oggetto ... ]
on oggetto
from {utente | ruolo } [,{utente | ruolo}]
[cascade constraints];
reovoke all rimuove tutti i privilegi.
L'opzione with admin option viene revocata insieme con il privilegio cui è associata.
Se un utente definisce vincoli di integrità referenziale sull'oggetto, per rimuoverli occorre revocare i privilegi sull'oggetto utilizzando l'opzione cascade constraints.


Concessione di risorse limitate

Per concedere quote di risorse in un DB Oracle si utilizza il parametro QUOTA del comando CREATE USER o ALTER USER come mostrato di seguito:
alter user UTENTE
quota 100M on USERS;
Si concede, così, una quota di 100 MB nel tablespace USERS. La quota può anche essere assegnato in fase di creazione dell'utente.
Infine, se non ci sono limiti di spazio per la quota dell'utente, gli si può concedere il privilegio di sistema UNLIMITED TABLESPACE.




Pagina Precedente Torna Inizio Pagina DIA - Dipartimento di
Informatica ed Applicazioni
http://www.oracle.com