Bonne année 2017 à tous les DBA, développeurs et forumeurs du site!
Sur le site d'Oracle j'ai lu pour SYSOPER la chose suivante : "This privilege allows a user to perform basic operational tasks, but without the ability to look at user data."
https://docs.oracle.com/cd/B28359_01...htm#ADMIN11047
Il est bien marqué que SYSOPER ne permet pas d'accéder aux données utilisateurs, donc qu'aux tables et vues du dictionnaire de données?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 System Privilege Operations Authorized SYSDBA • Perform STARTUP and SHUTDOWN operations • ALTER DATABASE: open, mount, back up, or change character set • CREATE DATABASE • DROP DATABASE • CREATE SPFILE • ALTER DATABASE ARCHIVELOG • ALTER DATABASE RECOVER • Includes the RESTRICTED SESSION privilege Effectively, this system privilege allows a user to connect as user SYS. SYSOPER • Perform STARTUP and SHUTDOWN operations • CREATE SPFILE • ALTER DATABASE OPEN/MOUNT/BACKUP • ALTER DATABASE ARCHIVELOG • ALTER DATABASE RECOVER (Complete recovery only. Any form of incomplete recovery, such as UNTIL TIME|CHANGE|CANCEL|CONTROLFILE requires connecting as SYSDBA.) • Includes the RESTRICTED SESSION privilege This privilege allows a user to perform basic operational tasks, but without the ability to look at user data.
J'ai voulu valider cela avec les tests suivants car je ne connaissais pas cette restriction sur SYSOPER.
Le user HR01 a une table V_TEST01 et un synonyme public dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 SQL> CONNECT HR01 Enter password: Connected. SQL> DESC V_TEST01 Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER LIB VARCHAR2(50 CHAR) SQL> SELECT COUNT(*) FROM V_TEST01; COUNT(*) ---------- 1 SQL> SELECT OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME FROM DBA_SYNONYMS WHERE TABLE_NAME LIKE 'V%01%'; OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME ------------------------------ ------------------------------ ------------------------------ ------------------------------ PUBLIC V_TEST01 HR01 V_TEST01
On se connecte comme un autre user, HR, pour voir si le synonyme est OK et si on a les droits de faire un SELECT sur V_TEST01.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SQL> CONNECT HR Enter password: Connected. SQL> SELECT COUNT(*) FROM HR01.V_TEST01; COUNT(*) ---------- 1 SQL> SELECT COUNT(*) FROM V_TEST01; COUNT(*) ---------- 1
On se connecte AS SYSDBA pour voir si le synonyme public fonctionne aussi pour ce privilège système.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SQL> CONNECT HR / AS SYSDBA Enter password: Connected. SQL> SHOW USER USER is "SYS" SQL> SELECT COUNT(*) FROM V_TEST01; COUNT(*) ---------- 1
Même test mais avec AS SYSOPER : le SELECT est KO --> est-ce que ça prouve que SYSOPER ne peux pas accéder aux tables autres que celles du dictionnaire de données, celles pour qui le owner est SYS?
Ce n'est pas une histoire de droits avec GRANT car je n'ai pas donné de droits à SYS sur cette table et ce synonyme public.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SQL> CONNECT HR / AS SYSOPER Enter password: Connected. SQL> SELECT COUNT(*) FROM V_TEST01; select count(*) from v_test01 * ERROR at line 1: ORA-00942: table or view does not exist
BIZARRE : même sur les tables de SYS, le SELECT est KO! Là, c'est un pb de droits sur le dictionnaire de données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 SQL> CONNECT HR / AS SYSOPER Enter password: Connected. SQL> SHOW USER USER is "PUBLIC" SQL> SELECT COUNT(*) FROM DBA_TABLES; select count(*) from dba_tables * ERROR at line 1: ORA-00942: table or view does not exist
Visiblement, PUBLIC n'a le droit par défaut defaire des SELECT que sur les tables de son schéma, comme un user normal.
C'est bizarre car pour accéder au schéma PUBLIC il faut se connecter avec AS SYSOPER qui est un privilège système puissant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SQL> SELECT COUNT(*) FROM CAT; COUNT(*) ---------- 3978 SQL> SELECT COUNT(*) FROM USER_TABLES; COUNT(*) ---------- 0
Et si on donne à PUBLIC le droit de faire des SELECT sur tout le dictionnaire de données.
ATTENTION : écrire PUBLIC sans guillemets. Et là ça marche pour les tables SYS!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 SQL> CONNECT / AS SYSDBA Connected. SQL> GRANT SELECT ANY DICTIONARY TO PUBLIC; Grant succeeded. SQL> CONNECT HR/HR AS SYSOPER Connected. SQL> SHOW USER USER is "PUBLIC" SQL> SELECT COUNT(*) FROM DBA_TABLES; COUNT(*) ---------- 1686
En revanche PUBLIC ne peux toujours pas accéder aux données applicatives.
Est-ce que vous pouvez me dire si je me suis trompé quelque part dans mes tests ou bien si j'ai bien prouvé que SYSOPER ne peut pas accéder aux données applicatives?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SQL> SELECT COUNT(*) FROM V_TEST01; SELECT COUNT(*) FROM V_TEST01 * ERROR at line 1: ORA-00942: table or view does not exist SQL> SELECT COUNT(*) FROM HR01.V_TEST01; SELECT COUNT(*) FROM HR01.V_TEST01 * ERROR at line 1: ORA-00942: table or view does not exist
Par avance merci!
Partager