Imprimer Imprimer

Injection SQL

Divers, Sécurité Oracle 10g pas de Commentaire »

L’altération SQL
(souvent restreinte à l’injection SQL) est une technique permettant de récupérer des informations confidentielles de la base de données, ou simplement des méta données, en outrepassant les droits applicatifs ‘normaux’. Elle peut également être utilisée pour modifier ou détruire des données.
Le principe est de modifier indirectement les ordres SQL envoyés au serveur, en y incluant des chaînes de caractères spéciales en lieu et place des paramètres attendus par l’applicatif.

L’essentiel crédit de cette technique revient à ‘Rain Forest Puppy’ http://www.wiretrip.net/rfp/

Le passage de paramètres

L’altération SQL est facilement réalisable au sein d’une application web dynamique en enrichissant les données d’un champ de formulaire ou en étendant / modifiant artificiellement les paramètres de l’URL d’appel d’un programme serveur

<Form method=”GET” action=”traitement.php” >
<input type=”text” name=”nom”>
<input type=”submit” value=”Rechercher”>
</form>

remarque les paramètres sont visibles dans l’URL lorsque l’on utilise une méthode GET dans un formulaire) http://serveur/prog?par1=val1& par2=val2&par3…mais pas lorsqu’on utiliser une méthode ‘POST’

on aurait ici pour appeler directement le programme PHP sans passer par le formulaire :

http://serveur.domaine/traitement.php?nom=DELEGLISE

dans le progarmme PHP qui traite la ou les données du formulaire on aura généralement des choses du style :

<?
$sql = “SELECT * FROM users WHERE username LIKE ‘%$nom%’”
?>

L’ordre SQL est ici dynamique, il a une partie variable et est finalisé avec les données du formulaire pour pouvoir être exécuté.

Récupération directe d’informations

L’appel normal vu dans la barre d’adresse du navigateur est donc : http://serveur/traitement.php?nom=ddeleglise
Un appel falsifié serait : http://serveur/prog?nom=un_autre_user
Soit on a de la chance soit on connait un peu l’environnement et on peut essayer ‘admin’, ‘manager’, ’system,’ ‘root’…)
soit on a une erreur MAIS CELA PEUT AUSSI DONNER DES INDICATIONS !

invalid SQL statement ‘SELECT col1
FROM un_autre_user WHERE no= 246′ ,
‘un_autre_user’ table doesn’t exist.

On apprend le nom de user est un paramètre identifiant une table et qu’il y a une table par user, contenant un no qui sert de filtre. Cette chaine est simplement intercalée entre la clause FROM et la condition du SELECT.

‘SELECT col1 FROM’ . $parametre_user . ‘WHERE no = ‘. $no

Certaines des techniques suivantes nécessitent soit une connaissance spécifique de (la façon de coder) de l’applicatif, que notre ami ‘rain forest puppy’ a acquise en lisant les sources des versions de démo des logiciels concernés, soit de ‘parier’ sur une technique de codage ‘classique’ : traitement en boucle des paramètres fournis par un formulaire par exemple

Ajout de SQL supplémentaire en fin de champ

Le principe est de surcharger la valeur d’une variable saisie afin de passer des ordres SQL statiques EN PLUS de l’ordre SQL construit dynamiquement suite à la saisie.

Surcharge d’une variable numérique

Soit un champ de formulaire ‘no’ :1

à la saisie de 1 l’ordre SQL suivant est construit par le programme :

SELECT col FROM la_table WHERE no =1

mais si le controle de type de donnée saisi est permissif et que l’on saisit la valeur + un séparateur d’ordre SQL + un ordre SQL, par exemple :

no : 1; DELETE FROM EMP

l’ordre devient
SELECT col FROM la_table WHERE no =1; delete from EMP

Surcharge d’une variable chaîne (avec utilisation de commentaires)

nom : Deleglise

A la saisie de “Deleglise” (sans cote ni guillemet bien sur) , le programme serveur construit l’ordre SQL :

SELECT col FROM la_table WHERE nom = ‘Deleglise’

(l’ajout de cote par le programme est nécessaire pour que cet SQL soit syntaxiquement correct, une constante chaîne en SQL étant entre simple cote ). Il concatène le début du SELECT, une cote, la valeur, une cote.

Si l’on saisit : Deleglise’;delete from une_autre_table#

le programme serveur construit l’ordre SQL :

SELECT col FROM la_table WHERE nom = ‘Deleglise’;delete from une_autre_table ‘
ce qui est + intéressant mais syntaxiquement incorrect. Il suffira de masquer la dernière cote par un caractère adéquat.

exemple MYSQL

on utilise ‘#’ qui sert simplement à masquer les caractères qui suivent.
SELECT col FROM la_table WHERE nom = ‘Deleglise’;delete from une_autre_table# ‘

exemple Oracle

on utilise leS caractères ‘–’ qui servent à introduire un commentaire :
SELECT col FROM la_table WHERE nom = ‘Deleglise’;delete from une_autre_table–’

Variante : injection (proprement dite) de SQL

Prenons l’ordre SQL suivant, de construction classique.

‘SELECT col1 FROM’ . $parametre_user . ‘WHERE no = ‘. $no

Rien n’empêche de l’enrichir en insérant du SQL au milieu du SQL, tout en restant toujours syntaxiquement correct. Si $parametre_user prend la valeur : ‘  USERS; SELECT * FROM users’
on obtient :

‘SELECT col1 FROM’ . ‘ USERS; SELECT * FROM users ‘. ‘WHERE no = ‘. $no

ce qui enchaine 3 ordres SQL correct dont un qui recupere pas mal d’infos…

on aurait pu tenter pire, du genre ‘DELETE FROM users’ ou ‘DROP TABLE ddeleglise’ , mais il y a fort a parier que les droits auraient été insuffisants. Il est fréquent que les privilèges soient de consulter uniquement, soit de mettre à jour (UPDATE, INSERT, DELETE) les droits de CREATE, DROP et ALTER sont réservés (on espère) aux administrateurs !

Conditions toujours vraies

Soit une requête de connexion sur un serveur web du genre :
$sql = SELECT no FROM tab_users WHERE user=$nom AND password=$pwd
Lorsque l’on donnera un user et un mot de passe valide, et qui existent dans la table des users, on récuperera un no, qui donnera certains accès, dans la suite du programme. Tout cela est assez classique.

Si on arrive à ‘injecter’ une condition toujours vraie, on obtiendra un numéro, sans s’authentifier…
On sait que l’opérateur ‘OU’ est un peu laxiste : dès qu’un membre du ‘OU’ est vraie la condition complète est vraie…il suffit donc de rajouter un OU d’une expression toujours vraie.
Il en existe des tonnes en SQL : 1=1, 2>1, 1<>2,’A'=’A', NULL IS NULL, …
Alors on y va :

on saisit : ‘OR ‘A’='A pour $nom
comme $nom est encadré par des cotes par le programme, la première cote va se transformer en 2 cotes soit une chaine vide, et la deuxieme cote ajoutée fermera la cote de ‘A pour en faire une chaine !
$sql = SELECT no FROM tab_users WHERE user=$nom AND password=$pwd
devient
$sql = SELECT no FROM tab_users WHERE user=’ ‘OR ‘A’='A ‘ AND password=$pwd
– qui renverra TOUJOURS un no !

Utilisation de UNION

Cet opérateur ensembliste n’est disponible, que pour certaines versons de MySQL, mais existe pour toutes les versions d’Oracle.

On pourrait donc concaténer 2 SELECT par l’opérateur UNION. Le select d’origine

SELECT col FROM la_table WHERE nom = ‘Deleglise’

deviendrait par exemple :

SELECT col FROM la_table WHERE nom = ‘Deleglise’ UNION SELECT table_name FROM all_tables

et listerait en prime les noms des tables sur lesquelles j’ai des droits …

la seule contrainte (forte) de l’opérateur UNION est que les 2 SELECTs soient homogènes en terme de nombre de colonnes et de types, ce qui est le cas dans l’exemple (1 colonne de type caractere)

Mises à jour non prévue

L’hypothèse est ici que les champs de formulaire sont traités de manière générique, par une boucle itérative portant sur un tableau de variables de champs de formulaire. C’est la méthode la plus concise, et la plus universelle. PHP fournit par exemple des expressions qui implémentent ce genre de traitement ‘automatique’ en une seule ligne de code.

Prenons un formulaire simple à 2 champs : nom et prenom , et le code classique qui le gère :

while (champ_formulaire) {
$liste_maj = $nom_champ . ” = ‘ ” . $val_champ . “‘,” ;
}
$ordre_update = “UPDATE table_users SET ” . $liste_maj;
supprime_derniere_virgule($ordre_update);
sgbd.connexion.execute ($ordre_update);

La saisie de ‘Deleglise’ et ‘Didier’ donne :
update table_users set nom=’Deleglise’, prenom=’Didier’

La saisie de Deleglise pour nom et Didier \’ , niveau_privilege=\’admin pour prenom nous donne par contre :

update table_users set nom=’Deleglise’, prenom=’Didier’ , niveau_privilege=’admin’

;-( on met à jour 3 colonnes au lieu de 2, dont celle qui change le niveau de privilège de l’utilisateur !
4) Injection (inclusion) SQL proprement dite

Les parades à mettre en place

Précautions relevant de l’administration de base de données

  • Maintenir la veille technologique (s’abonner aux alertes) et passer les patchs dès que disponibles. Cela pourra résoudre notamment les pbs de buffer overflow et autres failles système
  • se baser sur la gestion des droits du SGBD plutôt que sur une gestion applicative
    on y gagnera de plus une meilleure traçabilité ce sui n’est pas négligeable en cas d’attaque
  • mettre en place les privilèges minimums
    (droits de connexion , de consultation sur qq tables sont généralement suffisants)

