J'ai un client, pour lequel je vais faire une application Web sur les soins aux patients, la gestion des patients, des consultations, de l'histoire, des calendriers, tout ce qui se passe fondamentalement.
Le problème est qu'il s'agit de données sensibles, d'historique des patients et de tels.
Le client insiste sur le cryptage des 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 peut-être pas être inquiet à ce sujet)
J'ai lu les lois sur la protection des données sur les questions de santé (Portugal), mais n'est pas très précise à ce sujet (je viens de les interroger à ce sujet, j'attends leur réponse).
J'ai lu le suivant link , mais ma question est différente, dois-je chiffrer les données de la base de données ou non.
Un problème que je prévois dans la 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 les mots de passe utilisateur sont (12345, etc.) et la génération d'une clé que je devrais stocker C'est quelque part, cela signifie que le programmeur, DBA, tout ce qui pourrait y avoir accès, toutes les pensées à ce sujet?
Même l'ajout d'un sel aléatoire au mot de passe de l'utilisateur ne résoudra pas le problème car je peux toujours y accéder, et donc déchiffrer les données.
Je ferais personnellement vérifier les lois à ce sujet. Si les données doivent être cryptées, il doit être crypté.
Si vous ne recevez aucune guidance, je vis de protéger le lien entre le patient et leurs données. C'est à dire. Vous avez probablement un PatientID
qui est utilisé dans des tables dans toute la base de données. PatientID
N'identifie pas un patient, seuls les antécédents médicaux du patient, etc. Cependant, d'identifier le PatientID
comme Joe Bloggs vivant à Rua de São Bernardo Lisbonne, je tiens ceci dans un DB séparé si je peux. Utilisez TDE pour les détails personnels du patient et envisagez de le crypter sur le dessus de celui utilisant des clés de votre application Web.
Alors que le vol de ces données médicales sans les moyens d'identifier les patients sera extrêmement embarrassant, il est peu probable que ce soit au-delà de cela. Il y a littéralement concours en ligne qui utilisent ces données médicales anonymisées.
Avec la séparation des données médicales des détails personnels du patient. Utilisez un ensemble robuste de rôles pour limiter le personnel à ce dont ils ont besoin. À l'exception du personnel médical qui nécessitent de traiter directement le patient (infirmières de première ligne et médecins), personne ne devrait avoir accès aux deux. Les réceptionnistes n'ont besoin que de détails personnels du patient, le personnel de laboratoire n'a besoin que du dossier médical et de la patience, des infirmières chirurgicales que des soins médicaux et des prénoms.
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 supplémentaire de sécurité.
Oui, vous devriez crypter la base de données.
Le cryptage de base des données stockées ("données au repos") est un principe de sécurité généralement accepté et est probablement mandaté par la loi si votre pays a des lois qui protègent des informations personnelles ou de la santé.
Nous utilisons SQL Server 2008, nous utilisons donc la TDE de Microsoft; Il peut y avoir une solution tierce pour MySQL ou peut-être qu'une approche de cryptage en volume général (telle que Truecrypt) fonctionnerait (bien que je souhaiterais avoir quelque chose qui a été certifié pour une utilisation avec une base de données).
Si cela est fait correctement, le succès de la performance devrait être petit.
Au fait, le lien que vous avez mentionné (concernant la séparation des informations sensibles) est quelque chose que vous devez prendre en compte sur le cryptage de base de base de données.
EDIT: Le cryptage mentionné ci-dessus crypté le volume. Si quelqu'un vouait voler le disque dur, ils trouveraient les données cryptées. Toutefois, si quelqu'un dirige-t-il des questions sur la base de données, ils verraient 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, alors bien sûr, vous devrez regarder ailleurs. Si vous souhaitez une discussion plus approfondie de l'écriture de code sécurisé, je commencerais avec le livre écrire le code sécurisé .
Ignorer 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 chercher facilement. Par exemple, comment rechercheriez-vous un nom de famille like 'Smith%'
Si chaque entrée de nom est cryptée? Comment créeriez-vous la pression artérielle d'un patient au fil du temps si vous ne pouvez pas select .... from.... where patient_id = N
?
Vous devez évidemment sûr 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'attente de session afin que les utilisateurs ne puissent pas quitter l'accès à quiconque utilise leur ordinateur). Vous pouvez également choisir de chiffrer des sauvegardes de base de données. Et sécuriser physiquement la pièce du serveur. Mais je ne chiffrerais pas les données en direct.
Clarification : Cela assume ce que l'OP avait demandé est de crypter de la base in la base de données. Pas le système de fichiers La base de données réside sur.
Avant de décider de telles questions de sécurité, vous devriez évaluer le modèle de menace. Sans idée de ce que vous défendez, les mesures que vous prenez sont susceptibles d'être peu utile.
Maintenant, il y a quelques points à craindre dans ce contexte:
Pour le premier scénario, stocker la base de données et toutes les sauvegardes sur les volumes cryptés doivent fonctionner, à condition que le serveur soit sans tête - voler le serveur ou les bandes nécessiteraient alors de casser le cryptage au niveau du disque.
Pour le deuxième scénario, le cryptage des données de base de données aidez, mais uniquement si vous ne stockez pas les clés ou les phraséphrases requises n'importe où.
Dans le troisième scénario, tout dépend du contexte dans lequel l'attaque se produit: s'il s'agit, par exemple, une attaque XSS ou CSRF, un attaquant peut alors faire n'importe quoi l'utilisateur légitime peut, et crypter vos données n'aident pas du tout .
Votre modèle de menace est donc un attaquant qui gagne de lire l'accès à la base de données RAW, soit en trouvant les informations d'identification de connexion et en gérant de vous connecter au serveur de base de données de l'extérieur, soit en gagnant un accès racine au serveur de base de données. Un chemin typique est de gagner d'abord l'accès au shell sur le serveur Web; À partir de là, un attaquant peut ensuite lire les informations d'identification d'accès dans le fichier de configuration et se connecter à la base de données.
Une considération supplémentaire est l'endroit où vous conservez les touches et les phrases phrases, en particulier si vous utilisez une plate-forme avec un modèle d'exécution apatride tel que PHP. Idéalement, vous avez le type de client de type secPhrase lorsque vous avez besoin, et gardez-le uniquement en mémoire, voire meilleure, faites le côté du client de déchiffrement (mais cela n'est pas souvent réalisable). Sur une plate-forme apatride, l'état est généralement effectué avec des sessions, des memcaches, des bases de données ou des fichiers plats; Mais tous ceux-ci sont beaucoup plus vulnérables que de garder l'état dans une propre mémoire d'une application Web de l'état indiquant. Éviter qu'il s'agit d'un problème de poulet et d'œuf, car si vous cryptez l'état avant de le persister, vous venez de créer un autre secret que vous devez vous rappeler en toute sécurité. Se souvenir de la phrase secrète sur le client et de l'envoyer avec chaque demande qui nécessite une solution la moins horrible puis; Le client est toujours vulnérable si vous avez des fuites XSS, et vous devez prendre les précautions habituelles (Servir uniquement HTTPS, définir tous les cookies sur httponly et sécurisé, etc.), mais ce sont des problèmes que vous avez de toute façon.
Si vous développez soigneusement l'application Web à l'aide d'un cadre MVC efficace comme CakePHP. Zend ou Rails, vous devriez alors pouvoir activer/désactiver le cryptage au niveau modal de données.
CakePHP, par exemple, a quelques exemples de comportements pour les modaux que chiffrer des données. Rendre le processus transparent des contrôleurs et des vues.
Ignorer les problèmes concernant l'indexation et d'autres problèmes de base de données techniques lorsque cela fait cela. Il devrait être possible d'avoir ceci comme option configurable.
De plus, je voudrais activer le cryptage à une heure ultérieure ou uniquement sur le serveur de production. Les données cryptées sont difficiles à déboguer et à travailler avec le développement et ne peuvent être effectuées que sur certaines colonnes.
Oui, vous devriez crypter la base de données.
Comme il s'agit d'informations personnelles et sensibles, je crois certainement que cela devrait.
Du mot de passe, vous pouvez dériver une clé de cryptage que vous ne stockez que pour la session. De cette façon, il n'est pas stocké nulle part et personne (y compris DBAS) ne peut le savoir puisque personne ne peut connaître le mot de passe non plus. Toute personne qui tente de voir la DB sera directement en train de regarder Gibberish. Le seul moyen de corrompre cela est via la session du détournement, mais je suppose ici que les sessions sont aussi sécurisées.