J'ai créé une vue dans database1 basée sur des tables dans database2. J'ai donné la SELECT
permission à un utilisateur qui n'a accès qu'à database1. L'utilisateur ne peut pas faire fonctionner cette vue car il n'a pas de compte dans database2. Comment puis-je résoudre ce problème? Je ne veux pas créer de compte dans database2.
10
TRUSTWORTHY ON
ou de faire en sorte que l'application se connecte soussa
. DB Ownership Chaining etTRUSTWORTHY
existent principalement en raison d'être la seule solution à l'époque. Mais maintenant, même si ce n'est pas un risque énorme, DB Chaining est certainement un risque inutile car la signature de module n'est pas si difficile. Et si l'on s'appuie sur le chaînage de bases de données et utilise ensuite Dynamic SQL, ils sont plus susceptiblesTRUSTWORTHY ON
de le régler, alors qu'avec la signature de module, il ne se serait pas cassé.DB_CHAINING
n'est pas plus risqué que le chaînage de propriété intra-base de données alors que les objets devraient de toute façon être dans la même base de données.DB_CHAINING
c'est assez risqué.Réponses:
Ceci est facile à réaliser de manière très sécurisée à l'aide de la signature de module. Ce sera similaire aux deux réponses suivantes, également ici sur DBA.StackExchange, qui donnent des exemples de cela:
Sécurité des procédures stockées avec exécution en tant que, requêtes de bases de données croisées et signature de module
Autorisations dans les déclencheurs lors de l'utilisation de certificats de bases de données croisées
La différence pour cette question particulière est qu'elle traite d'une vue et que les vues ne peuvent pas être signées. Ainsi, vous devrez changer la vue en une fonction table à valeurs multiples (TVF) car celles-ci peuvent être signées et accessibles comme une vue (enfin, pour l'
SELECT
accès).L'exemple de code suivant montre faire exactement ce qui est demandé dans la question en ce que le login / utilisateur "RestrictedUser" n'a accès qu'à "DatabaseA" et peut encore obtenir des données de "DatabaseB". Cela ne fonctionne qu'en sélectionnant celui-ci TVF , et uniquement en raison de sa signature.
La réalisation de ce type d'accès entre bases de données tout en utilisant une vue et en ne donnant à l'utilisateur aucune autorisation supplémentaire, nécessiterait l'activation du chaînage de propriété entre bases de données. C'est beaucoup moins sûr car il est complètement ouvert pour tous les objets entre les deux bases de données (il ne peut pas être limité à certains objets et / ou utilisateurs). La signature de module permet à ce seul TVF d'avoir un accès cross-DB (l'utilisateur n'a pas l'autorisation, le TVF en a), et les utilisateurs qui ne peuvent pas
SELECT
depuis le TVF n'ont aucun accès à "DatabaseB".Toutes les étapes ci-dessus recréent la situation actuelle: l'utilisateur a accès à DatabaseA, a la permission d'interagir avec un objet dans DatabaseA, mais obtient une erreur car cet objet dans DatabaseA accède à quelque chose dans DatabaseB où l'utilisateur n'a aucun accès.
Les étapes ci-dessous configurent le module de chant. Il fait ce qui suit:
SELECT
autorisation à la table dans DatabaseB à l'utilisateur basé sur un certificatConfiguration de la signature du module:
SI L'ACCÈS DOIT ÊTRE À TRAVERS UNE VUE, pour une raison quelconque, vous pouvez simplement créer une vue qui sélectionne à partir du TVF illustré ci-dessus. Et, dans cette situation, l'
SELECT
accès n'a pas besoin d'être accordé à la TVF, mais uniquement à la vue, comme illustré ci-dessous:Et maintenant pour le tester:
Pour plus d'informations sur la signature de module, veuillez visiter: https://ModuleSigning.Info/
la source
ALTER CERTIFICATE ... DROP PRIVATE KEY
la clé privée disparaîtra si vous ne la sauvegardez pas d'abord dans un fichier à l'aide du CERTIFICAT DE SAUVEGARDE . Mais, la clé publique est toujours en placesys.certificates
. Et la clé publique n'a pas besoin du mot de passe. Seule l'utilisation de la clé privée pour signer un module nécessite le mot de passe (qui est le même sur tous les serveurs, contrairement à la protection via la clé principale).