Précautions relevant du développement

  • Masquer au maximum les paramètres
  • La methode GET encode (pauvrement) les paramètres et leurs valeurs dans l’URL envoyé au serveur. La méthode POST les encode au sein du corps du message de la requête HTTP et est donc moins visible.
    EN utilisant on tentera moins les utilisateurs, mais ils auront toujours la ressource de visualiser le source HTML ;-(
    Bien qu’en terme de norme de programmation ce ne soit pas conseillé, on peut utiliser des nom peu explicites pour les variables sensibles
  • Mettre en place une gestion d’erreur non informative pour l’utilisateur final, en se réservant un niveau DEBUG très détaillé lors du développement
  • sur quote
    En PHP il existe désormais l’option ‘magic_quote’ qui est à ON par défaut et évite l’injection simple
    Le moteur PHP substitue alors des \’ et \” , respectivement aux cotes et guillemets.
    Dans d’autres environnements, On peut sur quoter manuellement les paramètres d’entrées ‘éventuellement en utilisant une fonction personnalisées) et par la invalider le SQL supplémentaire
  • tester que les numérique envoyés sont bien des numériques, et d’une manière générale l’authenticité du type attendu. Ceci est un corollaire du précédent !
  • utiliser un niveau de privilège restreint, nécessaire et suffisant
  • utiliser des procédures stockée

L’intérêt des ordres SQL paramétrés

Utiliser les ordres SQL paramétrés plutôt que les chaînes construites dynamiquement par concaténation. La structure de lordre SQL et le nombre de colonnes concernées (en consultation ou mise à jour) étant prédéfini on ne pourra pas ‘étendre’ le SQL.

exemple PHP / Oracle

{ …
// morceau de code PHP utilisant le SQL paramétré (bind variables)
$conn = OCILogon(”scott”,”tiger”);
$update = OCIParse($conn,”update emp set sal = :par_sql_sal );
OCIBindByName($update, “:par_sql_sal”, &$var_php_sal, 32);
OCIExecute($update);

}

mieux que :

{ …
// morceau de code PHP utilisant le SQL ‘concaténé’
$conn = OCILogon(”scott”,”tiger”);
$update = OCIParse($conn, “update emp set sal = “.$var_php_sal;);
OCIExecute($update);

}

en PHP / MYSQL

On utilisera en MYSQL, un tableau de variable d’entree
et le caractere ‘?’ comme marqueur de parametre dans l’ordre SQL.
Les principales fonctions MYSQLi pour gérer un ordre paramétré sont les suivantes :
mysqli_stmt_prepare(), mysqli_stmt_bind_param(),
mysqli_stmt_execute()

Voici un exemple extrait de la doc PHP (php.net)

<?
/* il y aura 4 parametres: 3 string et un double ! */
$stmt = mysqli_prepare($link, “INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)”);
mysqli_stmt_bind_param($stmt, ’sssd’, $code, $language, $official, $percent);

$code = ‘DEU’; $language = ‘Bavarian’;
$official = “F”; $percent = 11.2;

/* execute l’ordre prepare */
mysqi_stmt_execute($stmt);

printf(”%d Row inserees .\n”, mysqli_stmt_affected_rows($stmt));

/* libere les ressources */
mysqli_stmt_close($stmt);
mysqli_close($link);
?>

A noter :
Le SQL paramétré offre de plus de sérieux avantages en terme de performances puisqu’il évite de ré analyser (parsing) des ordres SQL qui font les mêmes opérations avec des variable d’entrée différentes (ce qui est très fréquent ! )

Pour terminer, la société FOUDSTONE fournit un certain nombre d’outils gratuits de vérification de sites et plus spécifiquement des outils de simulation d’injection SQL, voir HACME BOOK, HACME TRAVEL, ici : http://www.foundstone.com/us/resources-free-tools.asp

Imprimer Imprimer

Sécurité des bases de données

Divers, Sécurité Oracle 10g pas de Commentaire »

1 Introduction

A savoir (et à se rappeler…) avant de commencer

Les grandes étapes du “Projet” Sécurité

Les différents aspects de la sécurité

Les mécanismes mis en oeuvre pour la sécurité des BDs

Les principales attaques ciblant les SGBDs

Le cas de l’injection SQL

Autres menaces et faiblesses de comportement

Une application concrète : Les basiques de a sécurité d’Oracle

1) Introduction

Evolution des architectures vers plus de complexité

On trouvera ci’-après un résumé succint des principales étapes de l’évolution des architectures matérielles et
logicielles qui se sont profondément modifiées lors des deux dernières décennies.

Type client Type serveur Type connexion / architecture logiciels clients logiciels serveur
terminal Mainframe directe - OS + Applicatif + fichiers de données
PC terminal Départemental réseau émulateur OS + Applicatif + SGBD
PC lourd Départemental client / serveur applicatif
nav + applet
OS + Applicatif + SGBD
PC léger Départemental / Central n-tier+ X Net navigateur Srv d’application : OS (+web) + appliSrv de données : OS + SGBD


la  plupart de ces architectures peuvent sembler désuettes, voire anachroniques,  mais il suffit de se pencher sur l’écran d’un ordinateur dans une grande surface ou un aéroport pour constater que l’émulation de terminal  (même enjolivée) est toujours très utilisée .
Quoi qu’aie pu en penser SUN il y a quelques années :” the Network  is NOT YET the computer”

On constate cependant à l’évidence une tendance à  la complexité :

  • multiplication des matériels (plusieurs clients fixes ou mobiles,
    plusieurs serveurs, réseau hétérogènes)
  • multiplication des couches logicielles (OS client, application client, client
    reseau, OS serveur, serveur reseau, serveur applicatif, SGBD)
  • multiplication (voire ubiquité) des réseaux ( intranet, internet
    et surtout en ce qui concerne la sécurité des données
    EXTRAnet)
  • généralisation du partage de données : entre particuliers,
    mais aussi employés, entreprises, clients, fournisseurs, partenaires

qui fait de la sécurité des données un enjeu majeur

La sécurité : un nouvel enjeu

Plusieurs raisons font que la sécurité devient un enjeu important  :

  • complexité croissante des SI
  • exigence croissante de qualité (certification ISO 9001, et plus spécifiquement  ISO 27001)
  • exposition accrue des données et applications avec INTERNET + INTRANET ++ EXTRANET
  • augmentation (et meilleure diffusion / communication) des attaques

Pour info, ci après les statistiques du CERT  sur les enregistrements d’incidents des dernières années :

stats_cert.jpg

Note : l’absence de statistiques depuis 2003 indique simplement que le CERT a arrété de compter !!!!!!!!!!!!!!!!! Notamment à cause du fait que de + en + d’automates font des attaques  massives, ce qui rend leur nombre de moins en moins significatif.

2) A savoir (et à  se rappeler…) avant de commencer

  • La complexité des SI impose une approche globale,
    ’systémique’ du problème (attention de ne pas envisager QUE la sécurité des BDs)

  • Un SI a le niveau de sécurité du plus faible de ses composant  (principe du “maillon faible” !)

  • Elle nécessite l’implication ET SURTOUT L’ADHESION  de TOUS  (si certains employés n’adhèrent pas, ils généreront  du “maillon faible”)

  • La sécurité est fonction d’objectifs et d’un enjeu  (la mise en place d’un plan de sécurité est un projet)

  • Il n’existe pas de système totalement sûr( on visera à satisfaire au mieux les objectifs et répondre aux besoins)

3) Les grandes étapes du “Projet” Sécurité

 

elles peuvent être résumées dans le schéma suivant  :

strategie_pgssi.gif

La phase stratégique

note : la phase stratégique reboucle sur elle même : la décision stratégique , plutôt une VOLONT2 STRATEGIQUE au départ donne lieu à une étude d’opportunité / faisabilité (en fonction des risques, des enjeux, des obligations légales, etc) et donne (ou pas) la décison stratégique.

  • La législation 

Pourquoi la prendre en compte :
- il existe des lois, nul n’est censé les ignorer
- les enfreindre implique une responsabilité civile ou pénale de l’entreprise
- la loi peut imposer de nouvelles activités à l’entreprise (pas seulement interne) : exemple : la dématérialisation des marchés publics et l’e administration

Quelle législation ?
- lois nationales, directives, Européennes, lois internationales
- règlements intérieurs, conventions collectives (de la métallurgie par exemple), délibération des collectivités

Les lois nationales concernent principalement :
- la loi informatique et libertés (CNIL) (respect de la vie privée, des données personnelles, obligation de déclaration)
- la propriété intellectuelle
- protection/la copie/le piratage d’oeuvres ou de logiciels
- le recyclage de déchets électroniques et informatiques

  • L’analyse des risques

On sait qu’il y a des risques, encore faut il les analyser / évaluer.
Il existe différentes catégories de menaces :
- internes / externes (80% / 20 % !!)
- par intérêt économique ou par jeu / défi intellectuel

Il existe différents types d’acteurs :
- des individus (employés rancuniers ou cupides, hackers)
- des entreprises
- des états (espionnage industriel, terrorisme)

On évaluera par exemple leur probalité (est ce qu’une administration est susceptible d’être attaquées par des entreprises concurrentes ???)

  • La classification

Pragmatisme !! : toutes les informations ou ressources associées ne demandent pas le même niveau de sécurité. Cela implique de les classifier / quantifier. Un effet de bord intéressant sera que l’on limitera l’énergie et l’argent dépensé !

On quantifie la SENSIBILITE des infos et ressources (en fonction de la loi, des enjuex , des missions de l’entreprise)
==> taxinomie :

- par niveau de sensiblité
- par domaine de sécurité (confidentialité, disponiblité,…)
Ceci implique des procédures de protection et de gestion des documents et des ressources.
ET aussi un niveau de diffsuion des docs (de libre à…secret défense!)

4) Les différents aspects de la sécurité

