Lezen in het Engels

Share via


Effectieve database-enginemachtigingen bepalen

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-database in Microsoft Fabric

In dit artikel wordt beschreven hoe u bepaalt wie machtigingen heeft voor verschillende objecten in de SQL Server Database Engine. SQL Server implementeert twee machtigingssystemen voor de database-engine. Een ouder systeem met vaste rollen heeft vooraf geconfigureerde machtigingen. Vanaf SQL Server 2005 (9.x) is een flexibeler en nauwkeuriger systeem beschikbaar.

Notitie

De informatie in dit artikel is van toepassing op SQL Server 2005 (9.x) en latere versies. Sommige typen machtigingen zijn niet beschikbaar in sommige versies van SQL Server.

Houd altijd rekening met de volgende punten:

  • De effectieve machtigingen zijn de samenvoeging van beide machtigingssystemen.
  • Een weigering van machtigingen overschrijft een toekenning van machtigingen.
  • Als een gebruiker lid is van de vaste serverfunctie sysadmin, worden machtigingen niet verder gecontroleerd, zodat denials niet worden afgedwongen.
  • Het oude systeem en het nieuwe systeem hebben overeenkomsten. Lidmaatschap van de sysadmin vaste serverfunctie is bijvoorbeeld vergelijkbaar met het hebben van CONTROL SERVER machtiging. Maar de systemen zijn niet identiek. Als een aanmelding bijvoorbeeld alleen de CONTROL SERVER-machtiging heeft en een opgeslagen procedure controleert op lidmaatschap van de sysadmin vaste serverfunctie, mislukt de machtigingscontrole. Het omgekeerde is ook waar.
  • In Fabric SQL Database is Microsoft Entra ID voor databasegebruikers de enige ondersteunde verificatiemethode. Functies en machtigingen op serverniveau zijn niet beschikbaar, alleen op databaseniveau. Zie Autorisatie in SQL Database in Microsoft Fabricvoor meer informatie.

Samenvatting

  • Machtiging op serverniveau kan afkomstig zijn van lidmaatschap van de vaste serverfuncties of door de gebruiker gedefinieerde serverfuncties. Iedereen behoort tot de public vaste serverfunctie en ontvangt alle machtigingen die daar zijn toegewezen.
  • Machtigingen op serverniveau kunnen afkomstig zijn van machtigingen voor aanmeldingen of door de gebruiker gedefinieerde serverfuncties.
  • Machtiging op databaseniveau kan afkomstig zijn van lidmaatschap van de vaste databaserollen of door de gebruiker gedefinieerde databaserollen in elke database. Iedereen behoort tot de public vaste databaserol en ontvangt alle machtigingen die daar zijn toegewezen.
  • Machtigingen op databaseniveau kunnen afkomstig zijn van machtigingen voor gebruikers of door de gebruiker gedefinieerde databaserollen in elke database.
  • Machtigingen kunnen, indien ingeschakeld, worden ontvangen van de guest aanmelding of guest databasegebruiker. De guest aanmelding en gebruikers zijn standaard uitgeschakeld.
  • Windows-gebruikers kunnen lid zijn van Windows-groepen die aanmeldingen kunnen hebben. SQL Server leert van windows-groepslidmaatschap wanneer een Windows-gebruiker verbinding maakt en een Windows-token presenteert met de beveiligings-id van een Windows-groep. Omdat SQL Server geen automatische updates over Windows-groepslidmaatschappen beheert of ontvangt, kan SQL Server de machtigingen van Windows-gebruikers die zijn ontvangen van het Windows-groepslidmaatschap niet betrouwbaar rapporteren.
  • Machtigingen kunnen worden verkregen door over te schakelen naar een toepassingsrol en het wachtwoord op te geven.
  • Machtigingen kunnen worden verkregen door een opgeslagen procedure uit te voeren die de EXECUTE AS component bevat.
  • Machtigingen kunnen worden verkregen door aanmeldingen of gebruikers met de machtiging IMPERSONATE.
  • Leden van de lokale computerbeheerdergroep kunnen hun bevoegdheden altijd uitbreiden tot sysadmin. (Is niet van toepassing op SQL Database.)
  • Leden van de securityadmin vaste serverrol kunnen veel van hun bevoegdheden opwaarderen en in sommige gevallen hun bevoegdheden naar een hoger niveau, zoals sysadmin, opwaarderen. (Is niet van toepassing op SQL Database.)
  • SQL Server-beheerders kunnen informatie bekijken over alle aanmeldingen en gebruikers. Gebruikers met minder bevoegdheden zien meestal informatie over alleen hun eigen identiteiten.

