J'ai l'habitude de travailler dans des environnements très sécurisés et je conçois donc mes autorisations avec un très bon degré de granularité. Une chose que je fais normalement est d'expliciter aux DENY
utilisateurs la possibilité de UPDATE
créer des colonnes qui ne devraient jamais être mises à jour.
Par exemple:
create table dbo.something (
created_by varchar(50) not null,
created_on datetimeoffset not null
);
Ces deux colonnes ne doivent jamais être modifiées une fois la valeur définie. Par conséquent, je voudrais explicitement DENY
l' UPDATE
autorisation sur eux.
Récemment, lors d'une réunion d'équipe, un développeur a fait valoir que la logique garantissant que les champs ne soient jamais mis à jour devrait être contenue dans la couche application et non dans la couche base de données dans le cas où "ils ont besoin de mettre à jour les valeurs pour une raison quelconque". Pour moi, cela ressemble à une mentalité de développement typique (je sais, j'en étais un!)
Je suis l'architecte senior de mon entreprise et j'ai toujours travaillé sur le principe du minimum de privilèges requis pour faire fonctionner l'application. Toutes les autorisations sont auditées régulièrement.
Quelle est la meilleure pratique dans ce scénario?
la source
Réponses:
L'argument n'a pas de sens. Je veux toujours que les contrôles et les contraintes soient aussi proches que possible des données. Le placer dans la couche application signifie qu'il n'affecte que les personnes utilisant la couche application et suppose également que le code sera exempt de bogues et que la sécurité autour de ces chemins de code sera à l'épreuve des balles. Ce sont de grandes hypothèses.
S'ils doivent absolument être mis à jour, cela peut être fait par une personne non affectée par l'explicite
DENY
, ou la personne peut être temporairement déplacée dans un rôle qui n'est pas affecté, ouDENY
peut être temporairement supprimée. Ce sont des choses qui sont faciles pour vous, en tant que DBA, à configurer l'audit. Dans l'application? Pas tellement.la source
Je suis entièrement d'accord avec @Aaron sur l'aspect technique de cela.
Au-delà de cela, je dirais, concernant les meilleures pratiques:
Étant donné que c'est le travail / la responsabilité du DBA de protéger les données, l'approche par défaut devrait être de faire exactement cela, comme le DBA le juge approprié, et nécessiter une analyse de rentabilisation solide pour effectuer un changement. Un potentiel futur hypothétique-quelque-peu-possible-donné-certaines-conditions-qui-seront-brainstormées-plus tard-et-confirmées-bien-après-mais-peut-être-changées-plus tard-ou-pourraient-ne jamais -la raison qui se produit réellement (c'est-à-dire "pour une raison quelconque") semble un peu fragile d'une justification, en particulier lorsque le sujet change une norme / pratique d'entreprise.
Ne faites jamais confiance à quelqu'un qui souhaite apporter des modifications à quelque chose qui ne devrait jamais changer ;-), (encore plus s'il ne sait même pas pourquoi il le souhaite).
Dites au développeur qu'il est bienvenu d'ajouter une telle logique au code de l'application pour empêcher ces mises à jour. Mais, aussi que vous n'allez pas supprimer le
DENY
. Si / quand le jour vient un jour (etpourrait ne pasprobablement pas) que quelqu'un obtient une erreur en essayant de mettre à jour l'une de ces colonnes, alors vous pouvez avoir une discussion pour savoir si vous supprimerez ou nonDENY
, ce qui nécessitera une justification réelle et solide pour laquelle quelqu'un mettrait à jour cette valeur dans le première place.Le point étant: il devrait y avoir une véritable analyse de rentabilisation sur laquelle les gens passent leur temps. Le temps est en forte demande mais en pénurie, donc vous (et tout le monde) avez des choses plus importantes à faire que de changer le système en fonction de l'opinion de quelqu'un. Il y aura toujours une variété d'opinions (espaces vs tabulations, n'importe qui?) Et vous pourriez passer des années à changer cela d'avant en arrière si ce développeur quitte et est remplacé par quelqu'un qui s'oppose fortement à ce que ces champs puissent être mis à jour. Si aucun client ne le demande (ou quelque chose qui l'exige), et qu'il n'y a aucun avantage tangible (même un avantage retardé tel que le nettoyage de la dette technique, qui est difficile à afficher le retour sur investissement, mais qui en vaut la peine étant donné que le les chances que ce temps passé n'entraîne pas d'économies réelles à long terme sont minimes, voire nulles), puis fermez la demande ou placez-la dans l'arriéré avec une faible priorité, même dans les cas où l'idéalisme dit qu'elle devrait être modifiée (ce n'est pas un de ces cas, mais mentionné pour ceux qui pensent que c'est le cas). L'idéalisme est idéal pour les conversations, mais les entreprises ne peuvent pas payer le loyer, les services publics, les employés, les taxes, etc. avec des idéaux.
@ jpmc26 a raison sur le besoin de communication, mais pas exactement sur ce qui doit être communiqué. Oui, vous devez écouter ce que les autres demandent et chercher à comprendre leur raisonnement, ce qui inclut de poser des questions si vous n'êtes pas clair sur quoi que ce soit.
TOUTEFOIS, la base de données n'est pas subordonnée à l'application, et les professionnels de la base de données (administrateurs, ingénieurs, quel que soit le nom utilisé par votre entreprise) ne sont pas subordonnés aux développeurs (comme cela semble être impliqué dans cette réponse). Vous ne travaillez pas pour les développeurs, vous travaillez pour l'entreprise, tout comme eux. Il s'agit d'un effort d'équipe et vous ne devriez pas demander pardon pour avoir fait votre travail. Cela dit, nous, les types de calcul, ne sommes pas (généralement) connus pour nos compétences en communication interhumaine, donc, vous devez vraiment vous assurer que les autres vous comprennent , quel est votre raisonnement, quelles sont vos responsabilités ET comment ces choses fonctionnent réellement .
J'ai mis cette dernière partie parce qu'il y a un haut degré de malentendu, de désinformation et de manque de connaissances (même certains ici sur cette même page). Par exemple, il semble y avoir cette notion que toutes les règles sont des règles commerciales. Nous devons expliquer qu'il existe une distinction entre les règles de données et les règles métier (@Aaron a appelé cela "contrainte de workflow vs contrainte de données" dans un commentaire sur la question), et que si la plupart des données appartiennent naturellement à l'application, certaines données appartient en fait au modèle de données. Un DBA doit-il dicter aux développeurs comment les données d'application seront contraintes? Bien sûr que non. Il est de notre devoir de montrer comment les données d'application peuventêtre contraint. Si une violation d'une règle métier liée aux données d'application peut causer des dommages et que l'application n'est pas le seul moyen à 100% de manipuler les données, alors peut-être qu'une contrainte de vérification pourrait vraiment aider (et qu'elles ne sont pas difficiles à modifier ou à supprimer) ).
MAIS, venant de l'autre côté, les développeurs ne devraient pas dicter comment les données du modèle de données (c'est-à-dire les métadonnées) sont traitées. Cela inclut les champs d'audit (tels que les colonnes
created_on
/created_by
) et les colonnes PK / FK (ces valeurs ne sont censées être connues qu'en interne et ne sont pas transmises aux clients). Ces données ne sont pas ce que l'application stocke sur les clients (même si l'application peut voir les valeurs et même les utiliser, comme avec les ID), c'est ce que le modèle de données stocke sur les données de l'application.Il est donc logique d'utiliser des règles de données pour protéger les données du modèle de données. Et cela n'implique pas que vous êtes sur le point de commencer à ajouter des contraintes ou des restrictions sur les données d'application. MAIS, il sera difficile de faire avancer la conversation d'une manière vraiment productive si cette distinction n'est pas comprise.
Alors:
DENY
dans les colonnes d'audit, et j'ai proposé la même chose dans des endroits où j'ai travaillé par le passé également.Pour l'anecdote, j'ai eu une conversation très similaire avec un développeur principal (un très bon), peut-être en 2000, quand j'ai commencé à ajouter des clés étrangères. Il a soutenu (assez sérieusement) qu'il s'agissait d'une ingénierie / idéalisme inutile (quelque chose comme ça, cela fait 17 ans depuis cette conversation) et ne valait pas le coup de la performance. Il était tout à fait clair que le nettoyage des données connexes devrait être géré dans la couche d'application. (oui, j'ai ajouté les FK parce qu'il n'allait pas être le seul à nettoyer les données orphelines que son code créerait inévitablement)
Des années plus tard, il s'est excusé d'avoir avancé cet argument ;-)
la source
Il s'agit probablement d'un problème XY. Le développeur n'est probablement pas particulièrement concerné par le blocage des mises à jour d'un champ vraiment constant comme
created_on
. Cet exemple particulier est une contrainte extrêmement modeste.Le développeur est probablement préoccupé par le fait que l'équipe DBA (qui vous inclut) a l'intention d'ajouter tant de restrictions complexes que cela commence à entraver leur capacité à fonctionner efficacement, ou que lorsque quelque chose hors de l'ordinaire se produit ou que quelque chose change, l'équipe DBA va résister aux changements et entraver la capacité de l'équipe de développement à progresser. Il s'agit d'une préoccupation relativement raisonnable. Les bureaucraties et la perte de la capacité d'effectuer les changements nécessaires sont des événements réels, et l'encodage de contraintes trop nombreuses ou complexes peut avoir des effets négatifs sur les performances et sur la capacité de répondre aux changements des exigences.
Le développeur peut même ne pas réaliser que c'est la nature de leurs préoccupations. Ils sont probablement habitués à avoir le règne libre de la base de données, et abandonner ce niveau de liberté est difficile, surtout si vous savez que vous n'en avez jamais abusé. Ainsi, leur sentiment d'inquiétude de perdre la capacité de faire ce dont ils ont besoin pourrait bien être vague et mal défini.
Il y a donc quelques choses que vous devez faire pour apaiser ces peurs:
la source
Vous avez des déclarations contradictoires
Est-ce vraiment à vous de dicter le premier?
Vous jetez le moindre privilège pour que l'application fonctionne sans preuve, l'application n'aura jamais besoin de mettre à jour la valeur.
Qui est responsable de l'intégrité des données?
Avec les contraintes SQL, pouvez-vous garantir l'intégrité des données? Non, vous ne pouvez pas, car il existe souvent des règles métier qui vont au-delà de ce que peut faire une base de données.
VendorID ne doit jamais changer, mais que se passe-t-il si deux fournisseurs fusionnent. Ne jamais dire jamais.
Si l'équipe de l'application contamine les données et qu'elle a dit qu'elle avait besoin de cette autorité, c'est à elle. Si les équipes d'application travaillent pour vous, vous pouvez dicter.
La question appropriée est de savoir si l'application doit mettre à jour les données.
la source