On envisage souvent la sécurité sous un angle fermé, essentiellement celui de la confidentialité. Mais bien d’autres concepts sous tendent la sécurité. Ils sont pratiquement tous applicables aux OS ET aux SGBDs, tant il est vrai que ces deux domaines sont extrèmement recouvrants.

  • confidentialité
    Tout n’est pas accessible à tout le monde! Se connecter à  l’OS ou à la base de données, donne un certain nombre de droits et de ressources en fonction d’un profil défini et maintenu par un administrateur. La granularité d’accès peut  aller jusqu’à la vision unique d’un champ d’un enregistrement d’une table articulière.
  • disponibilité
    Faculté de délivrer correctement un service en terme de délai et de qualité à l’utilisateur. Se mesure en pourcentage du temps de fonctionnement total.Une disponibilité de 100% est possible (temps
    de reprise nul) il suffit de s’en donner les moyens logiciels et matériels…
  • fiabilité
    Des mécanismes de sauvegarde variés (physique, logique, off-line, on-line, totale, partielle, incrémentale), ainsi que des mécanismes de journalisation, et de reprise permettent de restaurer une information sans
    pratiquement aucune perte, dans tous les cas de problème matériel ou logiciel.
  • intégrité
    Que les données soient réparties ou non –dans ce dernier cas les mécanismes mis en jeux seront plus complexes– elles doivent être cohérentes. Cela sous entend, d’une part que les accès concurrents d’utilisateurs, notamment lors de mises à jour, ne doivent pas compromettre la cohérence des données et d’autre part que ces dernières satisfassent aux contraintes d’intégrité  du modèle, et / ou aux règles de gestion de l’entreprise.
  • tracabilité
    en cas de problème important ou d’attaque du système, on peut recourir à l’analyse de traces ou de logs. Le niveau de détail de ces traces est paramétrable, et concerne soit les aspects système, soit réseau, soit l’accès aux données élémentaires elles-mêmes.
  • maintenabilité  aptitude à la réparation, évolution, maintenance du système. Mesuré en temps de reprise après panne (Mean Time To Recover)

5) Les mécanismes mis en oeuvre pour la sécurité des BDs

Les sgbds (dignes de ce nom) se doivent de fournir un certain n ombre de mécanismes internes ou de fonctionnalités assurant un niveau satisfaisant de sécurité.

  • L’authentification, est le processus qui permet de vérifier
    qu’un utilisateur réclamant un accès est bien celui qu’il prétend être, ou plus simplement le processus qui contrôle l’identité de l’utilisateur. Cette action (login) se fait en général via la fourniture du couple nom d’utilisateur / mot de passe.
    Dans certains cas l’authentification peut être implicite et héritée d’une authentification précédente, ou reconnue automatiquement (@IP du user sur le réseau par exemple), bien que simplifiant les accès ce choix peut évidemment s’avérer dangereux.

La multiplication des couches logicielles sus évoquée, et l’inflation d’applications sur les postes utilisateur fait que ce dernier est fréquemment amené à s’authentifier des dizaines de fois par jour. La signature unique (Single Sign On ou SSO) est un objectif très louable mais rarement atteint !

  • Les droits et privilèges : une fois correctement identifié l’utilisateur doit pouvoir accéder aux informations
    et ressources auxquelles il a droit (et uniquement à celle là! ) Ce problème est résolu le + simplement avec la gestion de droits élémentaires accordé à un individu, ou plus efficacement avec des rôles et / ou profils affectés à des groupes d’invidus…ou à des rôles ou profils.
  • Les LOGs ou traces : permet d’enregistrer tout ou partie des informations concernant les accès (réussis ou échoués). Cette trace pourra être plus ou moins verbeuse et son volume étroitement surveillée. De ce fait on l’utilisera de manière cibllée sur des périodes de temps spécifiques
  • tolérance aux pannes : permet par du matériel ou du logiciel redondant (CPUs, disques, IOs) de supporter de manière partiellemnt ou complètement transparentes différents types de pannes, tant au niveau du client, que du réseau, que du serveur. Une tolérancec totale a bien sur un cout certain.
  • sauvegarde et restauration
    sauvegarder les données sur des supports externes (disques,  bandes, etc.) et pouvoir les restituer, les plus à jour possibleLe but est de ne pas perdre de données suite à un pb matériel (panne disque) , logiciel (bug) ou une fausse manipulation d’un utilisateur.
  • mécanismes transactionnels
    l’atomicité des transactions, par définition assure la cohérence des données, même dans des environnements distribués. L’image avant modification, stockée de manière redondante dans ou hors de la BD, permet de faire d’éventuels retours arrière pour retrouver le dernier état cohérent, ou de s’assurer qu’il n’y aps pas eu d’opérations partielles ou incomplète (transaction bancaires par exemple)
Aspect sécurité mécanisme mis en oeuvre exemple d’implémentationau niveau SGBD exemple d’implémentationau niveau OS
confidentialité
  • authentification
  • indépendance logique / physique
  • référentiel user / password : DBA_USERS
  • tables de user applicatifs
  • identification externe :
    CREATE USER …IDENTIFIED EXTERNALLY
  • tables / tbs / fichiers
  • vues (1)
  • virtual private database
  • SSO LDAP
  • identification externe
  • architecture client serveur
  • droits et privilèges
  • user OS DBA ou root
traçabilité
  • logs et traces
  • logs apache
  • logs OS
  • logs réseau
fiabilité, disponibilité, maintenabilité
  • tolérance de panne
  • stand by DB
  • cluster logiciels : architecture R.A.C
  • H.A.C.M.P
  • techno RAID
  • machine redondantes
  • sauvegarde et restauration
  • physique : sauvegarde + journalisation + restauration
  • logique : export / import
  • génération de SQL
  • copie physique totale
intégrité
  • transaction atomique
  • contraintes d’intégrité
  • Two Phase Commit (2PC)
  • contraintes ‘reference’
  • read consistancy

(1) la vue est pratiquement le seul contrôle d’accès offrant un niveau de granularité ligne ou colonne ! et qui plus est de manière contextuelle, en les paramétrant (tranches horaires, @ IP, etc.)

6) Les principales attaques ciblant les SGBDs

Crack de password

programmes spécialisé aléatoires ou basés sur  dictionnaire, ou crack manuel

mesures à prendre :

  • ‘politique’ de mots de passes (durée de vie , historique, complecité
  •   imposée, etc.)
  • chiffrement ou hash non réversible
  • changement ou suppression des users connus : super user, administrator,
    system, guest, etc  (==> AUdit régulier des bases)
  • SSO (évite les passwords utilisateurs faibles)

exemple de crack de password Oracle

La table DBA_TABLES est est une table du référentiel Oracle, qui recèle, outre le nom et différentes info sur les utilisateurs de la base, leurs mos de passe crypté. On peut l’utiliser pour cracker un mot de passe avec une méthode brute.

Les avantages de travailler sur ce mot de passe crypté sont multiples  :

• Efficacité : on sait en gros comment Oracle chiffre ses mots de passe : algorithme DES 64 bits, password crypté de 30 caractères maximum, utilisation du user + mot de passe pour le hashage, etc. On ne part
donc pas de zéro
• travail OFFLINE : Contournement d’une éventuelle politique  de mot de passe (password policy) : ce n’est pas le cas par défaut, mais le DBA peut limiter le nombre de tentatives de connexions infructueuses
et faire échouer une méthode brute. Voir l’utilisation des ‘PROFILES’ Oracle pour plus d’information. En travaillant sur une valeur cryptée, sans tentative effective de connexion

• Discrétion : Cf. le point précédent, on peut travailler tranquillement OFFLINE, sur un poste extérieur sans limite de temps ou de nombre d‘essais. Un programme de forçage de mot de passe peut être trouvé
sur le site ‘toolcrypt.org’ à l’adresse suivante :

logo_toolcrypt.gifhttp://www.toolcrypt.org/index.html?orabf

Sur un poste de Windows moyen, il m’a fallu une dizaine de minutes avec ce programme pour casser un mot de passe ‘SYSTEM’ de 6 caractères.
En mode commande il suffit d’entrer la commande suivante :

C:\> orabf 70F277D6E92A1D9B:SYSTEM -n 6
– 70F277D6E92A1D9B est la valeur chiffrée lue dans le dictionnaire
– SYSTEM est le nom de l’utilisateur correspondant
– 6 la longueur minimale du mot de passe cherché

Mais attention : le décryptage d’un mot de passe alphanumérique  > 8 caractères peut durer de quelques jours à plusieurs semaines  !

Un comparatif intéressant des programmes de forçage des mots de passe Oracle, gratuits ou payants a été fait par la société  ‘Red Database Security’ et peut être trouvé ici :
http://www.red-database-security.com/whitepaper/oracle_password_cracker.html

Contournement de l’applicatif par programme client SQL

Au lieu de se connecter via le programme apllicatif, on peut utiliser le mode commande ligne ou un interpréteur SQL standard (SQL+ d’Oracle) ou un outil d’admin (PHPMyAdmin, OEM). On utilise alors directement les droits
du compte propriétaire des données (en général tous les droits).

mesures à prendre :

