mardi 10 novembre 2015

Comment crypter le trafic réseau entre une base de données Oracle et un client ?

Problématique :

Dans la plupart des cas, les DBAs négligent de sécuriser le flux d'information qui circule entre les base de données Oracle et les postes client ou les serveurs d'applications.  Ce flux qui transite ainsi en clair via le réseau peux être intercepté et adieu !!! la confidentialité.

Solution :

Oracle Advanced Security inclus la possibilité de crypter le trafic entre les base de données et les clients. 

Le scénario est le suivant :
Nous allons installer Oracle database 11gR2 et créer une base de données.
Nous utiliserons un sniffer de réseau tel que TCPDUMP (sur le serveur de base de données) pour écouter le trafic réseau. 
Par la suite nous allons lancer des requêtes vers notre base de données et voir les données non cryptées qui transitent via le réseau; ensuite nous allons crypter nos données et refaire les mêmes requêtes.

Test effectué dans les environnements suivant :
      - Environnement virtuel VMWare Workstation
      - OS : RHEL 5
      - DB : Oracle 11gR2 

1. Installer Oracle 11gR2 et créer une base de données que vous pourriez appeler orcl; optez pour les ''schémas exemple'' lors de la création de la base.

2. Se connecter en tant que root et vérifier que le package tcpdump est bien installer sur notre système dans le cas contraire l'installer. Ne fermer pas ce terminal, il nous servira dans la suite.






3. Ouvrez un autre terminal en tant user oracle et démarrer tous les services services et connectez vous à votre base de données.
     
Le listener



























La base de données


















4. Connectez-vous à votre base de données puis créez une table et y insérer des données

NB:
Ne pas oublier de vous connecter en précisant le nom du service pour que les données transitent via le réseau: sqlplus hr@orcl













Nous allons créer une table clients (customers) de 4 colonnes qui contiendra:
customer_id : L'identifiant du client
customer_name : Nom du client
customer_ccnumber : Numéro de carte de crédit du client
city : Ville de résidence du client








Puis y insérer des données, ne fermer pas le terminal
























5. Nous allons maintenant lancer tcpdump puis exécuter une requête sur notre base de données et voir le résultat.

Lancer TCPDUMP dans le terminal de la session root via la commande :
/usr/sbin/tcpdump -Xs 1500 -i lo port 1521


Cela vous permettra de voir le trafic réseau sur l'adaptateur lo et le port 1521, ce port doit être celui de votre listener, dans mon cas c'est le 1521; pour le reste, je vous ferai l'économie de l'explication des options de la commande, il y'a des sites bien plus élaborés à cet effet tel que: 
http://lea-linux.org/documentations/Tcpdump

Au bout de quelque seconde, une fenêtre de ce type s'affiche :

















6. Dans le terminal ayant servi à créer notre table, nous allons afficher toutes les lignes de cette dernière













7. Observer dans le terminal tcpdump les données qui transitent via le réseau, vous remarquerez qu'elles ne sont pas cryptées.
Si les données passent rapidement et que vous n'avez pas le temps de voir, vous pouvez ré-exécutez la requête dans le terminal sqlplus en tapant la barre oblique '/'. Ou tout simplement, vous pouvez rediriger tout le trafic  vers un fichier précis.
L'idéal est de mettre les 2 fenêtres côte à côte.

Sur l'image ci-dessous, nous pouvons voir le texte de la requête exécutée








Sur celle-ci nous voyons bien le résultat de cette requête





















Ainsi des données sensibles ou confidentielles peuvent tomber dans les mains d'une personne qui n'en a pas droit.
Faite les touches <<Ctl>>+<<C>> pour arrêter l'action de tcpdump

8. Nous allons maintenant crypter les données; pour cela, nous avons besoins de modifier notre fichier SQLNET.ORA situé dans $ORACLE_HOME/network/admin

Nous allons y ajouter un certain nombre de paramètres :
SQLNET.CRYPTO_CHECKSUM_SERVER=REQUIRED
SQLNET.ENCRYPTION_SERVER=REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(MD5)
SQLNET.ENCRYPTION_TYPES_SERVER=(DES40,RC4_40)
SQLNET.CRYPTO_SEED="Mettre ici une chaîne de 10 à 70 caractères"

SQLNET.CRYPTO_CHECKSUM_CLIENT=REQUIRED
SQLNET.ENCRYPTION_CLIENT=REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT=(MD5)
SQLNET.ENCRYPTION_TYPES_CLIENT(DES40,RC4_40)
CRYPTO_CHECKSUM_TYPES_SERVER = (MD5)

Pour plus de détails sur les paramètres, rien de plus précis que la doc Oracle https://docs.oracle.com/cd/E11882_01/network.112/e10835/sqlnet.htm#NETRF006














9. Relancez tcpdump dans le terminal root puis ré-exécutez la requête



Cette fois-ci, vous remarquez que le résultat de la requête est cryptée. Ainsi le risque de voir des informations confidentielles tombées dans des mains non autorisées est éliminée.

Bien entendu, il faudra également configurer le fichier sqlnet.ora du côté client; dans le cas contraire, les connexions au serveur seront refusées.

Dans la pratique, il est indéniable que le sniffer de réseau sera utilisé sur un post différent du serveur de base de données. Dans ses options, tcpdump vous permet d'écouter un hôte précis.











1 commentaire:

  1. Merci de nous partager votre savoir.
    J'apprécie ce tuto, car les infos circulent en claire souvent sur le réseau et on est pas à l'abri d'une mauvaise surprise.
    Grâce à ce tuto, moi j'ai réglé mon blème.
    Merci encore à vous.

    RépondreSupprimer

Merci de laisser si possible vos commentaires