Dois-je crypter les données dans la base de données?


16

J'ai un client, pour lequel je vais faire une application Web sur les soins aux patients, la gestion des patients, les consultations, l'historique, les calendriers, tout cela à la base.

Le problème est qu'il s'agit de données sensibles, d'antécédents de patients et autres.

Le client insiste pour chiffrer les données au niveau de la base de données, mais je pense que cela va détériorer les performances de l'application Web. (Mais peut-être que je ne devrais pas m'en inquiéter)

J'ai lu les lois sur la protection des données sur les questions de santé (Portugal), mais je ne suis pas très précis à ce sujet (je viens de les interroger à ce sujet, j'attends leur réponse).

J'ai lu le lien suivant , mais ma question est différente, dois-je crypter ou non les données dans la base de données.

Un problème que je prévois dans le cryptage des données, c'est que je vais avoir besoin d'une clé, cela pourrait être le mot de passe de l'utilisateur, mais nous savons tous comment sont les mots de passe des utilisateurs (12345, etc.) et générer une clé que je devrais stocker quelque part, cela signifie que le programmeur, dba, tout ce qui pourrait y avoir accès, des réflexions à ce sujet?

Même l'ajout d'un sel aléatoire au mot de passe utilisateur ne résoudra pas le problème car je peux toujours y accéder, et donc décrypter les données.


1
Je suis plutôt un développeur côté client, mais je soupçonne que tout chiffrer rendrait les données moins, pas plus sécurisées si vous utilisez la même clé.
Erik Reppen

4
pouvez-vous mettre la base de données entière sur un volume chiffré et l'appeler un jour. Bien sûr, les lectures / écritures seront plus lentes, mais vous gardez tous les avantages du RDMS (ou de tout ce que vous utilisez), tandis que les données sur le disque sont cryptées
DXM

2
Cela signifie également que vous ne pourrez pas voir les données dans le plan de travail mysql? Tout le meilleur pour le débogage.
Manoj R

4
Le médical est une industrie hautement réglementée. Les professionnels qui y travaillent sont habitués à ce que quelqu'un leur dise quelles sont les règles. Cette mentalité tente de déborder sur les projets informatiques. Ce n'est pas vraiment un problème de sécurité. C'est un problème culturel. Le coût de faire des affaires dans le domaine médical.
Reactgular

1
Un hôpital en Grande-Bretagne a été condamné à une amende de plus de 300 000 £ parce que des disques durs se sont égarés contenant des bases de données non chiffrées. Les informations sur la santé sont très sensibles.
MarkJ

Réponses:


9

Je vérifierais personnellement les lois à ce sujet. Si les données doivent être cryptées, elles doivent être cryptées.

Si vous ne recevez pas de conseils, je viserais à protéger le lien entre le patient et ses données. C'est-à-dire que vous en avez probablement un PatientIDqui est utilisé dans les tableaux de la base de données. PatientIDn'identifie pas un patient, seulement les antécédents médicaux du patient, etc ... Cependant, pour identifier le PatientIDcomme Joe Bloggs vivant à Rua de São Bernardo Lisbonne, je garderais cela dans une BD distincte si je le peux. Utilisez TDE pour les détails personnels du patient et envisagez de le chiffrer en plus de cela à l'aide de clés dans votre application Web.

Bien que le vol de ces données médicales sans les moyens d'identifier les patients soit extrêmement embarrassant, il est peu probable qu'il y ait autre chose que cela. Il existe littéralement des concours en ligne qui utilisent ces données médicales anonymisées.

Avec la séparation des données médicales des données personnelles du patient. Utilisez un ensemble solide de rôles pour limiter le personnel à ce dont il a besoin. À l'exception du personnel médical qui doit traiter directement avec le patient (infirmières et médecins de première ligne), personne ne devrait avoir accès aux deux. Les réceptionnistes n'ont besoin que des données personnelles du patient, le personnel du laboratoire n'a besoin que du dossier médical et du PatientID, les infirmières chirurgicales ne sont actuellement que l'état de santé et le prénom.

Lorsque vous avez identifié chaque ensemble de rôles, visez non seulement à les implémenter dans votre application Web, mais également dans la base de données ainsi qu'une couche de sécurité supplémentaire.


1
IANAL, mais les profanes de l'OMI ne doivent pas "vérifier les lois" lorsque la responsabilité éventuelle est importante. Ils devraient consulter un avocat.
Kevin Cline

je vais avec cette approche comme une vraie réponse .. les dossiers médicaux qui ne sont pas liés aux patients ni au médecin sont vides de sens et inutilisables même pour l'analyse statistique car ils n'ont aucune référence et ne prouvent pas qu'ils ne sont pas constitués.
Zalaboza

13

Oui, vous devez crypter la base de données.

Le chiffrement de base des données stockées ("données au repos") est un principe de sécurité généralement accepté, et est probablement imposé par la loi si votre pays a des lois qui protègent les informations personnelles ou de santé.