pas de gestion de droits applicative !
connexion au compte propriétaire interdite (compte locké par exemple)
une gestion des droits fine (connexion + consultation et / ou mise à jour de tables (voire de vues) ciblées

Récupération de données OFFLINE ou Hors production

Il existe des sources de données partiellement ou parfois totalement redondantes de la base de données de production. Ces données peuvent être dans le même format que les données d’origine (tables d’une BD Oracle) ou dans des formats différents (texte, CSV, SQL, …).

Ces données redondantes sont en général moins (ou pas du tout) sécurisées, par rapport à la base de production,
et seront donc une cible plus facile pour les pirates fatigués.

Pour corser le tout, une mauvaise habitude assez répandue dans les entreprises consiste à recopier intégralement des données de production, dans les bases de test ou de développement, pouyr éviter d’extraire des jeux d’essai de données complexes, ou pour ne pas repartir de données vides lors d’un eopération de maintenance logicielle…

Comme données Offline, on citera par exemple :

  • BDs de développement, BDs de test,
  • export de données au format propriétaire (export Oracle par exemple)
  • reverse engineering SQL
  • export au format texte fixe ou CSV
  • sauvegardes binaires des fichiers de la BD, sur bande, disque ou DVD
  • fichier de trace, de LOG ou d’audit
  • base répliquées
  • données répliquées en synchrone ou asynchrone

donnees_offline.gif

Back doors

(”Portes dérobées”) : Programmes usurpateurs qui détournent des fonctionnalités systèmes dans le but d’ouvrir
des accès utiles aux pirates pour contrôler à distance les machines ciblées (modification des programmes de login avec user/passwd en dur, ouverture de ports particuliers, etc.) . Ces programmes sont la plupart
du temps installés par le biais d’un “cheval de Troie”. Parmi les plus (tristement) célèbres, on peut citer BackOrifice (BO) ou encore NetBus.

Les accès illicites via ces backdoors pouvant être facilement détectés par des commandes système standards (liste des process connectés, des ports ouverts) ils sont parfois utilisés conjointement avec des rootkits, ensemble de commandes standards modifiées pour masquer les intrusions.

certaines back doors peuvent être inclsues dans le code d’applications standards,
sans intention forcément malveillante mais pour réserver au développeur du programme, un accès ‘privé’ à toute
les machines hébergeant son code. L’accès au source d’un logiciel libre peut nous prémunir contre ce genre d’indélicatesse.

Refus de service (Deny of Service)

voir le papier de sogoodtobe sur http://www.securiteinfo.com

Buffer Overflow :

Voir le document joint

Recherche d’infos de configuration

( d’identification, d’authentification , méta données )

  • au sein de l’applicatif (en clair dans le source interprété… ou désassemblé)
  • dans l’environnement (fichiers de configuration accessibles sur le serveur ou pire sur le client : *.ini)
  • dans la bases de données elle même
  • sur le réseau (écoute / sniff des lignes)

mesures à prendre :

  • chiffrer (solidement) les infos sensibles dans la BD, dans les fichiers de config,
  • restreindre les accès aux répertoires et fichiers
  • restreindre l’accès aux méta données
  • s’appuyer sur des mécanismes existant identification / authentification par le SGBD, par l’OS
  • réseau : utiliser des protocoles sécurisés : SSL (nécessite des certificats), IPSec, paramétrer finement le firewall, utiliser ports et user ‘originaux’
  •  ’politique’ de mots de passe

Les menaces les plus connues du grand public, visent à paralyser, ou détruire tout ou partie du système d’information. Elles ne ciblent pas vraiment les SGBDs mais nous les citerons néanmoins parce qu’incontournables.
Jetons un oeil aux définitions données par le grand glossaire de la sécurité de ECHU.ORG

7) Le cas de l’injection SQL

voir le document joint


8 Autres menaces et faiblesses de comportement

  • Virus : Au sens large du terme, on qualifie généralement de virus tout programme capable de se reproduire (techniquement, se recopier) lui-même et d’endommager des données informatiques. On les classe
    en plusieurs catégories, principalement: parasite, compagnon, amorce, multiformes, résident mémoire ou non, furtifs, polymorphes, réseau et flibustier.
  • Ver (ou Worm) : programme qui peut s’auto-reproduire et se déplacer à travers un réseau en utilisant les mécanismes réseau, sans avoir réellement besoin d’un support physique ou logique (disque dur, programme hôte, fichier …) pour se propager; un ver est donc un virus réseau.
  • Cheval de Troie : (en anglais trojan horse) un programme informatique effectuant des opérations malicieuses à l’insu de l’utilisateur : vol des mots de passe, copie de données sensibles, exécution d’action nuisible …Une intro très accessible de ces notions est dispo sur :
    http://www.commentcamarche.net/
    et d’autres infos encore sur : http://assiste.com

Quelques faiblesses de comportement

  • ‘portes’ ouvertes : (pas seulement les ‘back doors’ !)porte de la salle machine ouverte, poste ou serveur sans mot de passe ou mot de passe faible, poste sans veille, post it (!)
    ;-) fermez les portes !! mettez en oeuvre la gestion de mots de passe !!
  • Installation par défaut :- les valeurs de paramètres sont connues (port 80 / 1525, les administrateurs sont connus (SA SQLServer, SYS et SYSTEM Oracle, ROOT MySQL)
    - des services superflus sont accessibles (srv ftp, srv samba, snmp, serveur d’admin, etc )- les communications ne sont pas chiffrées (ftp, telnet, pop)
    ;-) lisez la doc !! auditez vos serveurs !!
  • mauvaise politique de gestion des droits (top, au lieu de bottom-up) :- installation confortable : tous les logiciels sont installés sous root, tous les utilisateurs de l’applicatif sont DBAs
    - allow all implicite…deny N / deny all.. allow n
    - utilisation abusive de l’héritage
    - mots de passe faibles
    ;-) maitrisez la gestions des droits de vos OS / logiciels serveurs / bases de données
  • absence de mise à jour
    ;-) faites de la veille technologique, patchez régulièrement, surveillez les alertes
  • mauvais codage (parametres en clair dans les URLs, connexion non chiffrées, code ‘injectable’, etc.) ;-) documentez vous (best practices, faites tester vos programmes)
  • controle d’accès au niveau applicatif, qui peut facilement être court circuité
    ;-) (re) centralisez (ET FACTORISEZ!) les controles au niveau données : contraintes d’intégrité

Comme chacun sait (depuis certaines émissions de télé) c’est le maillon faible de la chaîne qui cassera imanquablement. On peut mettre en place le plus beau (et le + cher) des firewalls, il sera bien
inutile si un adminitrateur est resté ‘loggé’ root sur son poste (Statistiquement la majorité des attaques provient de l’intérieur des entreprises !)

Cependant, on n’oubliera pas de rester pragmatique : tous les PMEs ne sont pas le pentagone et n’intéressent pas tous les hackers de la planète.
Les besoins et les objectifs doivent être clairement définis au départ et l’adéquation de la solution vérifiée.
Un certains nombres d’utilitaires libres sont disponibles sur internet pour vérifier la fiabilité de votre système d’information. Voir parmi la liste des liens utiles.

Il faudra de + trouver un équilibre entre niveau de sécurité satisfaisant et confort (voire simple possibilité) de travai ldes autres acteurs.

Quelques liens utiles sur la sécurité en général

http://www.cert.orghttp://www.certa.ssi.gouv.fr LE centre d’expertise sur la sécurité internetle site du premier ministre sur la sécurité des S.I
  • http://blogorak.estsurinternet.com
  • http://didier.deleglise.free.fr/ ou http://oracle.estsurinternet.com
  • http://www.red-database-security.com/
  • http://www.petefinnigan.com/
  • http://www.oracle.com/technology/deploy/security/index.html
  • http://otn.oracle.com
  • Mon blog sur Oracle 10g et la sécurité
  • Mes tutoriels sur Oracle
  • le site d’Alexander Kornbrust
  • le site de Pete Finnigan
  • Oracle security center :
  • Oracle’s Security guide sur OTN
http://www.insecure.org/links.htmlhttp://citadelle.intrinsec.org/
http://www.securiteinfo.com/
qq liens supplémentaires

Annexe : Systèmes haute sécurité (Trusted Systems)

voir le document (sécurisé) joint sur lessystèmes haute sécurité

Imprimer Imprimer

Principes de base sécurité Oracle

Divers, Sécurité Oracle 10g pas de Commentaire »

Les principaux sont expliqués ici :

Imprimer Imprimer

Droits systeme

Divers, Sécurité Oracle 10g pas de Commentaire »

Privilèges système
Les privilèges systèmes d’accès aux objets s’intéressent plutôt au contenant qu’au contenu. Ils concernent principalement des ordres de création, de modification de structure et de suppression d’objets (SQL DDL plutot que DML)

Ce sont donc des privilèges d’assez haut niveau, que l’on réservera par exemple aux développeurs mais qui seront utilisés avec beaucoup de parcimonie en phase de production…

Liste de quelques  privilèges  système d’Oracle

