Interdire le partage des mots de passe des comptes applicatifs. Plus facile à dire qu’à faire… surtout quand une seule personne détient tous les mots de passe. Dans beaucoup d’environnements, toute action un peu sensible finit par dépendre du DBA.
Résultat : on attend le DBA pour débloquer un agent applicatif en pleine nuit; on ne peut pas avancer sur une opération simple sans lui. Tout ceci fait monter la pression opérationnelle et les mauvaises pratiques s’installent. Ce qui pose un problème d’architecture des accès.
SOLUTION COURANTE
Dans de nombreux environnements, on observe :
le partage du mot de passe du compte applicatif entre plusieurs personnes
En cas d’erreur, d’incident ou d’accès frauduleux, il devient impossible d’identifier l’auteur des actions.
Le changement de mot de passe est complexe et risqué, car il impacte immédiatement l’application.
l’attribution du rôle DBA à des utilisateurs techniques
La solution la plus courante.
- Cela leur donne un accès total à la base de données (données, sécurité, sauvegardes).
- Une simple erreur de manipulation peut avoir des conséquences désastreuses, et toute compromission devient catastrophique.
l’octroi de droits excessifs à des comptes utilisateurs.
Accorder des privilèges globaux sur l’ensemble des tables applicatives est une fausse solution.
- Les utilisateurs disposent de droits bien supérieurs à leurs besoins réels.
- L’ajout de nouvelles tables au schéma applicatif nécessite une réaffectation des droits utilisateurs
Ces pratiques entraînent une perte totale de traçabilité et un risque majeur sur toute la bases de données en cas de compromission.
RECOMMANDATION
Séparez clairement les rôles.
Le compte applicatif devient schema-only-account
- Il ne sert qu’à porter les objets applicatifs.
- Aucun accès direct n’est autorisé.
SQL> CREATE USER app_data NO AUTHENTICATION;
Utilisateur cree.
SQL> GRANT CREATE SESSION, CREATE TABLE TO app_data ;
Autorisation de privileges (GRANT) acceptee.
SQL> ALTER USER app_data QUOTA UNLIMITED ON users;
Utilisateur modifie.
Les accès utilisateurs passent par des Proxy Users.
- Chaque intervenant se connecte avec son propre compte nominatif ;
- Le proxy permet d’agir au nom du schéma applicatif sans connaître son mot de passe.
SQL> CREATE USER tomy IDENTIFIED BY Password_1;
Utilisateur cree.
SQL> GRANT CREATE SESSION TO tomy;
Autorisation de privileges (GRANT) acceptee.
Identifiez les différents modes d’authentification.
SQL> select USERNAME, AUTHENTICATION_TYPE from dba_users where username in ('APP_DATA','TOMY');
USERNAME AUTHENTICATION_TYPE
------------------------------ ------------------------------
APP_DATA NONE
TOMY PASSWORD
Octroi de connexion via le compte proxy
SQL> ALTER USER app_data GRANT CONNECT THROUGH tomy;
Utilisateur modifie.
Connexion via e compte proxy
SQL> CONN tomy[app_data]/Password_1@pad
Connecte.
SQL> col SESSION_USER format a15
SQL> col SESSION_SCHEMA format a15
SQL> col CURRENT_SCHEMA format a15
SQL> col PROXY_USER format a15
SQL> select sys_context('userenv','session_user') as session_user,
2 sys_context('userenv','session_schema') as session_schema,
3 sys_context('userenv','current_schema') as current_schema,
4 sys_context('userenv','proxy_user') as proxy_user
5 from dual;
SESSION_USER SESSION_SCHEMA CURRENT_SCHEMA PROXY_USER
--------------- --------------- --------------- ---------------
APP_DATA APP_DATA APP_DATA TOMY
✨ EN BONUS
schema-level privileges
À partir d’Oracle 23ai il existe le schema-level privileges qui permet d’attribuer des droits à tous les objets d’un schéma
SQL> GRANT SELECT ANY TABLE ON SCHEMA APP_DATA TO TOMY;
Autorisation de privileges (GRANT) acceptee.
Surveillez régulièrement les comptes proxy avec la vue PROXY_USERS
SQL> set lines 100
SQL> col proxy format a20
SQL> col client format a20
SQL> col authentication format a20
SQL> col flags format a30
SQL> select * from proxy_users;
PROXY CLIENT AUTHENTICATION FLAGS
-------------------- -------------------- -------------- ------------------------------
TOMY APP_DATA NO PROXY MAY ACTIVATE ALL CLIENT
ROLES
Supprimez les comptes proxy lorsque vous n’en avez plus besoin.
SQL> ALTER USER APP_DATA REVOKE CONNECT THROUGH TOMY;
Utilisateur modifie.