Je voudrais écrire une requête sur un sql 2008 qui rapportera tous les utilisateurs qui ont accès à une base de données spécifique, ou des objets dans la base de données tels que des tables, des vues et des procédures stockées, directement ou en raison de rôles, etc. rapport serait utilisé à des fins d'audit de sécurité. Je ne sais pas si quelqu'un a une requête qui répondra complètement à mes besoins, mais j'espère que quelque chose me donnera un bon départ. Soit sql 2008, 2005 ou 2000 fera l'affaire, je peux probablement convertir au besoin.
192
Réponses:
C'est ma première fissure à une requête, basée sur les suggestions d'Andomar. Cette requête est destinée à fournir une liste d'autorisations qu'un utilisateur a appliquées directement au compte d'utilisateur ou via les rôles dont dispose l'utilisateur.
la source
login_token
changé enuser_token
Voici une version complète de la requête d'août 2011 de Jeremy avec les modifications suggérées par Brad (octobre 2011) et iw.kuchin (mai 2012) incorporées:
[ObjectType]
et[ObjectName]
pour les schémas.[ObjectType]
il est préférable de n'utiliserobj.type_desc
que pour laOBJECT_OR_COLUMN
classe d'autorisation. Pour tous les autres cas, utilisezperm.[class_desc]
.IMPERSONATE
autorisations.sys.login_token
parsys.server_principals
car il affichera également les connexions SQL, pas seulement celles de Windows.sys
et INFORMATION_SCHEMA.Espérons que cela sauve à quelqu'un d'autre une heure ou deux de sa vie.
:)
la source
sys.login_token
nisys.server_principals
n'est pris en charge et doivent être remplacés parsys.user_token
À partir de SQL Server 2005, vous pouvez utiliser les vues système pour cela. Par exemple, cette requête répertorie tous les utilisateurs d'une base de données, avec leurs droits:
Sachez qu'un utilisateur peut également avoir des droits via un rôle. Par exemple, le
db_data_reader
rôle accorde desselect
droits sur la plupart des objets.la source
select * from sys.database_principals where type_desc = 'EXTERNAL_GROUP'
), alors que la réponse acceptée ne le fait pas, même après la correctionsys.user_token
.SELECT PrincipalName = p.[name], p.[type_desc], dp.[permission_name], dp.[state_desc], CASE dp.class_desc WHEN 'DATABASE' THEN DB_NAME(dp.major_id) WHEN 'SCHEMA' THEN SCHEMA_NAME(dp.major_id) WHEN 'OBJECT_OR_COLUMN' THEN CONCAT_WS('.', OBJECT_SCHEMA_NAME(dp.major_id), OBJECT_NAME(dp.major_id), c.[name]) END FROM sys.database_principals AS p LEFT OUTER JOIN sys.database_permissions AS dp ON p.principal_id = dp.grantee_principal_id LEFT OUTER JOIN sys.columns AS c ON dp.major_id = c.[object_id] AND dp.minor_id = c.column_id
Je ne peux pas commenter la réponse acceptée, je vais donc ajouter quelques commentaires ici:
sys.objects
table de référence From MS ne contient que des objets à portée de schéma. Donc, pour obtenir des informations sur les objets "de niveau supérieur" (c'est-à-dire les schémas dans notre cas) vous devez utilisersys.schemas
table.[ObjectType]
il est préférable de n'utiliserobj.type_desc
que pour laOBJECT_OR_COLUMN
classe d'autorisation. Pour tous les autres cas, utilisezperm.[class_desc]
IMPERSONATE
. Pour obtenir des informations sur les usurpations d'identité, il fautLEFT JOIN
avecsys.database_principals
surperm.major_id = imp.principal_id
sys.login_token
parsys.server_principals
car il affichera également les connexions SQL, pas seulement celles de Windows'G'
aux types principaux autorisés pour autoriser les groupes Windowssys
etINFORMATION_SCHEMA
de la table résultante, car ces utilisateurs ne sont utilisés que pour le serviceJe publierai le premier morceau de script avec tous les correctifs proposés, d'autres parties devraient également être modifiées:
la source
sysadmin
+securityadmin
sont mappés commedbo
pour chaque base de données sur le serveur + il y a une permission de serveurCONTROL SERVER
qui pourrait être accordée à l'utilisateur. Cette permission donne presque les mêmes droits que l'êtresysadmin
.Super script Jeremy et contributeurs! Merci!
J'ai une tonne d'utilisateurs, donc exécuter cela pour tous les utilisateurs était un cauchemar. Je n'ai pas pu ajouter de commentaires, donc je poste le script entier avec les modifications. J'ai ajouté une clause variable + where pour que je puisse rechercher tout ce qui correspond jusqu'à 5 caractères dans le nom d'utilisateur (ou tous les utilisateurs lorsqu'ils sont laissés en blanc). Rien de spécial, mais j'ai pensé que ce serait utile dans certains cas d'utilisation.
la source
Les autres réponses que j'ai vues manquent certaines autorisations possibles dans la base de données. La première requête dans le code ci-dessous obtiendra l'autorisation au niveau de la base de données pour tout ce qui n'est pas un objet système. Il génère également les instructions GRANT appropriées. La deuxième requête obtient tous les meberships de rôle.
Cela doit être exécuté pour chaque base de données, mais est trop long pour être utilisé avec sp_MSforeachdb. Si vous souhaitez faire cela, vous devez l'ajouter à la base de données master en tant que procédure stockée système.
Pour couvrir toutes les possibilités, vous devez également disposer d'un script qui vérifie les autorisations au niveau du serveur.
MISE À JOUR: Les requêtes suivantes récupéreront les autorisations et les appartenances au niveau du serveur.
la source
Voici ma version, adaptée des autres. J'ai passé 30 minutes à essayer de me souvenir de la façon dont j'ai trouvé ça, et la réponse de @Jeremy semble être l'inspiration principale. Je ne voulais pas mettre à jour la réponse de Jeremy, juste au cas où j'aurais introduit des bugs, alors j'en publie ma version ici.
Je suggère d'associer le script complet à une inspiration tirée de T-SQL Tuesday de Kenneth Fisher: Quelles autorisations dispose un utilisateur spécifique? : Cela vous permettra de répondre aux questions de conformité / d'audit de bas en haut, plutôt que de haut en bas.
Pour comprendre ce que cela couvre, considérez
Contoso\DB_AdventureWorks_Accounting
Groupe Windows AD avec membreContoso\John.Doe
. John.Doe s'authentifie auprès d'AdventureWorks via le groupeContoso\DB_AdventureWorks_Logins
Windows AD server_principal . Si quelqu'un vous demande «Quelles sont les autorisations de John.Doe?», Vous ne pouvez pas répondre à cette question uniquement avec le script ci-dessous. Vous devez ensuite parcourir chaque ligne renvoyée par le script ci-dessous et la joindre au script ci-dessus. (Vous devrez peut-être également normaliser lesname
valeurs périmées en recherchant le SID dans votre fournisseur Active Directory.)Voici le script, sans incorporer une telle logique de recherche inversée.
la source
la source
La procédure stockée GetPermissions ci-dessus est bonne, mais elle utilise Sp_msforeachdb, ce qui signifie qu'elle sera interrompue si votre instance SQL a des noms de bases de données qui incluent des espaces ou des tirets et d'autres caractères non conformes aux meilleures pratiques. J'ai créé une version qui évite l'utilisation de Sp_msforeachdb et comprend également deux colonnes qui indiquent 1 - si la connexion est une connexion sysadmin (IsSysAdminLogin) et 2 - si la connexion est un utilisateur orphelin (IsEmptyRow).
la source
you can use [] to resolve it. sp_msforeachdb ' use [?] select db_name()'
je suppose que sa réponse était un commentaire, mais comme son compte ne remplit pas la réputation minimale, il a publié une réponse à la place.J'ai essayé à peu près tout cela, mais j'ai rapidement remarqué qu'il en manquait certains, en particulier les utilisateurs sysadmin. Avoir un trou comme celui-là ne semblera pas bon dans notre prochain audit, c'est donc ce que j'ai trouvé
la source
En raison du faible nombre de représentants, ne peut pas répondre avec cela aux personnes demandant de l'exécuter sur plusieurs bases de données / serveurs SQL.
Créez un groupe de serveurs enregistrés et interrogez sur eux tous les éléments suivants et faites simplement le curseur dans les bases de données:
Ce fil m'a massivement aidé à remercier tout le monde!
la source
DB_NAME()
et en stockant la sortie dans une table temporaire pour éviter de se retrouver avec plusieurs ensembles de résultats. Merci!Un grand merci pour les scripts d'audit impressionnants.
Je recommande vivement aux utilisateurs d'audit d'utiliser des procédures stockées impressionnantes de Kenneth Fisher ( b | t ):
la source
Une simple requête qui montre uniquement si vous êtes un SysAdmin ou non:
la source
Malheureusement, je n'ai pas pu commenter le message de Sean Rose en raison d'une réputation insuffisante, mais j'ai dû modifier la partie du rôle "public" du script car elle n'affichait pas les autorisations de portée SCHEMA en raison du (INNER) JOIN contre sys. objets. Après que cela ait été changé en LEFT JOIN, j'ai dû en outre modifier la logique de la clause WHERE pour omettre les objets système. Ma requête modifiée pour les perms publiques est ci-dessous.
la source
Si vous voulez vérifier l'accès aux bases de données pour une connexion particulière, utilisez ce script simple comme ci-dessous:
sys.sp_helplogins @LoginNamePattern = 'Domaine \ login' - sysname
la source
- ok à mon tour de contribuer, profiter
Cet en-tête de rapport saisit dynamiquement le nom de l'instance SQL, la date / l'heure et le nom du compte sur lequel le rapport est exécuté, tout ce qu'un bon auditeur voudra savoir. :)
Remarque - si vous avez une propriété étendue appelée «environnement» sur la base de données principale, la valeur (quoi que vous utilisiez: PreProd, Development, Production, DR, etc.) sera incluse dans l'en-tête du rapport.
FIN
- génial pour enregistrer en tant que proc stocké
la source