Vmstat, Top, free...

Pour superviser son system sous linux pas besoin d'utiliser des logiciels tierces une panoplie de commandes est la pour vous servir; une des commandes utilitaires dans est vmstat, celle-ci permet de donner des statistiques sur les process, les IO, l'utilisation de la mémoire, l'utilisation du processeur utiliser sans arguments ca donne la sortie suivantes :oracle@HOST1:~> vmstat



La sortie est divisée en six colonnes chacune contienne des informations spécifiques.
Process :

b pour l'attente de libération de CPU, cette colonne ne doit pas prendre constamment une valeur supérieure à 0.

swap :
si et so pour swap in et swap out ces deux valeurs indique l'échange de blocks SWAP entre la mémoire et les disques ces deux valeurs doivent rester à 0 le plus longtemps possible.

CPU :
CS pour contexte switch indique le nombre de changements de contexte pour le CPU.

id pour idle time le temps d'inactivité du processeur.
wa temps d'attente pour les IO, il ne doit pas être très élevé.

system :
in nombre d'interruption system par seconde.

io :
bi et bo nombre de blocks écrits et lus du disque par seconde.

memory :
Donne des statistiques globales sur la mémoire, tai
lle de mémoire libre, cache, swap.

Une autre commande utile est la commande TOP qui donne une vue en temps réelle sur l'utilisation mémoire, cpu, priorité... pour chaque process et d'autre information utile, la sortie est par défaut trié selon la consommation des ressources la plus couteuse :
oracle@HOST1:~> top


D’autres commandes plus ou moins utiles :
mpstat, iostat, free, sar, ps, netstat...pour plus de détails consulter l'aide en ligne :

oracle@HOST1:~> man free

PL/SQL : La clause AUTHID CURRENT_USER

Quand on appelle une procédure, une fonction ou un package il y a deux modes de privilèges d'exécution :
Soit avec les droits de définition; le code utilisé permet d'accéder aux objets qu'il appelle avec les droits utilisateur qui a écrit ce code.
Soit avec les droits d'invocation; le code est alors appelé avec les droits de l'utilisateur qui appelé le code stocké.
Explication :
L’utilisateur Scott se connecte et fait une select sur la table employees qui est dans le schéma hr :
SQL> select first_name from HR.employees where employee_id=190;
select first_name from HR.employees where employee_id=190
*
ERREUR Ó la ligne 1 :
ORA-00942: Table ou vue inexistante
Il obtient une erreur; alors l'utilisateur HR crée une procédure qui fait la même chose et donne le droit d'exécution a Scott :
SQL> create or replace procedure normale_proc is
2 nom varchar2(20);
3 begin
4 select first_name into nom from employees where employee_id=190;
5 dbms_output.put_line('le nom est :'||nom);
6 end;
7 /
Procédure créée.
SQL> grant execute on normale_proc to scott;
Autorisation de privilèges (GRANT) accepte.
SQL>
Maintenant pour Scott ça donne le résultat suivant :
SQL> set serveroutput on
SQL> exec hr.normale_proc
le nom est :Timothy

Procédure PL/SQL terminée avec succès.
SQL>
Ce genre de fonctionnement peut s'avérer très pratiques si on ne veut pas donner des privilèges sur les objets auxquels il accède notre code, mais il peut s'avérer tres dangereux si notre code contient une quelconque vulnérabilité, par exemple une injection SQL alors les droits d'exécution seront ceux du propriétaire du code.
Pour activer les droits d'invocation pour un code il suffit d'ajouter la clause AUTHID CURRENT_USER avant IS, le même exemple :
SQL> create or replace procedure aut_proc AUTHID CURRENT_USER is
2 nom varchar2(20);
3 begin
4 select first_name into nom from employees where employee_id=190;
5 dbms_output.put_line('le nom est :'||nom);
6 end;
7 /
Procédure créée.

SQL> grant execute on aut_proc to scott;
Autorisation de privilèges (GRANT) acceptée.
SQL>
Maintenant pour Scott ca donne un 942:
SQL> exec hr.aut_proc
BEGIN hr.aut_proc; END;
*
ERREUR Ó la ligne 1 :
ORA-00942: Table ou vue inexistante
ORA-06512: Ó "HR.AUT_PROC", ligne 4
ORA-06512: Ó ligne 1

pour savoir quelle mode d'exécution pour une procédure on consulte la vue user_procedures :
SQL> select OBJECT_NAME,AUTHID from user_procedures
2 where OBJECT_NAME in ('AUT_PROC','NORMALE_PROC');

