Sie sind auf Seite 1von 31

Dominick Baier

Jörg Neumann

SQL Server Security


für Entwickler
thinktecture
• Wir unterstützen Software-Entwickler und Architekten
bei der Realisierung von .NET- und Web Services-
Projekten

• Dominick Baier
– Meine Spezialgebiete sind Sicherheit in verteilten
Anwendungen, Identitäts-Management sowie die Windows/.NET
Sicherheits-APIs und Technologien
• Jörg Neumann
– Meine Spezialgebiete sind Client-Technologien,
Datenbankdesign und Optimierung, sowie Datenzugriff auf Basis
von .NET und SQL Server.

• dominick.baier@thinktecture.com
• joerg.neumann@thinktecture.com
Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]
Sicherheits-Anforderungen an
Daten
• Vertraulichkeit
• Integrität
• Authentizität

• …oder im Risikomodell
– Tampering
– Information Disclosure
– Spoofing / Non-Repudiation
Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]
Angriffe auf Daten
• Unautorisierte physikalische Zugriffe
– Zugriff auf das System
– Sicherungs-Kopien
– Administratoren
• Unautorisierte Netzwerk-Zugriffe
– Sicherheits-Lücken im Front-End
– Schwächen in Zugriffs-Kontrolle
– Klar-Text Connection Strings
– Lesen/Manipulation von Netzwerk-Verkehr

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Authenti-
fizierung

Developer

Speicher- SQL Berechtig-


ungs-
sicherheit
Server steuerung

Administrator

Transport-
sicherheit

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Principals
Windows

Local User Domain User Domain Group


• bulkadmin
SQL Server • dbcreator
• diskadmin
• processadmin
Windows Login SQL Server Login• db_accessadmin
Server Role
• db_backupoperator• securityadmin
• db_datareader • serveradmin
Database
• db_datawriter • setupadmin
• db_ddladmin • sysadmin
Database User Database Role • db_denydatareader
Application Role
• db_denydatawriter
• db_owner
• db_securityadmin

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Securables
• Tabellen
• Views
• Functions
• Procedures
• Schemas
• SSIS Packages

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Permissions
• GRANT, DENY, REVOKE
– SELECT
– INSERT
– UPDATE
– DELETE
– CREATE
– ALTER
– EXECUTE

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


User

Create Database
Create Table

Bob
Bob.MyDatabase

dbo.XYDatabase

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Schema

Create Database
Create Table

Bob

SalesSchema.DatabaseA
GRANT SELECT…

Sales
Schema
SalesSchema.DatabaseB

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Schemas
• Vollqualifizierter Objektbezeichner
server.database.schema.object
• Wurde kein Schema angegeben, wird das
Standardschema dbo verwendet
• Schema-Owner kann sowohl ein Benutzer,
als auch eine Rolle sein!
• Owner hat automatisch Berechtigung auf
alle enthaltenen Objekte
Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]
Schemas verwalten
• Schema anlegen
CREATE SCHEMA MySchema
AUTHORIZATION Bob;

• Owner ändern
ALTER AUTHORIZATION
ON SCHEMA::MySchema TO Bill;

• Berechtigungen verwalten
GRANT SELECT ON SCHEMA::MySchema TO Tom;
REVOKE SELECT ON SCHEMA::MySchema TO Tom;

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Schemas verwalten
• Objektberechtigung geht vor Schema
GRANT SELECT ON SCHEMA::Person TO Tom;
DENY SELECT ON Person.Contact TO Tom;

• Standardschema zuweisen (Default: dbo)


ALTER USER Tom
WITH DEFAULT_SCHEMA = MySchema;

