2010-11-16 22 views
0

Ceci est peut-être un peu vague, mais j'espère que parmi toutes les personnes sur SO il y en aura qui ont déjà rencontré ce type de problème auparavant.Application critique de sécurité - Validation de la ligne de base de données

Contexte
Notre application est un service C#/.NET qui contrôle les commandes de trains. Nous utilisons LINQ-to-SQL pour stocker l'état du réseau ferroviaire et les ordres de train dans une base de données SQL Server 2005.
Nous avons une exigence de sécurité selon laquelle le logiciel COTS ne peut pas être «approuvé» en soi.

Exigence
Ainsi, le risque a été capturé comme: «serveur SQL ou système d'exploitation modifie des données statiques ou dynamiques »
Notre mandat: "Les données stockées dans la base de données doivent être validées de manière à ce que le code d'accès aux données puisse confirmer qu'elles n'ont pas changé depuis la dernière validation."

Question
J'aimerais trouver un moyen "automagic" de remplir cette exigence.
A défaut, un moyen de satisfaire la condition sans avoir à créer des colonnes dans toutes les tables de la base de données pour stocker hash calculé (que nous avons ensuite valider par rapport à la lecture.)

+0

Certes, toute façon «automagique» de satisfaire à cette exigence serait mise en œuvre par le logiciel COTS, créant ainsi un paradoxe? –

Répondre

1

Peut-être quelque chose comme un checksum MD5 est sauvegardé dans la même table ou dans une table différente des données principales. La somme de contrôle serait générée par votre application C#, donc si quelqu'un faisait une mise à jour en utilisant le SQL brut, la somme de contrôle serait désactivée.

1

le lire peut être confirmé par le code d'accès aux données qu'il n'a pas changé depuis la dernière validation.

Cela est trivial. Sous tous les niveaux d'isolement non lisibles à l'exception de l'instantané, les données lues sont les dernières données validées. Par définition, il n'a pas changé depuis la dernière validation (en d'autres termes, s'il a été modifié, les nouvelles valeurs sont la dernière validation). Les modifications accidentelles (puisque les exigences mentionnent 'OS modifie les données') sont appelées 'corruption de données' et sont capturées par page checksum, ou par TDE.

Peut-être la nécessité réelle est que la valeur n'a pas changé dans la base de données depuis la lecture dans l'application? Puis Optmistic Concurency Control, c'est tout ce qu'il y a à faire. Ajoutez simplement chaque 'ancienne' valeur à vos clauses UPDATE WHERE et elle prendra soin de lui-même. Si vous n'avez mis à jour aucune ligne (et vous le saurez en vérifiant @@ ROWCOUNT ou en utilisant une clause OUTPUT), vous savez que la ligne a changé. Proactive caching peut également être déployé.