Nom
du privilege
Type
d’action autorisée
ANALYZE
ANALYZE ANY
Analyser
toutes les tables, clusters, ou indexs
dans
la base de données.
AUDIT
AUDIT ANY
Auditer tous
les objets dans la base de données.
AUDIT SYSTEM
Auditer les
actions de type DBA
CLUSTER
CREATE CLUSTER
créer un
cluster .
CREATE ANY
CLUSTER
créer un
cluster dans tous les schémas.
ALTER ANY
CLUSTER
Modifier
tous les cluster dans la base de données.
DROP ANY
CLUSTER
Supprimer
tous les cluster dans la base de données.
DATABASE
ALTER DATABASE
Modifier
la structure physique de la base
DATABASE
LINK
CREATE DATABASE
LINK
Créer
des database links privés.
INDEX
CREATE ANY
INDEX
créer un
index dans tous les schemas sur toutes les tables.
ALTER ANY
INDEX
Modidier
tous les index dans la base de données.
DROP ANY
INDEX
Supprimer
tous les index dans la base de données.
PRIVILEGE
GRANT ANY
PRIVILEGE
Donner tous
les privileges système
PROCEDURE
CREATE PROCEDURE
Créer
des procedures stockées, fonctions, et packages .
CREATE ANY
PROCEDURE
Créer
des procedures stockées, fonctions, et packages dans tous les schemas.
(suppose ALTER ANY TABLE, BACKUP ANY TABLE, DROP ANY TABLE, SELECT ANY TABLE,
INSERT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE, ou GRANT ANY TABLE.)
ALTER ANY
PROCEDURE
Compiler
toutes les procedures stockées, fonction, ou packages dans tous les
schemas.
DROP ANY
PROCEDURE
Supprimer
toutes les procedures, function, ou package stockés dans tous les
schema.
EXECUTE ANY
PROCEDURE
Executer
toutes les procedures ou functions dans tous les schema.
PROFILE
CREATE PROFILE
Créer
des profils.
ALTER PROFILE
Modifier
tous les profils dans la base de données.
DROP PROFILE
Supprimer
tous les profils dans la base de données.
ALTER RESOURCE
COST
Modifier
la ressource ‘cost’ dans toutes les sessions.
PUBLIC
DATABASE LINK
CREATE PUBLIC
DATABASE LINK
Créer
des database links publics.
DROP PUBLIC
DATABASE LINK
Supprimer
database links publics.
PUBLIC
SYNONYM
CREATE PUBLIC
SYNONYM
Créer
des synonyms publics.
DROP PUBLIC
SYNONYM
Supprimer
des synonyms publics.
ROLE
CREATE ROLE
Créer
des roles.
ALTER ANY
ROLE
Modifier
tous les roles dans la base de données.
DROP ANY
ROLE
Supprimer
tous les roles dans la base de données.
GRANT ANY
ROLE
Grant tous
les roles dans la base de données.
ROLLBACK
SEGMENT
CREATE ROLLBACK
SEGMENT
Créer
des rollback segments.
ALTER ROLLBACK
SEGMENT
Modifier
des rollback segments.
DROP ROLLBACK
SEGMENT
Supprimer
des rollback segments.
SESSION
CREATE SESSION
Se connecter
!!!
ALTER SESSION
faire des
ALTER SESSION .
RESTRICTED
SESSION
Se connecter
malgré un démarrage ‘RESTRICT’. (OSOPER et OSDBA donnent ce
privilege.)
SEQUENCE
CREATE SEQUENCE
crée une
sequence dans son schema.
CREATE ANY
SEQUENCE
Créer
toutes les sequences dans tous les schemas.
ALTER ANY
SEQUENCE
Modifier toutes
les sequence dans tous les schémas.
DROP ANY
SEQUENCE
Supprimer toutes
les sequence dans tous les schémas.
SELECT ANY
SEQUENCE
Reference
toutes les sequence dans tous les schémas.
SNAPSHOT
CREATE SNAPSHOT
Créer
des snapshots (clichés) dans son schema
.
(l’utilisateur doit aussi avoir le privilege CREATE TABLE.)
CREATE SNAPSHOT
Créer
des snapshots dans tous les schémas.
(
CREATE ANY TABLE nécessaire.)
ALTER SNAPSHOT
Modifier
tous les snapshots dans tous les schémas.
DROP ANY
SNAPSHOT
Supprimer
tous les snapshots dans tous les schémas.
SYNONYM
CREATE SYNONYM
créer un
synonym dans son schema.
CREATE SYNONYM
Créer
tous les synonyms dans tous les schémas.
DROP ANY
SYNONYM
Supprimer
tous les synonyms dans tous les schémas.
SYSTEM
ALTER SYSTEM
faire des
ALTER SYSTEM .
TABLE
CREATE TABLE
Créer
des tables ou des indexs dans son propre schéma
CREATE
ANY TABLE
Créer
des tables dans tous les schémas.
ALTER ANY
TABLE
Modifier
toutes les table dans tous les schémas et compiler toutes les vues dans
tous les schémas.
BACKUP ANY
TABLE
Réaliser
des exports incrémentaux.
DROP ANY
TABLE
Supprimer
ou vider toutes les table dans tous les schémas.
LOCK ANY
TABLE
Verrouiller
toutes les tables ou vues dans tous les schémas.
COMMENT ANY
TABLE
Commenter
toutes les tables, vues, ou colonnes dans son schema.
SELECT ANY
TABLE
Interroger
toutes les tables, vues, ou clichés dans tous les schémas.
INSERT ANY
TABLE
Insert rows
into toutes les table ou view dans tous les schémas.
UPDATE ANY
TABLE
Update rows
in toutes les table ou view dans tous les schémas.
DELETE ANY
TABLE
Delete rows
from toutes les table ou view dans tous les schémas.
TABLESPACE
CREATE TABLE
SPACE
Créer tablespaces;
add files to the operating system via Oracle, regardless of the l’utilisateur’s
operating system privileges.
ALTER TABLESPACE
Modifier tablespaces;
add files to the operating system via Oracle, regardless of the l’utilisateur’s
operating system privileges.
MANAGE TABLESPACE
Take toutes
les tablespace offline, bring toutes les tablespace online, et begin et
end backups of toutes les tablespace.
DROP TABLESPACE
Supprimer tablespaces.
UNLIMITED
TABLESPACE
Use an unlimited
amount of toutes lestablespace. This privilege overrides toutes les
specific quotas assigned. If revoked, the grantee’s schema objects remain
but further tablespace allocation is denied unless allowed by specific tablespace
quotas. This system privilege can be granted only to l’utilisateurs et
not to roles. In general, specific tablespace quotas are assigned instead
of granting this system privilege.
TRANSACTION
FORCE TRANSACTION
Fouce the
commit ou rollback of own in-doubt distributed transaction in the local
database.
FORCE ANY
TRANSACTION
Fouce the
commit ou rollback of toutes les in-doubt distributed transaction in the
local database.
TRIGGER
CREATE TRIGGER
crée un trigger
in own schema.
CREATE ANY
TRIGGER
Créer toutes
les trigger dans tous les schémas associated with toutes les table dans
tous les schémas.
ALTER ANY
TRIGGER
Enable, disable,
ou compile toutes les trigger dans tous les schémas.
DROP ANY
TRIGGER
Supprimer toutes
les trigger dans tous les schémas.
USER
CREATE ANY
USER
Créer l’utilisateurs;
assign quotas on toutes les tablespace, set default et tempouary
tablespaces, et assign a profile as part of a CREATE USER statement.
BECOME ANY
USER
Become another
l’utilisateur. (Required by toutes les l’utilisateur perfouming a full database
impout.)
ALTER USER
Modifier other
l’utilisateurs: change toutes les l’utilisateur’s passwoud ou authentication
method, assign tablespace quotas, set default et tempouary tablespaces,
assign profiles et default roles, in an ALTER USER statement. (Not required
to alter own passwoud.)
DROP USER
Supprimer another
l’utilisateur.
VIEW
CREATE VIEW
crée un view
in own schema.
CREATE ANY
VIEW
crée un view
dans tous les schémas. (Requires that l’utilisateur also have ALTER ANY
TABLE, BACKUP ANY TABLE, DROP ANY TABLE, LOCK ANY TABLE, COMMENT ANY TABLE,
SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE,
ou GRANT ANY TABLE.)
DROP ANY
VIEW
Supprimer toutes
les view dans tous les schémas.
Imprimer Imprimer

Changer le mot de passe de DBSNMP en 9iDB

Sécurité Oracle 10g pas de Commentaire »

Le compte DBSNMP présent par défaut sur les bases Oracle, peut être facilement exploiter pour accéder ? des données.

Ce compte est nécessaire pour pour pouvoir utiliser les agents de la console Oracle Enterprise Manager ou de la Grid console.

Pour des raisons de sécurité, il est important de changer le mot de passe par défaut qui vaut DBSNMP !!!!) mais en respectant la procédure suivante :
Changement de Mot de passe pour DBSNMP

1] Arreter l’agent
Oracle7 - Oracle8i
% lsnrctl dbsnmp_stop

Oracle9i
% agentctl stop

2] Editer le $ORACLE_HOME/network/admin/snmp_rw.ora file
Rajouter les parametres suivants :

snmp.connect.{SID}.NAME = dbsnmp
snmp.connect.{SID}.PASSWORD = {new password}

Sous UNIX, pensez ? donner la permission suivante au fichier SNMP_RW.ORA

% chmod 600 snmp_rw.ora

3] Changez le mdp de DBSNMP dans la base avec la commande
La 2ieme commande a le mérite de ne pas avoir de traces en clair dans le sqlnet.trc.

SQL> alter user “dbsnmp” identified by “”;

SQL> password DBSNMP
Modification de mot de passe pour dbsnmp
Nouveau mot de passe : *******
Ressaisir le nouveau mot de passe : *******
Mot de passe modifié

4] Redemarrez l’agent
En 10g le simple fait de changer l’agent comme ? l’étape 3, arrête la collecte des informations et vous propose de changer le mot de passe.

Imprimer Imprimer

Row Level Security (RLS) …un peu plus loin

Divers, Sécurité Oracle 10g pas de Commentaire »

DEMO de la sécurité au niveau LIGNE avec Oracle 10g
(A.K.A Row Level Security / RLS / Fine Grained Access Control / VPDs)

Le but de cette demo est de mettre en place une strategie sur la table
SCOTT.EMP, qui s’appuie sur un contexte utilisateur, défini de manière automatique..
Un user ne devra voir que la (les) ligne’s) qui le concerne dans la table,
même en faisant un ‘SELECT * FROM emp’.
ex : KING ne voit que la ligne de KING, CLARK la ligne de CLARK.
On créera un user Oracle ‘CLARK’ présent dans la table des employés,
pour tester les filtres appliqués au user connecté.

—————————-
– 0) Environnement de TEST
—————————-
– en tant que SYS

— créer un user spécifique pour mettre en place la sécurié
CREATE USER sec IDENTIFIED BY nbvcxw;
– les privileges minimum necessaire pour DEV1
GRANT CREATE SESSION, CREATE TABLE, CREATE PROCEDURE,
CREATE ANY CONTEXT TO sec;
GRANT EXECUTE ON DBMS_RLS TO sec;
GRANT EXECUTE ON DBMS_SESSION TO sec;
– rem on peut remplacer les 2 precedents par un
– GRANT EXECUTE_CATALOG_ROLE TO dev1 (moins ciblé / sécurisé)
CREATE USER clark IDENTIFIED BY clark;
GRANT CREATE SESSION TO clark;
GRANT SELECT ON scott.emp TO PUBLIC;
GRANT EXECUTE ON sec.pack_contexte_emp TO PUBLIC; (pour debug)
GRANT EXECUTE ON filtre_emp TO PUBLIC; (pour debug)

—————————
– 1) déclarer le contexte
—————————

CONNECT sec/nbvcxw
CREATE OR REPLACE CONTEXT contexte_employe
USING pack_contexte_emp;

——————————————————————————–
– 2) definir le contexte applicatif (code du package et attributs du contexte)
——————————————————————————–

– ici c’est le no d’emp et le niveau (chef ou nom)
– qui determineront les privileges d’acces ? l’applicatif

– les specs du package :

