Comment créer un rôle serveur en lecture seule sur SQL Server 2012?

15

J'accorde l'autorisation «Afficher toute base de données» lors de la création d'un nouveau rôle serveur, mais j'ai réalisé que cette autorisation ne permet qu'à l'utilisateur de visualiser les bases de données système.

J'essaie de créer un rôle serveur qui est en lecture seule et peut lire n'importe quelle base de données.

Existe-t-il un moyen de créer un rôle serveur défini par l'utilisateur pour lire les bases de données utilisateur? Ou dois-je le faire en mappant les utilisateurs par utilisateur?

joha
la source

Réponses:

16

Publier cela comme une réponse juste parce qu'il est trop long pour un commentaire et parce qu'il sera pertinent pour les autres utilisateurs très bientôt.

SQL Server 2014 ajoute de nouvelles autorisations au niveau du serveur qui aideront exactement avec ce type de scénario - elles ont été conçues avec l'audit à l'esprit, mais ce type d'exigence semble également correspondre à cette facture. Vous pouvez simplement ajouter les deux autorisations suivantes à une connexion au niveau du serveur:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

Comme il semble, le premier permet à la connexion de se connecter à n'importe quelle base de données. La bonne chose à ce sujet est qu'il permettra cela même pour les bases de données qui seront créées à l'avenir (à condition que vous ne définissiez pas le refus explicite, c'est ainsi que vous pouvez protéger certaines bases de données utilisateur des connexions qui ont cette autorisation). Ce dernier permet à la connexion d'effectuer des opérations de lecture sur n'importe quelle base de données à laquelle ils ont accès - afin qu'ils puissent à SELECTpartir de tables, de vues, d'UDF, etc. mais ils ne pourront pas effectuer d' UPDATEopérations (je n'ai pas testé si cette autorisation comprend quand un procédure stockée exécute DML). Ceux-ci fonctionnent très bien en combinaison si vous souhaitez donner un accès en lecture ouvert à tout le serveur, ou pour être plus précis, vous pouvez accorder des CONNECTprivilèges traditionnels à certaines bases de données, et la SELECT ALL USER SECURABLESbonne volonténe fonctionne que pour les bases de données auxquelles la connexion a un accès explicite.

Les changements de sécurité de 2014 sont documentés ici - enfin, partiellement; ils ont oublié l'autorisation au niveau de la base de données ALTER ANY DATABASE EVENT SESSION- bien que ce ne soit pas pertinent ici.

Aaron Bertrand
la source
Merci pour cette réponse étendue pour les serveurs à venir. Étant donné que cette opération / vérification est au niveau du serveur. Y a-t-il des commentaires sur le niveau de compatibilité DB. Donc, si le DB CL est 2012, la fonctionnalité 2014 fonctionnera-t-elle toujours?
SnapJag
Le niveau de compatibilité @SnapJag n'a aucune incidence sur les fonctionnalités de sécurité, il s'agit principalement de la façon dont T-SQL est analysé et de la façon dont l'optimiseur génère des plans de requête.
Aaron Bertrand
@AaronBertrand Savez-vous s'il existe une autorisation que nous pouvons définir sur les rôles au niveau du serveur pour autoriser également les mises à jour sur n'importe quelle base de données? (Le rôle fixe sysadmin peut être sûr, mais pouvons-nous le faire pour un rôle serveur défini par l'utilisateur?)
MaxiWheat
@MaxiWheat Non, je ne vois pas de moyen trivial de le faire, désolé.
Aaron Bertrand
FWIW cela ne fonctionnera pas pour Azure SQL Database. GRANT CONNECTEZ TOUTE BASE DE DONNÉES À [NameOfUserOrGroup] Classe sécurisée 'serveur' non prise en charge dans cette version de SQL Server.
Dzejms
8

Il n'y a pas d'autorisation de lecture de toute base de données au niveau du serveur et les rôles au niveau du serveur ne peuvent pas recevoir d'autorisations au niveau de la base de données

Alors oui, vous devrez mapper les utilisateurs aux bases de données individuellement. Si vous utilisez Active Directory, vous pouvez créer un groupe Windows, puis donner à ce groupe une connexion à SQL Server, puis appliquer db_datareader dans toutes les bases de données de ce groupe (vous devrez cependant créer des utilisateurs dans chaque base de données).

Simon Righarts
la source