Ouder machtigingssysteem voor vaste rollen

Vaste serverfuncties en vaste databaserollen hebben vooraf geconfigureerde machtigingen die niet kunnen worden gewijzigd. Voer de volgende query uit om te bepalen wie lid is van een vaste serverfunctie:

Notitie

Is niet van toepassing op SQL Database of Azure Synapse Analytics waarbij de machtiging op serverniveau niet beschikbaar is. De is_fixed_role kolom van sys.server_principals is toegevoegd in SQL Server 2012 (11.x). Het is niet nodig voor oudere versies van SQL Server.

SQL
SELECT SP1.name AS ServerRoleName,
    ISNULL(SP2.name, 'No members') AS LoginName
FROM sys.server_role_members AS SRM
RIGHT JOIN sys.server_principals AS SP1
    ON SRM.role_principal_id = SP1.principal_id
LEFT JOIN sys.server_principals AS SP2
    ON SRM.member_principal_id = SP2.principal_id
WHERE SP1.is_fixed_role = 1 -- Remove for SQL Server 2008
ORDER BY SP1.name;

Notitie

Alle inloggegevens zijn leden van de publieke rol en kunnen niet worden verwijderd. De query controleert tabellen in de master-database, maar kan worden uitgevoerd in elke database voor het on-premises product.

Als u wilt bepalen wie lid is van een vaste databaserol, voert u de volgende query uit in elke database.

SQL
SELECT DP1.name AS DatabaseRoleName,
    ISNULL(DP2.name, 'No members') AS DatabaseUserName
FROM sys.database_role_members AS DRM
RIGHT JOIN sys.database_principals AS DP1
    ON DRM.role_principal_id = DP1.principal_id
LEFT JOIN sys.database_principals AS DP2
    ON DRM.member_principal_id = DP2.principal_id
WHERE DP1.is_fixed_role = 1
ORDER BY DP1.name;

Als u de machtigingen wilt begrijpen die aan elke rol worden verleend, raadpleegt u de rolbeschrijvingen in illustraties in Books Online (serverrollenen rollen op databaseniveau).

Nieuwere gedetailleerde machtigingssysteem

Dit systeem is flexibel, wat betekent dat het ingewikkeld kan zijn als de mensen die het instellen willen nauwkeurig zijn. Ter vereenvoudiging van zaken helpt het bij het maken van rollen, het toewijzen van machtigingen aan rollen en het toevoegen van groepen personen aan de rollen. En het is eenvoudiger als het databaseontwikkelingsteam activiteiten op schema scheidt en vervolgens rolmachtigingen verleent aan een heel schema in plaats van aan afzonderlijke tabellen of procedures. Echte scenario's zijn complex en bedrijfsbehoeften kunnen onverwachte beveiligingsvereisten creëren.

In de volgende afbeelding ziet u de machtigingen en de bijbehorende relaties met elkaar. Sommige machtigingen op een hoger niveau (zoals CONTROL SERVER) worden vaak vermeld. In dit artikel is de poster veel te klein om te lezen. U kunt de Database Engine Permissions Poster in volledige grootte in PDF-formaat downloaden.

een screenshot van de Database Engine machtigingen-PDF.

Beveiligingsklassen

Machtigingen kunnen worden verleend op serverniveau, databaseniveau, schemaniveau of objectniveau, enzovoort. Er zijn 26 niveaus (klassen genoemd). De volledige lijst met klassen in alfabetische volgorde is: APPLICATION ROLE, ASSEMBLY, ASYMMETRIC KEY, AVAILABILITY GROUP, CERTIFICATE, CONTRACT, DATABASE, DATABASESCOPED CREDENTIAL, ENDPOINT, FULLTEXT CATALOG, FULLTEXT STOPLIST, LOGIN, MESSAGE TYPE, OBJECT, REMOTE SERVICE BINDING, ROLE, ROUTE, SCHEMA, SEARCH PROPERTY LIST, SERVER, SERVER ROLE, SERVICE, SYMMETRIC KEY, TYPE, USER, XML SCHEMA COLLECTION. (Sommige klassen zijn niet beschikbaar voor sommige typen SQL Server.) Voor volledige informatie over elke klasse is een andere query vereist.

Principalen

Machtigingen worden verleend aan verantwoordelijken. Principals kunnen serverfuncties, aanmeldingen, databaserollen of gebruikers zijn. Aanmeldingen kunnen Windows-groepen vertegenwoordigen die veel Windows-gebruikers bevatten. Omdat Windows-groepen niet worden onderhouden door SQL Server, weet SQL Server niet altijd wie lid is van een Windows-groep. Wanneer een Windows-gebruiker verbinding maakt met SQL Server, bevat het aanmeldingspakket de lidmaatschapstokens van de Windows-groep voor de gebruiker.