CREATE OR REPLACE PACKAGE pack_contexte_emp
AS
PROCEDURE def_contexte;
END;

– le corps du package :

CREATE OR REPLACE PACKAGE BODY pack_contexte_emp
IS
PROCEDURE def_contexte
IS
v_empno NUMBER;
nb_subordonnes NUMBER;
BEGIN

– on recupere le no de l’employe et sa fonction (chef ou non)
– et on definit les attributs du contexte en consequence
– le ‘NAMESPACE’ ‘contexte_employe’ a donc 2 attributs ici
– on ne se sert que du premier dans cet exemple…

– d’abord le no d’emp
– en utilisant le ‘SESSION_USER’ de SYS_CONTEXT
– equivallent a un SELECT username FROM dual
– rem : si le user n’apparait pas dans la table –> no data found (a trapper)

SELECT empno INTO v_empno FROM scott.emp
WHERE ename = SYS_CONTEXT(’USERENV’, ‘SESSION_USER’);

DBMS_SESSION.SET_CONTEXT(’contexte_employe’, ‘no_emp’, v_empno);

– puis son niveau de responsabilite : chef ou non
– si oui son no d’emp est le no de manager de quelqu’un…

SELECT COUNT(*) INTO nb_subordonnes
FROM scott.emp
WHERE mgr= v_empno;
IF (nb_subordonnes <> 0) THEN
DBMS_SESSION.SET_CONTEXT(’contexte_employe’, ‘niveau’, ‘chef’);
ELSE
DBMS_SESSION.SET_CONTEXT(’contexte_employe’, ‘niveau’, ‘employe’);
END IF;

END def_contexte;
END pack_contexte_emp;

– test

select SYS_CONTEXT(’USERENV’, ‘SESSION_USER’) from DUAL
exec sec.pack_contexte_emp.def_contexte

———————————————-
– 3) definir les fonctions limitant les acces
———————————————-

– la ou les fonctions vont retourner une chaine
– qui sera ajoutee a la clause WHERE (predicat supplementaire)
– on utilise le contexte ‘employe’ pour identifier le user

CREATE OR REPLACE PACKAGE filtre_emp
AS
FUNCTION vue_emp (owner VARCHAR2, objname VARCHAR2)
RETURN VARCHAR2;
END;

CREATE OR REPLACE PACKAGE BODY filtre_emp
IS
FUNCTION vue_emp (owner VARCHAR2, objname VARCHAR2)
RETURN VARCHAR2
IS
predicat VARCHAR2(1000);
BEGIN
predicat := ‘empno=SYS_CONTEXT(”contexte_employe”,”no_emp”)’;
RETURN predicat;
END;
END;

– test

SELECT SYS_CONTEXT(’contexte_employe’,'no_emp’) FROM dual
SELECT sec.filtre_emp.vue_emp(’SCOTT’,'EMP’) FROM dual

————————————————————
– 4) creer stratégie d’acces (policy) attachée a la table
————————————————————

DBMS_RLS.ADD_POLICY (proprietaire_objet,nom_objet,nom strategie,proprietaire strategie,fonction_filtre, SQL_concerne) :
execute DBMS_RLS.ADD_POLICY (’scott’, ‘emp’, ‘policy_emp’,’sec’, ‘filtre_emp.vue_emp’, ‘SELECT’);

(si necessaire
DBMS_RLS.DROP_POLICY (nom_owner, nom_table, nom_police) :
execute DBMS_RLS.DROP_POLICY (’scott’, ‘emp’, ‘policy_emp’); )

–test

select * from sys.rls$ where PFSCHMA=’DEV1′;
OBJ# GNAME PNAME STMT_TYPE CHECK_OPT ENABLE_FLAG PFSCHMA PPNAME PFNAME PTYPE
52606 SYS_DEFAULT POLICY_EMP 513 0 1 DEV1 FILTRE_EMP VUE_EMP

———————————————————————
– 5) activer le contexte, avant l’acces aux données des utilisateurs
———————————————————————
– manuellement (ou géré par l’applicatif)
connect clark/clark
exec sec.pack_contexte_emp.def_contexte;

– ou automatiquement par un trigger, en tant que DBA !!

CREATE OR REPLACE TRIGGER dev1.active_contexte_emp
AFTER LOGON ON DATABASE
BEGIN
sec.pack_contexte_emp.def_contexte;
END;

——————-
– 6) Test VPD
——————-

SQL> connect clark/clark
SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
—– —– ——– —- ——– —- —- ——
7782 CLARK MANAGER 7839 09/06/81 2450 10

SQL> connect system/xdcfvgh
SQL> select * from emp;
aucune ligne sélectionnée.

et sans la VPD :

SQL> execute DBMS_RLS.DROP_POLICY (’dev1′, ‘emp’, ‘policy_emp’);
ou moins violent :
SQL> grant exempt access policy to DEV1;
SQL> connect dev1/dev1
SQL> select * from emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
—– ———- ——— ———- ——– ———- —– ——
7369 SMITH CLERK 7902 17/12/80 800 20
7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30
7521 WARD SALESMAN 7698 22/02/81 1250 500 30
7566 JONES MANAGER 7839 02/04/81 2975 20
7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30
7698 BLAKE MANAGER 7839 01/05/81 2850 30
7782 CLARK MANAGER 7839 09/06/81 2450 10
7788 SCOTT ANALYST 7566 19/04/87 3000 20
7839 KING PRESIDENT 17/11/81 5000 10
7844 TURNER SALESMAN 7698 08/09/81 1500 0 30
7876 ADAMS CLERK 7788 23/05/87 1100 20
7900 JAMES CLERK 7698 03/12/81 950 30
7902 FORD ANALYST 7566 03/12/81 3000 20
7934 MILLER CLERK 7782 23/01/82 1300 10
1111 DEV1 Engineer 7782 01/01/07 2000 10

15 ligne(s) selectionnee(s).

L’erreur ORA-28112

l’utilisation des policies déclenche parfois une erreur ORA-28112 , même si les polices sont correctes et les packages aussi.
Voir le musée des erreurs - erreur ORA-28112 ” Failed to execute policy function ”

——-
Notes
——-

1) Pourquoi un compte SEC spécifique pour les objets nécessaire ? la VPD ?
- c’est + sécurisé, les données ne sont pas mélangées avec les règles d’accès
- c’est + facile a debugger : on peut soustraire ce compte aux règles des VPDs
- on évite les pbs d’accès récursif de la VPD

2) les parametres des fonctions de filtre sont OBLIGATOIRES !

3) Les DBAs soont normalement soumis aux stratégies comme tous les autres users.
Il est néanmoins possible d’outrepasser les VPDs
(pour le deboggage, pour l’administration, ou pour eviter les pbs de récursion)
SQL> grant exempt access policy to nom_user_cible;

4) une ORA-28112 = echec d’execution de la fonction de regle, lors du SELECT
==> la fonction est OK, mais il y a une exception qui n’est pas trappée par la fonction.
voir le fichier trace généré par l’erreur dans le répertoire USER_DUMP_DEST
pour résoudre le problème

5) vues du referentiel utiles
%_POLICIES, V$VPD_POLICY, RLS$, v$SQL

6) ne pas confondre les policies générales et les policies utilisées pour l’audit (Fine Grain Auditing).
Les packages, procédures et vues du dictionnaire ne sont pas les mêmes !
exemple : les packages DBMS_RLS (généraux) et DBMS_FGA (audit)

7) il n’existe pas de DISABLE_POLICY en 9i !!! mais un DBMS_RLS.ENABLE_POLICY avec ENABLE=….FALSE !!!

Imprimer Imprimer

Introduction a la Sécurité au niveau ligne (RLS)

Divers, Sécurité Oracle 10g pas de Commentaire »

Les prémices

Le principe de base des accès au données Oracle, s’appelle le ‘Discretionary Access Control’ ou DAC.
Il s’appuie sur des privilèges d’accès aux objets donnés aux utilisateurs concernés, grace ? la commande SQL ‘GRANT’.
Ainsi on donne ? Mr Clark le droit de consulter la table EMP de SCOTT, par la commande
GRANT SELECT ON scott.EMP TO clark’.
Ce controle d’accès ne gère pas de niveau plus fin que la table complète : soit CLARk ? a l’accès ? la totalité de la table ou ? aucune de ses lignes…
Ceci peut être affiné en utilisant des vues.
On peut limiter l’accès ? un niveau plus fin, par exemple autoriser CLARK ? ne lire que la ou les lignes qui le concerne, en créant une vue avec prédicat :

SQL> CREATE VIEW v_emp AS SELECT * FROM scott.emp
WHERE ename=user;
SQL> CONNECT clark/clark
SQL> SELECT * FROM scott.v_emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7782 CLARK MANAGER 7839 09-JUN-81 2450 10

Ceci peut néanmoins dans certains être contourné si Mr Clark iu d’autres utilisateurs accèdent directement ? la table sous jacente EMP.
La sécurité au niveau ligne (RLS) ou l’accès au niveau fin (Fine Grain Access Control ou FGAC)

sont une solution complètement ttransparente pour tous les users, ? ce type de besoin.
Faire du RLS (FGAC) nécessite
- 1 fonction predicat, qui limite les accès ? certaines lignes
Cette fonction, a 2 paramètres obligatoires (le proprietaire et le nom de l’objet filtré) et retourne

une chaine qui contient une expression booleenne.
- 1 strategie (policy) attachée ? la table qui met en oeuvre automatiquement cette fonction.
cette strategie, a un nom et doirt preciser l’objet filtré et la fonction utilisée.
Les stratégies sont gérées par un package prédéfini appelé DBMS_RLS. Le créateur de la startégie doit

donc avoir les droits d’EXECUTE sur ce package.
Pour la création on utilisera par exemple DBMS_RLS.ADD_POLICY(…)

Dans un Schmé sécurité (compte SEC) cela nous donne :

création de la fonction prédicat et de la stratégie

SQL> CONNECT sec/sec
SQL> CREATE OR REPLACE PACKAGE filtre_emp
AS
FUNCTION vue_emp (owner VARCHAR2, objname VARCHAR2)
RETURN VARCHAR2;
END;

