Verwalten von Berechtigungen und sicherem Zugriff

Abgeschlossen

Berechtigungen auf Objektebene steuern, welche Aktionen Benutzer für Datenbankobjekte wie Tabellen, Ansichten, gespeicherte Prozeduren und Funktionen ausführen können. Während Row-Level Sicherheitsdaten innerhalb von Objekten filtert, bestimmen Berechtigungen auf Objektebene, ob ein Benutzer überhaupt auf ein Objekt zugreifen kann und welche Vorgänge ausgeführt werden können.

Ein gut gestaltetes Berechtigungsmodell geht hand in Hand mit sicherer Authentifizierung. In dieser Einheit werden beide Themen behandelt: wie Sie die richtigen Berechtigungen erteilen und sicherstellen können, dass Benutzer sich sicher authentifizieren, vorzugsweise ohne Kennwörter.

Verständnis der Berechtigungshierarchie

SQL Server verwendet ein hierarchisches Berechtigungsmodell , bei dem Berechtigungen, die auf höheren Ebenen gewährt wurden, auf niedrigeren Ebenen fließen. Stellen Sie sich sie als Kaskade vor: Server → Datenbank → Schema → einzelnen Objekten.

Auf Serverebene steuern Berechtigungen die Anmeldeverwaltung und Die Serverkonfiguration. Berechtigungen auf Datenbankebene steuern Aktionen innerhalb einer bestimmten Datenbank. Berechtigungen auf Schemaebene gelten für alle Objekte innerhalb eines Schemas, während Berechtigungen auf Objektebene auf bestimmte Tabellen, Ansichten oder Prozeduren abzielen.

Hier ist ein leistungsfähiges Muster: Wenn Sie berechtigungen für ein Schema erteilen SELECT , können Benutzer aus allen Tabellen und Ansichten in diesem Schema auswählen, einschließlich der in Zukunft erstellten Objekte:

-- Grant SELECT on all objects in the Sales schema
GRANT SELECT ON SCHEMA::Sales TO SalesAnalyst;

-- Grant EXECUTE on all procedures in the Reports schema
GRANT EXECUTE ON SCHEMA::Reports TO ReportingUsers;

Erteilen und Widerrufen von Berechtigungen

Drei Anweisungen steuern Berechtigungen: GRANT erteilt Benutzern spezifische Berechtigungen, REVOKE entfernt zuvor erteilte Berechtigungen, und DENY blockiert Berechtigungen explizit - und setzt dabei alle erteilten Berechtigungen außer Kraft.

-- Allow reading data
GRANT SELECT ON dbo.Customers TO CustomerServiceRole;

-- Allow data modifications
GRANT INSERT, UPDATE ON dbo.Orders TO OrderProcessingRole;

-- Explicitly deny access to sensitive data (overrides any grants)
DENY SELECT ON dbo.EmployeeSalaries TO HRAssistants;

-- Remove a permission without explicitly denying it
REVOKE INSERT ON dbo.Customers FROM CustomerServiceRole;

Was ist der Unterschied zwischen REVOKE und DENY? Es ist wichtig, wenn Benutzer über mehrere Berechtigungsquellen verfügen. Durch das Widerrufen wird eine Erteilung entfernt, aber der Zugriff über andere Finanzhilfen wird nicht verhindert. Das Verweigern des Zugriffs blockiert unabhängig davon, welche anderen Zuschüsse vorhanden sind.

Implementieren der rollenbasierten Zugriffssteuerung

Anstatt Benutzern Berechtigungen direkt zu gewähren, erstellen Sie Datenbankrollen , die Auftragsfunktionen darstellen. Weisen Sie Rollen Berechtigungen zu, und fügen Sie dann Benutzer zu den entsprechenden Rollen hinzu:

-- Create roles for different job functions
CREATE ROLE DataReaders;
CREATE ROLE DataWriters;

-- Grant appropriate permissions to each role
GRANT SELECT ON SCHEMA::dbo TO DataReaders;
GRANT INSERT, UPDATE, DELETE ON SCHEMA::dbo TO DataWriters;

-- Add users to roles
ALTER ROLE DataReaders ADD MEMBER JohnSmith;
ALTER ROLE DataWriters ADD MEMBER JaneDoc;

Sie können Rollen auch verschachteln, um hierarchische Berechtigungsstrukturen zu erstellen. Wenn Sie einer übergeordneten Rolle eine Person hinzufügen, erhält sie automatisch die Berechtigungen aller untergeordneten Rollen.

Tipp

Dokumentieren Sie Ihre Rollenhierarchie, und verwenden Sie eine Benennungskonvention, die den Zweck der einzelnen Rollen deutlich macht, z. B. das Präfix mit der Abteilung oder Funktion.

Anwenden der Schematrennung für Sicherheit

Schemas bieten eine natürliche Möglichkeit zum Organisieren von Objekten und Verwalten von Berechtigungen. Gruppieren Sie verwandte Objekte zusammen, und erteilen Sie dann Berechtigungen auf Schemaebene:

CREATE SCHEMA Sales AUTHORIZATION dbo;
CREATE SCHEMA HR AUTHORIZATION dbo;