Wanneer een Windows-gebruiker verbinding maakt met behulp van een aanmelding op basis van een Windows-groep, is voor sommige activiteiten mogelijk SQL Server vereist om een aanmelding of gebruiker te maken die de afzonderlijke Windows-gebruiker vertegenwoordigt. Een Windows-groep (technici) bevat bijvoorbeeld gebruikers (Mary, Todd, Pat) en de groep Engineers heeft een databasegebruikersaccount. Als Mary gemachtigd is en een tabel maakt, kan een gebruiker (Mary) worden gemaakt als eigenaar van de tabel. Of als Todd een machtiging wordt geweigerd die de rest van de groep Ingenieurs heeft, moet de gebruiker Todd worden aangemaakt om bij te houden dat de machtiging is geweigerd.

Houd er rekening mee dat een Windows-gebruiker lid kan zijn van meer dan één Windows-groep (bijvoorbeeld zowel technici als managers). Machtigingen die aan de aanmelding van de engineers en beheerders verleend of geweigerd worden, die afzonderlijk aan de gebruiker worden verleend of geweigerd, en die aan rollen waarvan de gebruiker lid is verleend of geweigerd worden, worden allemaal samengevoegd en geëvalueerd voor de vaststelling van de effectieve machtigingen. Met de functie HAS_PERMS_BY_NAME kan worden aangegeven of een gebruiker of aanmelding een bepaalde machtiging heeft. Er is echter geen duidelijke manier om de bron van de toekenning of weigering van toestemming te bepalen. Bekijk de lijst met toestemmingen en experimenteer misschien door middel van vallen en opstaan.

Nuttige zoekopdrachten

Servermachtigingen

De volgende query retourneert een lijst met de machtigingen die zijn verleend of geweigerd op serverniveau. Deze query moet worden uitgevoerd in de master-database.

Notitie

Machtigingen op serverniveau kunnen niet worden verleend of opgevraagd in SQL Database of Azure Synapse Analytics.

SQL
SELECT pr.type_desc,
    pr.name,
    ISNULL(pe.state_desc, 'No permission statements') AS state_desc,
    ISNULL(pe.permission_name, 'No permission statements') AS permission_name
FROM sys.server_principals AS pr
LEFT JOIN sys.server_permissions AS pe
    ON pr.principal_id = pe.grantee_principal_id
WHERE is_fixed_role = 0 -- Remove for SQL Server 2008
ORDER BY pr.name,
    type_desc;

Databasemachtigingen

De volgende query retourneert een lijst met de machtigingen die zijn verleend of geweigerd op databaseniveau. Deze query moet worden uitgevoerd in elke database.

SQL
SELECT pr.type_desc,
    pr.name,
    ISNULL(pe.state_desc, 'No permission statements') AS state_desc,
    ISNULL(pe.permission_name, 'No permission statements') AS permission_name
FROM sys.database_principals AS pr
LEFT JOIN sys.database_permissions AS pe
    ON pr.principal_id = pe.grantee_principal_id
WHERE pr.is_fixed_role = 0
ORDER BY pr.name,
    type_desc;

Elke permissieklasse kan worden gekoppeld aan andere systeemweergaven die gerelateerde informatie over die beveiligbare klasse bieden. De volgende query bevat bijvoorbeeld de naam van het databaseobject dat wordt beïnvloed door de machtiging.

SQL
SELECT pr.type_desc,
    pr.name,
    pe.state_desc,
    pe.permission_name,
    s.name + '.' + oj.name AS OBJECT,
    major_id
FROM sys.database_principals AS pr
INNER JOIN sys.database_permissions AS pe
    ON pr.principal_id = pe.grantee_principal_id
INNER JOIN sys.objects AS oj
    ON oj.object_id = pe.major_id
INNER JOIN sys.schemas AS s
    ON oj.schema_id = s.schema_id
WHERE class_desc = 'OBJECT_OR_COLUMN';

Gebruik de functie HAS_PERMS_BY_NAME om te bepalen of een bepaalde gebruiker (in dit geval TestUser) een machtiging heeft. Bijvoorbeeld:

SQL
EXECUTE AS USER = 'TestUser';
SELECT HAS_PERMS_BY_NAME ('dbo.T1', 'OBJECT', 'SELECT');
REVERT;

Zie HAS_PERMS_BY_NAMEvoor meer informatie over de syntaxis.

Volgende stappen