SQL> CREATE OR REPLACE PACKAGE BODY filtre_emp
IS
FUNCTION vue_emp (owner VARCHAR2, objname VARCHAR2)
RETURN VARCHAR2
IS
predicat VARCHAR2(1000);
BEGIN
predicat := ‘ename=user’;
RETURN predicat;
END;
END;

– si nécessaire
execute DBMS_RLS.DROP_POLICY (’scott’, ‘emp’, ‘policy_emp’);
– et on crée donc…
execute DBMS_RLS.ADD_POLICY (’scott’,'emp’,'policy_emp’,’sec’,'filtre_emp.vue_emp’, ‘SELECT’);

Démontration du résultat de la stratégie mise en place

SQL> CONNECT clark/clark
SQL> SELECT COUNT(*) FROM scott.emp;
–> 1
SQL> CONNECT system/xxxx
SQL> SELECT COUNT(*) FROM scott.emp;
–> …
no row selected
car tout le monde est a priori sousmis ? la stratégie de sécurité !
y compris le DBA, et comme son nom d’utilisateur n’apparait pas dans la table EMP de SCOTT, le prédicat renvoie un résultat faux…et aucune ligne n’est affichée.

Nous verrons dans un prochain article comment créer une ébauche de VPD en associant ? cette stratégie un contexte utilisateur.

Imprimer Imprimer

DBAs et Privilèges d’exploitation

Divers, Sécurité Oracle 10g pas de Commentaire »

Certains ‘administrateurs’ : les opérateurs et techniciens d’exploitation, ou ‘exploitants’ pour faire court, n’ont pas forcément besoin d’un niveau de privilège DBA.

Les opérations concernés sont par exemple :

  • les démarrage / arrêts,
  • les sauvegardes / restaurations,
  • la planification et l’exécution de batch

Oracle fournit 2 niveaux de privilèges, qui peuvent être assimilés ? des niveaux de connexion, qui satisfont ces besoins : les privilèges d’exploitation ‘SYSDBA’ et ‘SYSOPER’.
Comme tout accès privilégié il s’acquiert via un processus d’identification / authentification.

Authentification locale au niveau du système d’exploitation

C’est une forme d’authentification externe, en ce sens que ce n’est pas Oracle qui contrôle la connexion grace a son référentiel interne. On se connecte directement (via telnet ou ssh par exemple) au système qui héberge le serveur de données, puis a la base locale, sans plus faire intervenir le réseau.
Ce type de connexion originale ne nécessite pas d’identifiant ni de mot de passe Oracle, mais d’être un utilisateur privilégié au niveau O.S.

note : un utilisateur quelconque, non privilégié de la base, peut aussi être défini avec une authentificatin externe, et se connecter localement avec une commande du type : sqlplus /

On peut dire que dans ce cas la sécurité est déportée au niveau O.S. et qu’Oracle accorde sa ‘confiance’ aux mécanismes d’identification / authentification de ce dernier.

exemples de connexion avec le client SQL standard :
connexion ‘normale’
$sqlplus scott/tiger
connexion avec authentification externe
$sqlplus / as sysdba
$sqlplus / as sysoper

Pour obtenir un ‘privilège’ d’exploitation il suffit d’appartenir au groupe utilisateur correspondant au niveau système :

privilège  gpe unix    groupe windows
SYSDBA     dba         ORA_DBA
SYSOPER    oper        ORA_OPER

Ces groupes sont créés lors de l’installation, et un administrateur système en ‘hérite’ automatiquement

note : Le ‘CONNECT INTERNAL’ des versions précédentes est définitivement obsolète et a été remplacé par le ‘CONNECT SYS AS SYSDBA. Parallèlement il n’est plus possible de se connecter SYS ‘tout court’ sans préciser ‘AS SYSDBA’.

Authentification distante au niveau du système d’explotation

Elle présente les mêmes caractéristiques que précédemment sauf que la base est située sur une machine distante de la connexion système courante.

La syntaxe de connexion devient donc :
$ sqlplus /@nom_base_distante AS SYSDBA (ou SYSOPER)

Un paramètre d’initialisation de la base : REMOTE_OS_AUTJENTICATION=TRUE autorise cette fonctionnalité.

Note importante : il est vivement conseillé pour des raisons de sécurité d’invalider cette possibilité.

Authentification via fichier de mots de passe
Dans ce cas de figure, les privilèges seront controlés a partir d’un fichier de mot de passe cryptés local.
exemple de création du fichier :
$ ORAPWD FILE=monfic PASSWORD=monpasse ENTRIES=100
avec
PASSWORD : le mot de passe de SYS
ENTRIES : le nb mas d’utilisateurs référencables dans le fichier.

on peut ensuite créer un utilisateur TOTO avec mot de passe TUTU et que le DBA lui donne le privilège oracle (et non pas système cette fois) nécessaire : SYSDBA ou SYSOPER :

$> sqlplus / AS SYSDBA
SQL> CREATE USER TOTO IDENTIFIED BY TUTU;
SQL> GRANT CREATE SESSION TO TOTO (qu’il aie le droit de se connecter quand même…)
$ GRANT SYSDBA TO TOTO (et lui donner le privilège d’exploitation qui va bien)

note : le paramètre d’initialisation REMOTE_LOGIN_PASSWORDFILE doit être a EXCLUSIVE (c’est le défaut) pour pouvoir utiliser et modifier le password file

Imprimer Imprimer

Utilisateurs Oracle 10g

Divers, Sécurité Oracle 10g 2 Commentaires »

La notion d’utilisateur

Quels que soient l’architecture utilisée,le programme client, ou votre profil utilisateur : administrateur, développeur ou simple utilisateur final, l’accès aux données d’une base exige de se connecter ? un compte utilisateur.

note : les utilitaires système d’export, d’import, de sauvegarde, et de chargement par exemple impliquent également une connexion ? un compre utilisateur.

Un compte peut éventuellement contenir des données (tables principalement) on l’appelle dans ce cas un SCHEMA. Il peut également être verrouillé par l’administrateur.

Pour créér un utilisateur on utilisera soit du SQL : instruction CREATE USER…
soit un outil d’administration graphique comme la console OEM ou la console GRID.
Pour le supprimer on utilisera la commande :
DROP USER nom_user CASCADE pour supprimer également les données associées.

La description de tous les utilisateurs est donnée par la vue SYS.DBA_USERS ou pour un user non privilégié dans USER_USERS

Les principaux attributs d’un utilisateur sont les suivants :
- le nom
- la méthode d’authentification…et le mot de passe associé le cas échéant
- ses espaces logiques de travail : TABLESPACEs par défaut et temporaire
- ses quotas de création de structures données sur ses TABLESPACES permanents (optionnel)
- ses droits
- son PROFIL de consommation de ressources (optionnel)

note : un utilisateur final n’a pas besoin de quota, puisque’il ne créé pas de structure, mais tout au plus insère des données dans des structures existantes.
Il n’a besoin que de privilèges minimaux, celui de se connecter et de consulter voire mettre ? jour quelques tables d’un schéma.

Voir l’article sur les Roles et l’article sur les privilèges objets pour plus d’infos

En pratique dans les entreprises il existe un nombre limités de types d’utilisateurs. Ceci aura pour conséquence de pouvoir limiter sensiblement les ‘groupes d’utilisateur’.
On trouve, du moins privilégié au + privilégié :
- l’utilisateur d’infocentre (consultation de données uniquement)
- l’utilisateur d’application (consultation et mise ? jour)
- le responsable ou administrateur d’application (idem + gestion des utilisateurs et de l’accès aux fonctionnalités de l’application)
- le développeur (droit de cration de tables, vues, indexs, procédures stockées, triggers, séquences,…)
- le DBA (accès en lecture total au dictionnaire et droits de consultation mis ? jour de toutes les données utilisateurs, tous les droits sur la base)

Les ‘profils’ (PROFILE) Oracle

Ces ‘profils’ assez mal nommés, fixent des limites de consommation de ressouces (temps de session et de connexion, consommation mémoire partagée et E/S disque), la politique de mot de passe des utilisateurs (expiration et historique) et peuvent être comme les roles, partagés par un groupe d’utilisateurs.

Il existe 2 profils prédéfinis : DEFAULT, pours les users lambdas et MONITORING_PROFILE utilisé pour le compte DBSNMP.

SQL> SELECT * FROM DBA_PROFILES
WHERE profile=’DEFAULT’

PROFILE RESOURCE_NAME ? ? ? ? ? ? ? ? ? RESOURCE_TYPE ? ? ? LIMIT
——-? ? ? ————————-? ? ? ————-? ? ? ——–
DEFAULT COMPOSITE_LIMIT ? ? ? ? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT SESSIONS_PER_USER? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT CPU_PER_SESSION ? ? ? ? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT CPU_PER_CALL ? ? ? ? ? ? ? ? ? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION ? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL ? ? ? ? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT IDLE_TIME ? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT CONNECT_TIME ? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT PRIVATE_SGA ? ? ? KERNEL ? ? ? ? ? ? UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS ? ? ? ? ? ? PASSWORD ? ? ? 10
DEFAULT PASSWORD_LIFE_TIME ? ? ? ? ? ? PASSWORD ? ? ? UNLIMITED
DEFAULT PASSWORD_REUSE_TIME ? ? ? ? ? ? PASSWORD ? ? ? UNLIMITED
DEFAULT PASSWORD_REUSE_MAX ? ? ? ? ? ? PASSWORD ? ? ? UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION ? ? ? PASSWORD ? ? ? NULL
DEFAULT PASSWORD_LOCK_TIME ? ? ? ? ? ? PASSWORD ? ? ? UNLIMITED
DEFAULT PASSWORD_GRACE_TIME ? ? ? ? ? ? PASSWORD ? ? ? UNLIMITED

Ils permettent par exemple de limiter le nombre de sessions simultanées (très pratique en cas de développeurs trop enthousiastes !)SQL> CREATE PROFILE deux_sessions_max LIMIT
SESSIONS_PER_USER 2
SQL> ALTER USER dev1 PROFILE deux_sessions

Les utilisateurs prédéfinis d’Oraclel 10g

Essentiellement 2 catégories, les utilisateurs d’administration ou système :
- SYS : DBA et propriétaire du dictionnaire
- SYSTEM : DBA et propriétaire de qq vues système et outils
- SYSMAN : utilisateur de la console OEM ou GRID
- DBSNMP : utile pour Oracle AGent qui remonte des infos sur la base locale ? la console
- XDB, pour la BD XML
et les users/schémas de démo :
- le célèbre SCOTT et ses tables EMP et DEPT
- HR, schéma “ressources Humaine”, purement relation au niveau du modèle de données
- OE, schéma “gestion des commandes” au modèle relationnel / objet
- SH, schéma “ventes”, modèle relationnel en étoile
et des users génériques
PUBLIC et ANONYMOUS

La liste exhaustive des USERS prédéfinis est donnée par le SQL suivant (principales colonnes seulement):

SQL> SELECT username, account_status, lock_date, default_tablespace,
temporary_tablespace, profile
FROM DBA_USERS

USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE TEMPORARY_TABLESPACE PROFILE
——– ————– —————— ——————– ——-
SYS OPEN SYSTEM TEMP DEFAULT
SYSTEM OPEN SYSTEM TEMP DEFAULT
DBSNMP OPEN SYSAUX TEMP MONITORING_PROFILE
SYSMAN OPEN SYSAUX TEMP DEFAULT
SCOTT OPEN USERS TEMP DEFAULT

note : il est vivement conseillé de se connecter au minimum dans SYS ou SYSTEM. On créera un compte avec le role ‘DBA’ pour l’administration.
Il est également conseillé de verrouiller les comptes non utilisés et de changer leur mot de passe par défaut car ils peuvent présenter des failles de sécurité.

Les méthodes d’authentification

Pour assurer la confidentialitté d’accès aux données des utilisateurs, on doit s’authentifier pour se connecter ? la base de données.
Il existe 3 formes différentes d’authentification : par mot de passe, externe ou globale.

1) authentification par mot de passe
C’est une authentification classique, et répandue qui utilise un mot de passe crypté, stocké localement dans la table des utilisateurs de la base.