OBJECT_NAME AUTHID
------------------------------ ------------
AUT_PROC CURRENT_USER
NORMALE_PROC DEFINER

PL/SQL : Le package DBMS_RANDOM

Le package dbms_rnadom dans oracle permet de générer des valeurs aléatoires entres -2^31 et 2^31, pour ce faire vous devez initialiser le générateur pseudo-aléatoire (il n'y a pas de génération aléatoire à 100% dans l'informatique) avec une valeur numérique :
SQL> exec dbms_random.initialize(34);

Procédure PL/SQL terminée avec succès.

La procédure initialize ne prend que des valeurs numériques comme paramètre, une autre procédure qui fait la même chose mais qu'est obsolète est la procédure SEED, le seul avantage de SEED est l'utilisation de chaine de caractère pour initialiser le générateur :
SQL> exec dbms_random.seed('bla bla bla..');

Procédure PL/SQL terminée avec succès.

Une fois le générateur initialisé vous pouvez générer des nombres en appelant la fonction value :
SQL> select dbms_random.value(100,150) from dual;

DBMS_RANDOM.VALUE(100,150)
--------------------------
106,250729

SQL>
La fonction value prend deux paramètres qui constituent la plage dans laquelle les nombres seront générés

Oracle : injection du code PL/SQL

L’attaque du code PL/SQL par une injection SQL est toujours d'actualité malgré son apparition depuis plusieurs années, cela est du généralement aux mauvaises habitudes des développeurs, en gros l'attaque consiste à forgé une autre requête a partir d'une requête qui accepte des paramètres, exemple :
SQL> create or replace procedure vul_proc(param varchar2) is
2 type fir_name is table of hr.employees.first_name%type;
3 fname fir_name := fir_name();
4 stmt varchar2(300);
5 begin
6 stmt:='select first_name from hr.employees where last_name='''||param||'''';
7 execute immediate stmt bulk collect into fname;
8 for i in fname.first..fname.last loop
9 dbms_output.put_line(fname(i));
10 end loop;
11 end;
12 /

Procédure crée.

L’utilisation légitime de cette procédure est :
SQL> set serveroutput on
SQL> exec vul_proc('King')
Janette
Steven
Procédure PL/SQL terminée avec succès.
SQL>
Mais le paramètre param est concaténé à l'instruction stmt sans aucun contrôle ce qui peut donner des idées :
SQL> exec vul_proc('King'' or ''1''=''1 ')
Ellen
Sundar
Mozhe
David
Hermann
Shelli
....

ou pire encore :
SQL> exec vul_proc('King'' union select password from dba_users where ''1''=''1 ')
2BE6F80744E08FEB
2CA614501F09FCCC
2D594E86F93B17A1
3DF26A8B17D0F29F
3FB8EF9DB538647C
4A3BA55E08595C81
4C6D73C3E8B0F0DA
66F4EF5650C20355
71E687F036AD56E5
72979A94BAD2AF80
72E382A52E89575A
7C9BA362F8314299
7EFA02EC7EA6B86F
84B8CBCA4D477FA3
88A2B2C183431F00
88D8364765FCE6AF
8A8F025737A9097A
9793B3777CD3BD1A
9C30855E7E0CB02D
BFBA5A553FD9E28A
CE4A36B8E06CA59C
DF02A496267DEE66
F25A184809D6458D
F894844C34402B67
FA1D2B85B70213F3
FFF45BB2C0C327EC
Janette
Steven
anonymous

Procédure PL/SQL terminée avec succès.
Pour éviter ce genre de situation le mieux sera d'utiliser des variables attachées dans la chaine passer à execute immediate et une clause USING pour utiliser le paramètre :
SQL> create or replace procedure vul_proc(param varchar2) is
2 type fir_name is table of hr.employees.first_name%type;
3 fname fir_name := fir_name();
4 stmt varchar2(300);
5 begin
6 stmt:='select first_name from hr.employees where last_name= :param ';
7 execute immediate stmt bulk collect into fname using param;
8 for i in fname.first..fname.last loop
9 dbms_output.put_line(fname(i));
10 end loop;
11 end;
12 /

Procédure crue.

L’attaque par une injection SQL ne marchera pas, puisque ORACLE précompile l'instruction STMT et il ne permettra qu'un seul paramètre valide qui ne contiendra aucun mot clé SQL :
SQL> exec vul_proc('King'' union select password from dba_users where ''1''=''1 ')
BEGIN vul_proc('King'' union select password from dba_users where ''1''=''1 '); END;

*
ERREUR à la ligne 1 :
ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur
ORA-06512: à "SYS.VUL_PROC", ligne 8
ORA-06512: à ligne 1