• Standardschema ermitteln
SELECT default_schema_name
FROM sys.database_principals
WHERE name = 'Bob';

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Schema-Berechtigungen
• CREATE • UPDATE
• ALTER • DELETE
• DROP • INSERT
• CONTROL • TAKE OWNERSHIP
• CONNECT • VIEW DEFINITION
• SELECT • BACKUP
• EXECUTE

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Vorteile
• Über Rollen oder AD-Gruppen können
mehrere Benutzer ein Schema besitzen
• Mehrere Benutzer können dem selben
Schema zugeordnet sein
• Das Löschen von Benutzern ist einfacher
• Gruppierung von Objekten nach
Organisation oder Anwendung
• Leichtere Berechtigungssteuerung
Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]
Nützliche Hilfen
• sys.fn_mypermissions()
Listet die Berechtigungen des Users

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Sicherheits-Lücken im
Front-End
• Viele Datenbank-Sicherheitslücken
werden durch das Front-End verursacht
– SQL Injection
– Klartext-Connection Strings

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Connection Strings und Logins
• Wie kann man Klartext-Passwörter
vermeiden?
– Umsteigen auf Windows Logins
– Verschlüsseln des Connection Strings
• Server oder Client?

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Umsteigen auf Windows Logins

Network Service

Domain\Bob

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Umsteigen auf Windows Logins

MachineA\App
Server\App
Server\Bob

MachineA\Bob

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Manuelle Windows
Authentifizierung
IntPtr token = IntPtr.Zero;
NativeMethods.LogonUser("Server", "Account",
"Passwort",
LogonType.LOGON32_LOGON_NEW_CREDENTIALS,
ProviderType.LOGON32_PROVIDER_DEFAULT,
out token);

using (WindowsIdentity id = new WindowsIdentity(token)


{
using (id.Impersonate())
{
con = new SqlConnection(connectionstring);
con.Open();
}
}

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Verschlüsseln von Connection
Strings
• Protected Configuration (>= .NET 2.0)
– Provider-basiert
– DPAPI und RSA
– API und Kommandozeilen Tool
(aspnet_regiis.exe)

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


SQL Injection
Kontroll-Kanal Daten-Kanal

SELECT userID
FROM users input1 = dominick
WHERE username = 'input1' input2 = geheim
AND password = 'input2'

SELECT userID
FROM users
WHERE username = 'dominick'
AND password = 'geheim'
SQL Injection
Kontroll-Kanal Daten-Kanal

SELECT userID
FROM users input1 = dominick' --
WHERE username = 'input1' input2 = egal
AND password = 'input2'

SELECT userID
FROM users
WHERE username = 'dominick'
--' AND password = 'egal'
Gegenmaßnahmen
• Niemals SQL Statements selbst
„zusammenbauen“
– Parametrisierte Queries mit SqlCommand
anstatt
– Stored Procedures
– LINQ to SQL
EXECUTE AS
• Ausführen von Code in einem
dedizierten Sicherheitskontext
– Stored Procedures
– Functions (Ausnahme: Inline Table-Value Functions)
– Triggers
– Sessions

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


EXECUTE AS
in SPs, UDFs, Triggers
• EXECUTE AS CALLER (Standard)
Ausführung im Kontext des aufrufenden Users
• EXECUTE AS SELF
Ausführung im Kontext des Erstellers
• EXECUTE AS OWNER
Ausführung im Kontext des Besitzers
• EXECUTE AS 'user'
Ausführung im Kontext des angegebenen
Users oder Logins
Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]
Verwendung
in Prozedur

CREATE PROCEDURE MyProc


WITH EXECUTE AS OWNER
AS
SELECT m.ID, s.Text
FROM MyTable AS m
INNER JOIN SecureTable AS s
ON m.ID = s.ID

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


EXECUTE AS
in Sessions
• EXECUTE AS CALLER (Standard)
Ausführung im Kontext des aufrufenden Users
• EXECUTE AS USER = 'user'
Ausführung im Kontext des angegebenen Users
• EXECUTE AS LOGIN = 'login'
Ausführung im Kontext des angegebenen Logins
• Für den Kontextwechsel wird das IMPERSONATE-
Recht benötigt

Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]


Dominick Baier [www.LeastPrivilege.com] | Jörg Neumann [www.HeadWriteLine.BlogSpot.com]
{ In-depth support and consulting for
software architects and developers }
http://www.thinktecture.com/
dominick.baier@thinktecture.com
www.LeastPrivilege.com

joerg.neumann@thinktecture.com
www.HeadWriteLine.BlogSpot.com

31