Nous utilisons SQL Server 2008, nous utilisons donc le TDE de Microsoft; il peut y avoir une solution tierce pour MySQL ou peut-être juste une approche générale de chiffrement de volume (comme TrueCrypt) fonctionnerait (même si je voudrais avoir quelque chose qui a été certifié pour une utilisation avec une base de données).

Si cela est fait correctement, la performance devrait être faible.

Soit dit en passant, le lien que vous avez mentionné (concernant la séparation des informations sensibles) est quelque chose que vous devez considérer en plus du chiffrement de base de la base de données.

EDIT: Le cryptage mentionné ci-dessus crypterait le volume. Si quelqu'un volait le disque dur, il trouverait les données cryptées. Cependant, si quelqu'un devait exécuter des requêtes sur la base de données, il verrait les données non cryptées (c'est pourquoi j'ai mentionné la séparation des informations, même si l'OP ne voulait pas en discuter).

Notez que cette recommandation est conçue comme le minimum que vous devriez faire. Si vous voulez des conseils juridiques, vous devrez bien sûr chercher ailleurs. Si vous voulez une discussion plus approfondie sur l'écriture de code sécurisé, je commencerais par le livre Writing Secure Code .


2
Je ne sais pas si c'est le cas. La question n'est pas de chiffrer la base de données, mais de chiffrer les données dans la base de données. Cela signifie que les données des requêtes SQL seront cryptées.
Manoj R

1
La performance devrait être faible? La recherche de données sera LENTE. Le concept entier d'indexation ne fonctionne pas lorsque les données sont cryptées. Cela nécessitera une analyse complète de la table.
mike30

@mike L'approche ci-dessus crypterait le volume et n'aurait pas d'impact sur l'indexation, etc.
jdigital

OMI, vous avez besoin de plus d'expertise que vous ne pouvez obtenir ici. IANAL, mais je pense que votre client est assez exposé si ces données sont compromises.
kevin Cline

8

Avant de décider de ces questions de sécurité, vous devez évaluer le modèle de menace. Sans idée de ce contre quoi vous vous défendez, toutes les mesures que vous prendrez auront probablement peu de valeur.

Maintenant, vous pouvez vous préoccuper de certaines choses dans ce contexte:

  • Les attaquants obtenant un accès physique à vos données (par exemple, pénétrer dans le centre de données, voler des bandes de sauvegarde, etc.)
  • Les attaquants obtiennent un accès en lecture à votre base de données brute
  • Les attaquants compromettant votre application, par exemple par injection SQL, dépassements de mémoire tampon, etc.

Pour le premier scénario, le stockage de la base de données et de toutes les sauvegardes sur des volumes chiffrés devrait fonctionner, à condition que le serveur soit sans tête - le vol du serveur ou des bandes nécessiterait alors de casser le chiffrement au niveau du disque.

Pour le deuxième scénario, le chiffrement des données de la base de données est utile, mais uniquement si vous ne stockez nulle part les clés ou les mots de passe requis.

Dans le troisième scénario, tout dépend du contexte dans lequel l'attaque se produit: s'il s'agit, par exemple, d'une attaque XSS ou CSRF, alors un attaquant peut faire tout ce que l'utilisateur légitime peut faire, et le cryptage de vos données n'aide en rien .

Votre modèle de menace est donc un attaquant qui obtient un accès en lecture à la base de données brute, soit en trouvant les informations de connexion et en réussissant à se connecter au serveur de base de données de l'extérieur, soit en obtenant un accès root au serveur de base de données. Un chemin typique consiste à obtenir d'abord un accès shell sur le serveur Web; à partir de là, un attaquant peut alors lire les informations d'identification d'accès à partir du fichier de configuration et se connecter à la base de données.

Une autre considération est l'endroit où vous conservez les clés et les phrases secrètes, surtout si vous utilisez une plate-forme avec un modèle d'exécution sans état tel que PHP. Idéalement, vous demandez au client de taper sa phrase secrète si nécessaire, et de la conserver uniquement en mémoire, ou mieux, de faire le déchiffrement côté client (mais ce n'est pas souvent faisable). Sur une plate-forme sans état, l'état est généralement effectué à l'aide de sessions, de memcache, de bases de données ou de fichiers plats; mais tous ces éléments sont bien plus vulnérables que de conserver l'état dans la mémoire d'une application Web avec état. Éviter cela est un problème de poule et d'oeuf, car si vous cryptez l'état avant de le persister, vous venez de créer un autre secret dont vous devez vous souvenir en toute sécurité. Se souvenir de la phrase secrète sur le client et l'envoyer avec chaque demande qui en a besoin peut être la solution la moins horrible alors;


2
+1: sans modèle de menace, vous verrouillez probablement la porte d'entrée mais laissez la porte arrière grande ouverte.
Kevin Cline

8

Ignorant un instant ce que le client demande et quelles que soient les lois ...

Non, vous ne devriez probablement pas crypter les données. Si vous le faites, vous ne pourrez pas le rechercher facilement. Par exemple, comment rechercher un nom de famille like 'Smith%'si chaque entrée de nom est cryptée? Comment traceriez-vous la tension artérielle d'un patient au fil du temps si vous ne pouvez pas select .... from.... where patient_id = N?

Vous devez, bien sûr, vous assurer que le serveur est correctement sécurisé, la connexion réseau est sécurisée et que l'interface utilisateur est correctement sécurisée (y compris les délais d'expiration de session afin que les utilisateurs ne puissent pas quitter en laissant l'accès à toute personne qui utilise leur ordinateur). Vous pouvez également vouloir chiffrer les sauvegardes de base de données. Et sécuriser physiquement la pièce dans laquelle se trouve le serveur. Mais je ne crypterais pas les données en direct.

Clarification: cela suppose que l'OP demandait de chiffrer les données dans la base de données. Pas le système de fichiers sur lequel réside la base de données.


totalement d'accord, mais LAWS ne le fait pas :(
Zalaboza

1
Eh bien, vous pourriez être AES_DESCRYPT('') LIKE 'Smith%'incroyablement lent. Ou vous pourriez devenir intense et faire un index inversé avec des hachages salés
foochow

1

Si vous développez l'application Web avec soin en utilisant un framework MVC efficace comme CakePHP. Zend ou Rails, alors vous devriez pouvoir activer / désactiver le cryptage au niveau Modal des données.

CakePHP par exemple a quelques exemples de comportements pour Modal qui chiffrent les données. Rendre le processus transparent pour les contrôleurs et les vues.

Ignorer les problèmes d'indexation et d'autres problèmes de base de données techniques lors de cette opération. Il devrait être possible de l'avoir comme option configurable.

De plus, j'activerais le chiffrement ultérieurement ou uniquement sur le serveur de production. Les données chiffrées sont difficiles à déboguer et à utiliser lors du développement, et ne peuvent être effectuées que sur certaines colonnes.


1

Oui, vous devez crypter la base de données.

Étant donné qu'il s'agit d'informations personnelles et sensibles, je pense vraiment qu'elles le devraient.

Du mot de passe, vous pouvez dériver une clé de chiffrement que vous ne stockez que pour la session. De cette façon, il n'est stocké nulle part et personne (y compris les DBA) ne peut le savoir car personne ne peut non plus connaître le mot de passe. Quiconque essaie de visualiser la base de données directement regardera le charabia. Le seul moyen de corrompre cela est via le détournement de session, mais je suppose ici que les sessions sont également sécurisées.


Les gens oublient très souvent leurs mots de passe ... alors quoi?
curiousguy

-1

Je me demande pourquoi le client vous demande de crypter la base de données? S'il vous demandait de protéger les données, je serais d'accord, mais il a déjà une implication implicite en tête. Donc tant qu'il ne sait pas exactement de quoi il parle, il ne fait que lancer des mots à la mode de mon point de vue.

Je trouve également très inutile de crypter la base de données, car je suis convaincu que littéralement tous les principaux SGBD prennent en compte la sécurité de manière appropriée et probablement mieux que vous ne le pourriez. Pour accéder à la base de données via le SGBD, vous aurez besoin d'informations d'identification. Dans le cas d'une base de données chiffrée, vous auriez également besoin de ces informations d'identification et pour déchiffrer les données, vous auriez besoin de ces informations d'identification que vous semblez déjà avoir.

En suivant cet état d'esprit, je propose de laisser le SGBD gérer la sécurité et de faire des efforts pour protéger les informations d'identification de l'entrée d'utilisateur à l'accès à la base de données, peut également appliquer des mots de passe forts et des changements périodiques.


... tous les SGBD majeurs prennent en compte la sécurité ... sauf quand ils ne le font pas .
Jay Elston

La première question que je devrais poser est de savoir comment ils ont fait cela et comment les dommages pourraient-ils être évités en chiffrant la base de données. Je viens de parcourir rapidement cet article, mais j'ai eu l'impression qu'ils étaient en possession de justificatifs d'identité.
sschrass

Exactement - les informations d'identification DB peuvent être compromises et le sont. Le défi est de concevoir le système de sorte que même lorsque des utilisateurs non autorisés ont accès aux informations d'identification, ils ont toujours besoin de clés de chiffrement supplémentaires pour pouvoir accéder aux données sensibles. Pour l'information sur la santé, c'est encore plus compliqué. Toutes les personnes ayant accès aux informations d'identification de la base de données ne devraient pas pouvoir accéder aux données sensibles. Par exemple, DBA ne devrait pas être en mesure de lire les données des patients en texte clair. Les seules personnes qui devraient pouvoir lire ces données sont les patients et leurs prestataires.
Jay Elston
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.