-- Sales team can read and write sales data
GRANT SELECT, INSERT, UPDATE ON SCHEMA::Sales TO SalesTeam;

-- HR has full control of their schema
GRANT CONTROL ON SCHEMA::HR TO HRAdministrators;

Konfiguration der Microsoft Entra-Authentifizierung

Moderne Anwendungen sollten möglichst kennwortlose Authentifizierung verwenden. Die Authentifizierung durch Microsoft Entra eliminiert die Risiken der Kennwortverwaltung, wie etwa den Diebstahl von Anmeldeinformationen und die operative Belastung durch die Rotation von Geheimnissen.

SQL-Datenbanken unterstützen mehrere Authentifizierungsmethoden. Die SQL-Authentifizierung verwendet einen Benutzernamen und ein Kennwort, das in der Datenbank gespeichert ist. Es ist einfach, aber riskant, wenn Anmeldeinformationen kompromittiert werden. Die Microsoft Entra-Authentifizierung erweitert die Identitätsintegration auf Cloudszenarien und arbeitet mit Azure SQL-Datenbank, Azure SQL Managed Instance, SQL Server 2022+ und SQL-Datenbanken in Microsoft Fabric.

Das Erstellen von Datenbankbenutzern aus Microsoft Entra-Identitäten ist einfach:

-- Create users for Entra accounts, managed identities, or groups
CREATE USER [app-service-identity] FROM EXTERNAL PROVIDER;
CREATE USER [developer@contoso.com] FROM EXTERNAL PROVIDER;
CREATE USER [DataAnalystsGroup] FROM EXTERNAL PROVIDER;

-- Grant permissions just like SQL users
ALTER ROLE db_datareader ADD MEMBER [developer@contoso.com];
ALTER ROLE db_datawriter ADD MEMBER [app-service-identity];

Implementieren der verwalteten Identitätsauthentifizierung

Verwaltete Identitäten sind die sicherste Option für von Azure gehostete Anwendungen. Azure verarbeitet den Identitätslebenszyklus automatisch, und es gibt keine Anmeldeinformationen, die verloren gehen oder gestohlen werden können.

Aktivieren Sie für einen Azure App Service, der eine Verbindung mit azure SQL-Datenbank herstellt, die vom System zugewiesene verwaltete Identität, und erstellen Sie dann einen Datenbankbenutzer:

CREATE USER [MyWebApp] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [MyWebApp];
ALTER ROLE db_datawriter ADD MEMBER [MyWebApp];

Aktualisieren Sie ihre Anwendungsverbindungszeichenfolge, um die verwaltete Identitätsauthentifizierung zu verwenden:

Server=tcp:myserver.database.windows.net,1433;Database=mydb;Authentication=Active Directory Managed Identity;Encrypt=True;

Tipp

Verwenden Sie vom Benutzer zugewiesene verwaltete Identitäten, wenn mehrere Anwendungen dieselben Datenbankberechtigungen benötigen. Dadurch wird die Anzahl der Zu verwaltenden Datenbankbenutzer reduziert.

Sichere Verbindungszeichenfolgen

Unabhängig davon, welche Authentifizierungsmethode Sie verwenden, schützen Sie Ihre Verbindungszeichenfolgen mit den folgenden bewährten Methoden:

  • Speichern Sie sie in Azure Key Vault- oder Umgebungsvariablen, nicht im Code
  • Verwenden von verwalteten Identitäten, um Anmeldeinformationen vollständig aus Verbindungszeichenfolgen zu entfernen
  • Aktivieren von verschlüsselten Verbindungen mit Encrypt=True;TrustServerCertificate=False
  • Beschränken des Netzwerkzugriffs mithilfe von Firewallregeln und privaten Endpunkten

Von Bedeutung

Wenn Sie Client-Geheimnisse für Dienstprinzipalen verwenden, speichern Sie sie im Azure Key Vault und rotieren Sie sie regelmäßig. Die zertifikatbasierte Authentifizierung bietet eine stärkere Sicherheit als freigegebene geheime Schlüssel.

Anzeigen und Prüfen von Berechtigungen

Sie können Systemansichten abfragen, um aktuelle Berechtigungszuweisungen zu verstehen:

-- View all permissions for a specific principal
SELECT 
    prin.name AS PrincipalName,
    perm.permission_name,
    perm.state_desc AS PermissionState,
    obj.name AS ObjectName
FROM sys.database_permissions perm
INNER JOIN sys.database_principals prin ON perm.grantee_principal_id = prin.principal_id
LEFT JOIN sys.objects obj ON perm.major_id = obj.object_id
WHERE prin.name = 'SalesAnalyst';

-- Check effective permissions for the current user
SELECT * FROM fn_my_permissions('Sales.Orders', 'OBJECT');

Machen Sie es sich gewohnt, Berechtigungszuweisungen regelmäßig zu überwachen, um sicherzustellen, dass sie immer noch mit den aktuellen Stellenfunktionen übereinstimmen. Und denken Sie daran, dass Berechtigungen auf Objektebene am besten funktionieren, wenn sie mit anderen Sicherheitsfeatures wie Row-Level Sicherheit und dynamischer Datenmaske kombiniert werden, um umfassenden Schutz zu gewährleisten.