Beskriv database- og objekttilladelser
Alle platforme til administration af relationsdatabaser har fire grundlæggende tilladelser, som styrer DML-handlinger (Data Manipulation Language). Disse tilladelser er SELECT, INSERT, UPDATEog DELETE, og de gælder for alle SQL Server-platforme. Alle disse tilladelser kan tildeles, tilbagekaldes eller afvises på tabeller og visninger. Hvis der tildeles en tilladelse ved hjælp af sætningen GRANT, gives tilladelsen til den bruger eller rolle, der refereres til i GRANT-sætningen. Brugere kan også nægtes tilladelser ved hjælp af kommandoen DENY. Hvis en bruger får tildelt en tilladelse og nægtet den samme tilladelse, tilsidesætter altid DENY tildelingen, og brugeren nægtes adgang til det specifikke objekt.
I eksemplet tildeles SELECT brugerdemoen og afvises SELECT derefter tilladelser til dbo. Firmatabel . Når brugeren forsøger at udføre en forespørgsel, der vælger fra dbo. Firmatabel , får brugeren vist en fejl om, at SELECT tilladelsen blev nægtet.
Tilladelser til tabel og visning
Tabeller og visninger repræsenterer de objekter, som der kan tildeles tilladelser til i en database. I disse tabeller og visninger kan du desuden begrænse de kolonner, der er tilgængelige for en given sikkerhedsprincipal (bruger eller logon). SQL Server og Azure SQL Database omfatter også sikkerhed på rækkeniveau, som kan bruges til yderligere at begrænse adgangen.
| Tilladelse | Definition |
|---|---|
SELECT |
Giver brugeren mulighed for at få vist dataene i objektet (tabel eller visning). Når brugeren afvises, forhindres den i at få vist dataene i objektet. |
INSERT |
Gør det muligt for brugeren at indsætte data i objektet. Når brugeren afvises, forhindres den i at indsætte data i objektet. |
UPDATE |
Gør det muligt for brugeren at opdatere data i objektet. Når brugeren afvises, forhindres den i at opdatere data i objektet. |
DELETE |
Giver brugeren mulighed for at slette data i objektet. Når brugeren afvises, forhindres den i at slette data fra objektet. |
Azure SQL Database og Microsoft SQL Server har andre tilladelser, som kan tildeles, tilbagekaldes eller afvises efter behov.
| Tilladelse | Definition |
|---|---|
CONTROL |
Giver alle rettigheder til objekterne. Den gør det muligt for den bruger, der har denne tilladelse, at udføre en hvilken som helst handling mod objektet, herunder at slette objektet. |
REFERENCES |
Giver brugeren mulighed for at få vist de fremmede nøgler i objektet. |
TAKE OWNERSHIP |
Giver brugeren mulighed for at overtage ejerskabet af objektet. |
VIEW CHANGE TRACKING |
Giver brugeren mulighed for at få vist indstillingen for ændringssporing for objektet. |
VIEW DEFINITION |
Giver brugeren mulighed for at få vist definitionen af objektet. |
Funktions- og lagrede proceduretilladelser
På samme måde som tabeller og visninger har funktioner og lagrede procedurer flere tilladelser, som kan tildeles eller afvises.
| Tilladelse | Definition |
|---|---|
ALTER |
Giver brugeren mulighed for at ændre definitionen af objektet. |
CONTROL |
Giver brugeren alle rettigheder til objektet. |
EXECUTE |
Giver brugeren mulighed for at udføre objektet. |
VIEW CHANGE TRACKING |
Giver brugeren mulighed for at få vist indstillingen for ændringssporing for objektet. |
VIEW DEFINITION |
Giver brugeren mulighed for at få vist definitionen af objektet. |
UDFØR SOM
Kommandoerne EXECUTE AS [user name], eller EXECUTE AS [login name] (kun tilgængelig i SQL Server og Azure SQL Managed Instance) gør det muligt at ændre brugerkonteksten. Efterhånden som efterfølgende kommandoer og sætninger udføres ved hjælp af den nye kontekst med de tilladelser, der er tildelt den pågældende kontekst.
Hvis en bruger har en tilladelse, og brugeren ikke længere behøver at have denne tilladelse, kan tilladelser fjernes (enten tildeler eller afviser) ved hjælp af kommandoen REVOKE. Kommandoen tilbagekald fjerner tilladelserne GRANT eller DENY for den rettighed, der er angivet for den angivne bruger.
Ejerskabskæder
Et begreb kaldet sammenkædning gælder for tilladelser, som giver brugerne mulighed for at nedarve tilladelser fra andre objekter. Det mest almindelige eksempel på sammenkædning er en funktion eller en lagret procedure, der får adgang til en tabel under udførelsen. Hvis proceduren har samme ejer som tabellen, kan den lagrede procedure udføres og få adgang til tabellen, selvom brugeren ikke har rettigheder til at få direkte adgang til tabellen. Denne adgang er tilgængelig, fordi brugeren arver rettighederne til at få adgang til tabellen fra den lagrede procedure, men kun under udførelsen af den lagrede procedure og kun inden for rammerne af udførelsen af de lagrede procedurer.
I eksemplet skal du køre som databaseejer eller serveradministrator, oprettes en ny bruger og tilføjes som medlem af en ny SalesReader-rolle , som derefter tildeles tilladelse til at vælge fra et hvilket som helst objekt og udføre en hvilken som helst procedure i salgsskemaet. Der oprettes derefter en lagret procedure i skemaet Salg, der får adgang til en tabel i produktionsskemaet.
I eksemplet ændres indholdet, så det bliver den nye bruger, og det forsøges at vælge direkte fra tabellen i produktionsskemaet.
USE AdventureWorks2016;
GO
CREATE USER [DP300User1] WITH PASSWORD = 'Pa55.w.rd';
GO
CREATE ROLE [SalesReader];
GO
ALTER ROLE [SalesReader] ADD MEMBER [DP300User1];
GO
GRANT SELECT, EXECUTE ON SCHEMA::Sales TO [SalesReader];
GO
CREATE OR ALTER PROCEDURE Sales.DemoProc
AS
SELECT P.Name,
SUM(SOD.LineTotal) AS TotalSales,
SOH.OrderDate
FROM Production.Product P
INNER JOIN Sales.SalesOrderDetail SOD ON (SOD.ProductID = P.ProductID)
INNER JOIN Sales.SalesOrderHeader SOH ON (SOH.SalesOrderID = SOD.SalesOrderID)
GROUP BY P.Name,
SOH.OrderDate
ORDER BY TotalSales DESC;
GO
EXECUTE AS USER = 'DP300User1';
SELECT P.Name,
SUM(SOD.LineTotal) AS TotalSales,
SOH.OrderDate
FROM Production.Product P
INNER JOIN Sales.SalesOrderDetail SOD ON (SOD.ProductID = P.ProductID)
INNER JOIN Sales.SalesOrderHeader SOH ON (SOH.SalesOrderID = SOD.SalesOrderID)
GROUP BY P.Name,
SOH.OrderDate
ORDER BY TotalSales DESC;
Forespørgslen resulterer i en fejl, som brugeren DP300User1 ikke har SELECT tilladelse til, fordi den rolle, som brugeren tilhører, ikke har nogen rettigheder i produktionsskemaet. Nu kan vi prøve at udføre den lagrede procedure:
EXECUTE AS USER = 'DP300User1';
EXECUTE Sales.DemoProc;
DP300User1-brugeren har EXECUTE tilladelse til den lagrede procedure i salgsskemaet, fordi brugerens rolle har EXECUTE tilladelse til salgsskemaet. Da tabellen har samme ejer som proceduren, har vi en ubrudt ejerskabskæde, og udførelsen lykkes, og resultaterne returneres.
Ændringer af tilladelser gælder ikke, når dynamisk SQL bruges i lagrede procedurer. Årsagen til, at dynamisk SQL ødelægger tilladelseskæden, er, at den dynamiske SQL udføres uden for konteksten for den lagrede procedure for kald. Du kan se denne funktionsmåde ved at ændre den lagrede procedure, så den udføres ved hjælp af dynamisk SQL på følgende måde.
CREATE OR ALTER PROCEDURE Sales.DemoProc
AS
DECLARE @sqlstring NVARCHAR(MAX)
SET @sqlstring = '
SELECT P.Name,
SUM(SOD.LineTotal) AS TotalSales,
SOH.OrderDate
FROM Production.Product P
INNER JOIN Sales.SalesOrderDetail SOD ON (SOD.ProductID = P.ProductID)
INNER JOIN Sales.SalesOrderHeader SOH ON (SOH.SalesOrderID = SOD.SalesOrderID)
GROUP BY P.Name, SOH.OrderDate'
EXECUTE sp_executesql @sqlstring
GO
--
EXECUTE AS USER = 'DP300User1'
EXECUTE Sales.DemoProc
DP300User1-brugeren får vist en fejl om, at brugeren ikke har SELECT tilladelse til tabellen Production.Product, ligesom brugeren forsøgte at udføre forespørgslen direkte. Tilladelseskæder gælder ikke, og den brugerkonto, der udfører den dynamiske SQL, skal have rettigheder til de tabeller og visninger, der bruges af koden i den dynamiske SQL.
Princippet om mindste rettighed
Princippet om mindste rettighed er ret simpelt. Den grundlæggende idé bag konceptet er, at brugere og programmer kun skal have de tilladelser, der er nødvendige for, at de kan fuldføre opgaven. Programmer bør kun have tilladelser, som de skal gøre for at fuldføre den opgave, der er ved hånden.
Hvis et program f.eks. får adgang til alle data via lagrede procedurer, bør programmet kun have tilladelse til at udføre de lagrede procedurer uden adgang til tabellerne.
Dynamisk SQL
Dynamisk SQL er et koncept, hvor en forespørgsel bygges programmatisk. Dynamisk SQL gør det muligt at generere T-SQL-sætninger i en lagret procedure eller en forespørgsel.
SELECT 'BACKUP DATABASE ' + name + ' TO DISK =''\\backup\sql1\' + name + '.bak'''
FROM sys.databases
Sætningen genererer en liste over T-SQL-sætninger for at sikkerhedskopiere hele databasen på serveren. Denne genererede T-SQL udføres typisk ved hjælp af sp_executesql eller overføres til et andet program, der skal udføres.