SELECT WITHOUT QUERY

La confidentialité des données est au cœur des préoccupations de beaucoup de monde de nos jours. Les méthodes de cryptage de données sont de plus en plus présentes, afin que personne ne puisse mettre la main sur des données sensibles. Personne ? Pas forcément, il y a toujours les administrateurs, qui avec leurs droits étendus et leurs accès privilégiés restent les grands maîtres des données.
Un petit exemple simple : imaginons qu’un utilisateur ayant des données à protéger veuille par exemple stocker des informations dans une table.

use tempdb
create table MaTableSecrete (Id int identity, Donnee varchar(1000))
insert into MaTableSecrete (Donnee) values ('Ceci est mon texte secret')

Il est clair que le premier venu disposant des droits sysadmin (comme par exemple le DBA gérant le système) n’aura pas de mal à lire les données. Alors pourquoi ne pas mettre toute cette gestion de secret du côté des applications clientes ? Et bien tout simplement parce que, parfois, le serveur peut avoir besoin de connaitre l’information en clair (ça peut par exemple être un mot de passe pour accéder à une ressource distante, ou quelque chose du genre…)
Heureusement, il est possible de crypter les données. Différentes méthodes sont possibles, le choix importe peu dans le cadre de cet article, prenons par exemple la fonction T-SQL ENCRYPTBYPASSPHRASE.

use tempdb
create table MaTableSecreteCryptee (Id int identity, Donnee varbinary(8000))
insert into MaTableSecreteCryptee (Donnee) select ENCRYPTBYPASSPHRASE('Ceci est la clé de codage','Ceci est mon texte secret')
select * from MaTableSecreteCryptee

On voit bien ici que l’administrateur de données devra aller un peu plus loin que le SELECT pour obtenir ses données.
Mais bon, supposons que le DBA soit un peu curieux. De nos jours, avec la mutualisation des ressources, on cherche à ne pas nécessairement acquérir une licence SQL Server pour chaque application. Il peut donc arriver qu’un DBA « principal » soit responsable du maintien de l’instance, et que d’autres personnes soient responsables de manière individuelle de données de chaque base et de leur sécurité.
Ce fameux DBA principal pourrait donc s’amuser à utiliser SQL Profiler pour tracer les instructions lancées sur une base donnée. Mais là, SQL Server sait protéger les informations, car tout ce que ce DBA un peu trop curieux verra est :

EventClass TextData
SQL :BatchStarting use tempdb
create table MaTableSecreteCryptee (Id int identity, Donnee varbinary(8000))
–*PREPARED QUERY————————————————————————————————————-
select * from MaTableSecreteCryptee

De même, pour d’autres fonctionnalités liées au cryptage, les petits curieux seront vite déçus…

CREATE SYMMETRIC KEY CLE_SECRETE WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = 'Ceci est mon mot de passe'
EventClass TextData
SQL :BatchStarting –*CREATE SYMMETRIC KEY—————————————————————————————

Par contre, lors de l’utilisation de procédures stockées dynamiques, même si l’instruction en elle-même est partiellement masquée, la chaîne en clair est parfaitement visible pour l’événement SQL :BatchStarting :

EventClass TextData
SQL :BatchStarting exec (N’CREATE SYMMETRIC KEY CLE_SECRETE WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = ”Ceci est mon mot de passe”’)
SP:StmtStarting — ‘CREATE SYMMETRIC KEY’ was found in the text of this event.
— The text has been replaced with this comment for security reasons.

Mais avec une petite astuce, on peut aussi masquer aux DBA indiscrets les éléments privés :

DECLARE @Requete nvarchar(max)
SELECT @Requete =
	CASE WHEN 1=1
	THEN 'CREATE SYMMETRIC KEY CLE_SECRETE WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = ''Ceci est mon mot de passe'''
	ELSE EncryptByPassphrase('','')
	END
EXEC (@Requete)

n’est visible que de la manière suivante :

EventClass TextData
SQL :BatchStarting DECLARE @Requete nvarchar(max)
–*ASSIGN—————————-
———————————————————————————————————————
————————————–
EXEC (@Requete)DROP SYMMETRIC KEY CLE_SECRETE
SP:StmtStarting — ‘CREATE SYMMETRIC KEY’ was found in the text of this event.
— The text has been replaced with this comment for security reasons.

 Voilà pour la protection des données. Et pour ceux et celles qui s’interrogent sur le pourquoi du titre de cet article, je vous laisse le soin de lancer vous-même la requête suivante et d’en observer la trace dans le Profiler…

select ENCRYPTBYPASSPHRASE('Ceci est la clé de codage','Ceci est mon texte secret')

2 réflexions sur « SELECT WITHOUT QUERY »

  1. “Mais là, SQL Server sait protéger les informations, car tout ce que ce DBA un peu trop curieux verra est [“–*PREPARED QUERY————“]”

    Mais est-ce Management Studio qui, visuellement, masque la donnée quand il la voit passer, ou est-ce carrément le contenu de la trame réseau qui est crypté ?
    Autrement dit, un petit coup de Wireshark permettrait-il de voir ce que ne voit pas le DBA avec Management Studio ?

    • JYL,
      Si on veut effectivement descendre jusqu’à sniffer le réseau, deux choses sont à considérer :
      – dans un premier temps, les événements émis par le moteur SQL et interceptés par le Profiler sont dès la source débarrassés des données sensibles, ce n’est pas seulement au niveau du Profiler qu’est fait ce “masque”
      – les données de l’instruction, comprenant notamment les éléments secrets, peuvent potentiellement être interceptés à l’aller. Toutefois, dans ce contexte, il faut savoir qu’il y a aussi possibilité d’utiliser une connexion SSL entre le client et le moteur. Et là, les traces de Wireshark seront un peu plus difficile à exploiter (surtout si les rôles sont bien répartis dans l’entreprise entre les DBA et les responsables des clés de chiffrement…)
      Merci de vous enregistrer ou de vous identifier pour ajouter un commentaire à cet article.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Etes-vous un robot ? *Chargement du capcha...

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.