Authentification SYSDBA via les Enterprise Users

Vos bases de données sont soumises à de nouvelles contraintes. D’un côté, l’ouverture de plus en plus grande du fait de la multiplication des intervenants ; les partenaires deviennent externaliseurs, outsourceurs, offshore et font eux-mêmes appels aux externaliseurs, outsourceurs ou offshore ; tout le monde rêve de mettre sa tête dans le cloud. De l’autre, le champ des responsabilités et conformité s’étend avec la nécessité de plus en plus importante de protéger ses informations et de détecter les comportements déviants.

Administrateurs et développeurs continuent de s’authentifier "... as sysdba" ou "apps/apps..." rendant inutiles firewalls, chiffrement ou toutes les politiques d’autorisation ou d’audit que les équipes de sécurité tentent en vain de mettre en place depuis des années sur les bases de données ; il faut dire que c’est un peu compliqué, incapable qu’ils sont de faire le lien entre ce qui est fait et qui le fait. Sauf bien sur si vous utilisez une infrastructure à clé publique.

« Breaking News » : Enterprise User Security implémente désormais toute cette fonctionnalité. En effet, la solution est (enfin!) compatible avec les drivers JDBC thin à venir dans quelques semaines pour 10g/11g et également les connexions SYSDBA. Ceci, quel que soit l’annuaire d’entreprise que vous utilisez : Active Directory, Sun/Oracle Directory Server ou Novell eDirectory ! Autrement dit : 98% des cas d’authentification avec un utilisateur et un mot de passe permettent désormais de faire le lien avec utilisateur physique, ce qui est bien la fondation pour le reste des mécanismes de sécurité. J’ai eu l’occasion de tester tous ces cas et… ça marche au delà des espérences
JDBC thin et EUS
Pour ce que concerne les drivers JDBC, à condition d’y avoir accès :-), ça fonctionne avec 10g et 11g et ça n’a rien d’impressionnant en dehors du fait que ça fonctionne ; voici mon test et à l’exception prêt de quelques fonctions comme sys_context ou user, rien ne change ; c’est bien le principe :

export JAVA_HOME=/opt/jdk1.6.0_23 
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=ojdbc6.jar:.
cat OracleAuthEUS.java

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class OracleAuthEUS {
public static void main(String[] args)
throws SQLException {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = "jdbc:oracle:thin:@red:1521/BLACK";
String username = "Greg";
String password = "greg";

Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery(
"select sys_context('USERENV'," +
" 'ENTERPRISE_IDENTITY') DN " +
"from dual");

while (rset.next())
System.out.println(rset.getString(1));

rset.close();
stmt.close();
conn.close();
}
}


javac OracleAuthEUS.java
java OracleAuthEUS
cn=Greg,ou=Personnes,o=arkzoyd,dc=fr

Enterprise Role SYSDBA

Pour permettre l’accès SYSDBA via Enterprise User Security, vous devrez d’abord changer le paramètre ldap_directory_sysauth qui eststatique et donc nécessite un redémarrage de l’instance; voici un exemple de script associé :

alter system set ldap_directory_sysauth=yes scope=spfile; 
startup force;

La liste des utilisateurs ou groupes ayant le privilege SYSDBA est stockée dans une entrée spécifique de votre Realm en tant que Enterprise Role ; Un moyen simple consiste à adapter et charger l’entrée suivante dans votre annuaire ; ajoutez vos utilisateurs/groupes dans la liste des attributs « uniqueMember » :

dn: cn=LDAPSYSDBA,cn=OracleDefaultDomain,cn=OracleDBSecurity,cn=Products,cn=OracleContext,o=arkzoyd,dc=fr
objectClass: top
objectClass: orclDBEnterpriseRole
objectClass: groupofuniquenames
objectClass: orclprivilegegroup
objectClass: orclDBEnterpriseRole_82
objectClass: orclDBEnterpriseRole_10i
cn: LDAPSYSDBA
orclDBServerRole: cn=BLACK,cn=OracleContext,o=arkzoyd,dc=fr,GlobalRole=SYSDBA
uniqueMember: cn=Greg,ou=Personnes,o=arkzoyd,dc=fr

Vous pouvez ensuite tester votre connexion avec SQL*Plus comme ci-dessous :

sqlplus GREG/greg as sysdba 

select user from dual;
USER
-------
SYS


select sys_context('USERENV', 'ENTERPRISE_IDENTITY') DN 
from dual; 

DN
------------------------------------
cn=Greg,ou=Personnes,o=arkzoyd,dc=fr

Note :

  • La connexion SYSDBA s’appuyant sur des mécanismes d’instance, il n’est pas possible de se connecter à distance si l’instance est arrêtée, même si celle-ci fait l’objet d’un enregistrement statique
  • Du fait d’une limitation produit, il est indispensable de mettre le nom d’utilisateur en majuscule, même si celui-ci contient différentes casses dans son cn.