SQL> SELECT username, password FROM dba_users;

USERNAME PASSWORD
——– —————-
SYS 4C1C01757062C16D
SYSTEM D4DF7931AB130E37
DD EXTERNAL
SCOTT F894844C34402B67

2) authentification externe

Oracle offre une possibilité de se connecter sans fournir explicitement le mot de passe du compte. Ceci ne veut pas dire que le compte n’est pas protégé, mais que la protection est déporté au niveau de l’OS, ou en d’autres termes que le SGBD ‘fait confiance’ au système d’authentification de l’OS qui le porte. Pour que ceci soit possible il faut

- que l’utilisateur, soit défini comme authentifié de manière externe,
- que le nom du compte aie pour suffixe le nom du compte de l’OS et pour préfixe un préfixe générique défini dans les paramètres d’initialisation de la base (init.ora ou spfile) par la variable OS_AUTHENT_PREFIX.
Par défaut OS_AUTHENT_PREFIX vaut ‘OPS$’.
- que l’utilisateur se connecte ? Oracle en ne fournissant ni nom ni mot de passe mais simplement le séparateur ‘/’.
exemple :
– creation du user par le DBA
SQL> CREATE USER OPS$DD IDENTIFIED EXTERNALLY
on pourra ensuite (moyennant que l’utilisateur aie au moins un privilège ‘CREATE SESSION’…) se connecter en externe :
– connexion ? l’OS
login: DD
pwd : *******
– connexion externe dans le compte OS
$> sqlplus /
SQL> user OPS$DD connected…

note : l’authentification externe permet d’une certaine façon de sécuriser les scripts Shell ou d’une manière générale les batchs, car le mot de passe Oracle n’apparait plus en clair dans les scripts

3) authentification globale

… ? compléter…

Quelques exemples de commandes SQL

Autant que faire se peut on utilisera la console, mais ca peut dépanner de connaitre un minimum de SQL (ca peut aussi épater les filles…mais lequelles?)

SQL> CREATE USER TOTO IDENTIFIED BY TUTU;
– créé un user toto avec mot de passe tutu
SQL> DROP USER TOTO
– supprime icelui
SQL> ALTER USER tete IDENTIFIED BY tata
– on modifie le mot de passe
SQL> CREATE USER dev1 IDENTIFIED BY xxx
DEFAULT TABLESPACE hr
TEMPORARY TABLESPACE temp
QUOTA 100M ON hr
PROFILE profile_standard_de_ma_societe

SQL> GRANT CREATE SESSION to dev1;
SQL> CREATE ROLE role_developpeur_standard;
– ce role sera partagé par tous les développeurs
SQL> GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX,
CREATE PROCEDURE, CREATE SEQUENCE TO role_developpeur_standard;
SQL> GRANT ROLE role_developpeur_standard TO dev1 WITH GRANT OPTION;
– on donne le droit de crééer des objets standards
SQL> GRANT CREATE TRIGGER TO dev1;
– on rajoute un droit spécifique ? DEV1…

Imprimer Imprimer

Sécurité d’Oracle 10g: Les rôles

Divers, Sécurité Oracle 10g pas de Commentaire »

Les rôles
———

Il n’existe pas de notion de groupes d’utilisateur sous Oracle, mais la notion de rôle, qui permet de nommer un

groupe de privilèges. On peut affecter un rôle ? un ou n utilisateurs, voir ? un rôle.

Roles prédéfinis
—————-

Il existe un certain nombre de rôles prédéfinis, fournis avec Oracle 10g. Voici une liste de ces rôles avec les

privilèges système qu’ils offrent :
CONNECT :
Se connecter ! équivallent du privilède système ‘CREATE SESSION’

Attention !!! en version 10gR1 et antérieures, ce rôle donnait beaucoup + de privilèges, ? savoir :
ALTER SESSION, CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE,
CREATE SESSION, CREATE SYNONYM, CREATE TABLE, CREATE VIEW
RESOURCE :
créer des données avec des quotas sur tous les tablespaces ->
CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE,
CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER, CREATE TYPE

DBA :
Tous les privilèges système avec ADMIN OPTION

EXP_FULL_DATABASE :
export complet ou incrémental ->
SELECT ANY TABLE, BACKUP ANY TABLE, EXECUTE ANY PROCEDURE, EXECUTE ANY TYPE, ADMINISTER RESOURCE MANAGER, and

INSERT, DELETE, and UPDATE on the tables SYS.INCVID, SYS.INCFIL, and SYS.INCEXP. Also the following roles:

EXECUTE_CATALOG_ROLE and SELECT_CATALOG_ROLE.

IMP_FULL_DATABASE :
import full + tous les privilèges système + role

DELETE_CATALOG_ROLE :
droit DELETE sur la table SYS.AUD$

EXECUTE_CATALOG_ROLE : privilège EXECUTE sur les objets du dictionnaire + HS_ADMIN_ROLE.

SELECT_CATALOG_ROLE : accès en consultation au dictionnaire + HS_ADMIN_ROLE.

RECOVERY_CATALOG_OWNER : privilèges pour le propriétaire du catalogue de restauration ->
CREATE SESSION, ALTER SESSION, CREATE SYNONYM, CREATE VIEW, CREATE DATABASE LINK,
CREATE TABLE, CREATE CLUSTER, CREATE SEQUENCE, CREATE TRIGGER, and CREATE PROCEDURE

HS_ADMIN_ROLE
protection des accès (SELECT et EXECUTE) au référentiel HS (Heterogeneous Services) data dictionary tables

(grants SELECT) and packages
AQ_ADMINISTRATOR_ROLE
privilèges d’administration de l’ Advance Queuing. Notamment : ENQUEUE ANY QUEUE, DEQUEUE ANY QUEUE, et MANAGE

ANY QUEUE + SELECT sur les tables AQ + EXECUTE sur les packages AQ.

roles applicatifs
—————–
Des roles définis pour les applicatifs, en fonction des besoins et ? minima !
Ainsi on peut créer un rôle qui donne des droits de consultation sur les tables d’un schéma :

– creation du role
SQL> create role consult_finance;
– affectation des privileges au role
SQL> grant select on budget to consult_finance;
SQL> grant select on fournisseur to consult_finance;
SQL> grant select on client to consult_finance;
– cession du role aux utilisateurs
SQL> grant consult_finance to user_finance_1;
SQL> grant consult_finance to user_finance_2;

Note : un user ne peut pas hériter de plus de ‘MAX_ENABLED_ROLES’ paramètre d’initialisation de la base, dont la valeur par défaut est 30 en 10g. CEla parait peu probable pour un applicatif classique (voire déraisonnable).
Dans le cas d’une console d’administration centrale (console 10g GRID ou server manager console). Le user d’administration cionnecté hérite de tous les droits qu’il crée…ce qui est beaucoup plus fréquent ! et la limite MAX_ENABLED_ROLES peut être facilement atteinte et … empêcher une connexion ? la console !
Informations sur les rôles dans le référentiel (dictionnaire) Oracle 10g
————————————————————————

DBA_ROLES
Tous les roles !
DBA_ROLE_PRIVS, USER_ROLE_PRIVS
roles données aux users et/ou aux roles
ROLE_ROLE_PRIVS
roles donnés aux roles
ROLE_SYS_PRIVS
privilèges systèmes donnés aux roles (accessible au user)
ROLE_TAB_PRIVS
privilèges objets donnés aux roles (accessible au user)
SESSION_PRIVS
privilèges de la session courante
SESSION_ROLES
roles de la session courante

Les roles et la console GRID 10g
———————————

La console donne par defaut le role CONNECT, cela ne pose pas de pb de sécurité sur une base 10g…mais si on s’en sert pour administrer une base 9i (avec l’agent qui va bien) le role CONNECT offre presque tous les privilèges de création/suppression de données dans le schéma.