Tag: "privilege escalation"
New Permissions in SQL Server 2014: IMPERSONATE ANY LOGIN, SELECT ALL USER SECURABLES, CONNECT ANY DATABASE and the old CONTROL SERVER
Apr 26th
(DE) |
(EN) |
Class Desc. |
Permission Name |
Type |
Parent Covering Permission Name |
DATABASE |
ALTER ANY DATABASE EVENT SESSION |
AADS |
ALTER ANY EVENT SESSION |
DATABASE |
KILL DATABASE CONNECTION |
KIDC |
ALTER ANY CONNECTION |
SERVER |
CONNECT ANY DATABASE |
CADB |
|
SERVER |
IMPERSONATE ANY LOGIN |
IAL |
|
SERVER |
SELECT ALL USER SECURABLES |
SUS |
Und wofür und wie können wir diese neuen Berechtigungen auf Server Ebene verwenden?
IMPERSONATE ANY LOGIN
Erinnert Ihr Euch an das Problem mit CONTROL SERVER? Das größte Problem war, das dieses Recht auch die Impersonifizierung eines jeden Kontos, inklusive der Privilegien Erweiterung zum sysadmin erlaubte. Die Details und auch andere Probleme mit CONTROL SERVER habe ich hier umfassend dokumentiert:
SQL Server 2014 gibt uns mit der Einführung der IMPERSONATE ANY LOGIN-Berechtigung Munition, dieses Problem anzugehen. - Diese Berechtigung erlaubt es, jeden Login und User zum impersonieren(!).
Wenn wir dieses mit einem DENY gegenüber dem Principal mit CONTROL SERVER Recht verwenden, verhindert es diesen, irgendeinen Login direkt zu impersonifizieren. (Warum sage ich “direkt”? – Das sehen wir ein Stück weiter unten.) |
So, what for and how can we use those permissions on Server level?
IMPERSONATE ANY LOGIN
Do you remember the problem with CONTROL SERVER?
Now in SQL Server 2014, by introducing the permission IMPERSONATE ANY LOGIN, gives us ammunition to tackle this problem. - This Permission permits to impersonate any Login and User(!).
If we DENY this to the Principal with CONTROL SERVER permission, it prevents him from impersonating any Login directly. (Why do I say “directly”? – We’ll see a bit further down.) So let’s see how to prevent a Login with CONTROL SERVER from elevating privileges by impersonating another login with help of the new permission: |
USE [master]
GO
CREATE LOGIN DBA_TheDude WITH PASSWORD=N'www', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE SERVER ROLE [Role_DBA]
ALTER SERVER ROLE [Role_DBA]
ADD MEMBER DBA_TheDude
GRANT CONTROL SERVER TO [Role_DBA]
GO
DENY IMPERSONATE ANY LOGIN TO [Role_DBA]
GO
CREATE DATABASE ControlServer_Schema_Demo
GO
-- ====================
-- === Test
EXECUTE AS LOGIN = 'DBA_TheDude'
-- Attempt impersonation:
EXECUTE AS LOGIN = 'sa';
-->
Msg 15406, Level 16, State 1, Line 9
Cannot execute as the server principal because the principal "sa" does not exist, this type of principal cannot be impersonated, or you do not have permission.
//
Die Ausführung als Serverprinzipal ist nicht möglich, weil der Prinzipal 'sa' nicht vorhanden ist, für diesen Typ von Prinzipal kein Identitätswechsel möglich ist, oder Sie nicht die erforderliche Berechtigung haben.
USE ControlServer_Schema_Demo
EXECUTE AS USER = 'dbo';
-->
Msg 15517, Level 16, State 1, Line 15
Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.
//
Die Ausführung als Datenbankprinzipal ist nicht möglich, weil der Prinzipal 'dbo' nicht vorhanden ist, für diesen Typ von Prinzipal kein Identitätswechsel möglich ist, oder Sie nicht die erforderliche Berechtigung haben.
Hurra!(?) Privilege-Escalation-Risiko: Wirklich? Immer noch? |
Hooray!(?) Privilege-Escalation-risc: Really? Still?
Still we are running under the context of DBA_TheDude: |
USE master;
CREATE LOGIN UtilizeMe WITH PASSWORD=N'www', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
GRANT CONTROL SERVER TO UtilizeMe
GO
Wir können den Login “UtilizeMe” nicht impersonifizieren, aber wir können und einfach mit seinem Passwort anmelden! - Nebenbei ein weiterer Grund, SQL Authentifizierung nicht zu verwenden, da er ansonsten die Credentials eines validen Windows-Login’s finden müsste – viel schwieriger, als einfach seinen eigenen Backdoor-account anzulegen. |
We cannot Impersonate the “UtilizeMe” Login, but we can just Log On using his password! - Another reason to not use SQL authentication by the way, as he would then need to find a valid Windows-Login’s Credentials – much harder to just creating his own backdoor-account.
|
Um also unseren Administrator wirklich daran zu hindern, seine Privilegien zum Sysadmin zu erweitern, müssen wir auch mit DENY ALTER ANY LOGIN und ALTER ANY SERVER ROLE arbeiten. |
So in order to further prevent our Administrator from elevating privileges to sysadmin, we also need to work with DENY ALTER ANY LOGIN and ALTER ANY SERVER ROLE. |
Und kann DANN CONTROL SERVER endlich sicher verwendet werden? NEIN!
Tatsächlich gibt es noch ein paar andere Dinge, die man tun kann, um die Berechtigungen von einem CONTROL SERVER-berechtigten Konto zu erweitern. Etwas trickreicher vielleicht, aber ein Angreifer mit einem guten Wissen über SQL Server (ich spreche also nicht von „Raketenwissenschaft“), wird in der Lage sein soetwas durchzuführen. Mir ist bewusst, dass das “Separation of Duties in SQL Server 2014”-Whitepaper (Enthalten im Microsoft® SQL Server® 2014 Product Guide) die Kombination von GRANT CONTROL SERVER + DENY IMPERSONATE ANY tatschlich als Best Practice listet, aber dennoch…
Also, empfehle ich die Verwendung in irgendeiner Weise? Leider ist es jedoch weit davon entfernt, perfekt zu sein, und in Sicherhit-belangen, alles, was nicht lupenrein ist, ist ein Risiko. Wer das also anstelle von sa/sysadmin verwendet, verdient dennoch Applaus, da es zeigt, dass man sich kümmert und es wagt, Berechtigungen einzuschränken. |
Can we THEN finally use CONTROL SERVER completely safely?
NO!
In fact there are a few other things one can do to elevate permissions from a CONTROL SERVER-permitted account. More tricky in a way, but an attacker with some good knowledge about SQL Server (note, I am not saying “rocket-scientist”) will be able to do that. I am aware that the “Separation of Duties in SQL Server 2014”-Whitepaper (Contained in the Microsoft® SQL Server® 2014 Product Guide) does in fact list the combination of GRANT CONTROL SERVER + DENY IMPERSONATE ANY LOGIN as a best practice, but yet…
So do I recommend using it in any way? That is a hard question for me personally, as I would like to see much less people using/granting sa/sysadmin for daily tasks, and this permission had the potential to make an end to it. Unfortunately it is far from perfect, and in security-terms, anything not flawless, is a risk. But in terms of getting people away from using the highest privileges from the very beginning, I do see it as a step, since many may just not have the time and skills to break out of it. I do recommend using it in combination with some solid Auditing and alerts in place. |
SELECT ALL USER SECURABLES
Was sicherer ist, ist die Verwendung für eine Art Auditor, der ALLE Daten lesen (aber nicht ändern) können soll – ohne den Aufwand, in sämtlichen Nutzerdatenbanken Benutzer und Rechte zu vergeben. |
SELECT ALL USER SECURABLES
What’s more safe, is the use for an Auditor that needs to read ALL data, but not change it - without the effort of creating users and permissions in all user databases. |
CONNECT ANY DATABASE
Diese Berechtigung kann gut für Logins verwendet werden, die sich im Wesentlichen mit jeder Datenbank verbinden können and zum Beispiel Code Reviews durchführen sollen – indem man diese mit der VIEW ANY DEFINITION Berechtigung kombiniert. |
CONNECT ANY DATABASE
This permission can be used quite well for having logins that can basically connect to any database and for example do code reviews - by combining it with the VIEW ANY DEFINITION permission. |
Happy “Server controlling”,
Andreas
DISABLE and DENY LOGIN, DENY USER & Effect on Impersonation and Permissions
Mar 7th
DISABLE und DENY LOGIN, DENY USER & Effekt auf Impersonierung und Berechtigungen
(de) |
(en) |
Immer mal wieder kann man beobachten, dass Logins oder Usern die Connect-Berechtigung verboten bekommen wurde, oder ein Login deaktiviert wurde. Die richtige Erwartung und Verständnis kann daher kritisch sein. Sehen wir uns also eine einfache Demo an: |
Every once in a while one can observe that Logins or Users have been denied the Connect permission or a Login has been disabled. Therefore a correct expectation and understanding can be critical. So let’s see a simple demo: |
Ich deaktiviere also das sa-Konto ebenso wie das „DeniedLogin“-Konto – letzterem verbiete ich außerdem die Connect-Berechtigung (Erinnern wir uns daran: „Berechtigungen können nicht für sa, dbo, Entitäts-Besitzer, information_schema, sys oder für den Benutzer selbst erteilt, verweigert oder aufgehoben werden.“) Der Datenbank-User „SQLUser“ bekommt die Connect-Berechtigung auf die Datenbank verboten. |
So I am disabling the sa-account as well as the “DeniedLogin”-Account – the latter I also Deny the Connect permission (Remember we “Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.”) The Database-User “SQLUser” gets denied the Connect permission on the database. In the GUI the result looks like this: |
Nun führen wir 4 Tests durch: |
Now let’s run 4 tests. |
Was diese Abfragen im Wesentlichen machen, ist, zu versuchen, den entsprechenden Login oder User zu impersonieren – und den Erfolg dadurch belegen, dass sie die dann jeweils aktiven Rollen-Mitgliedschaften zurückgeben. |
So essentially what those queries do, is trying to impersonate the respective Login or User – and proofing success by returning the then respective active role-memberships. Results: |
DeniedLogin: Impersonierung funktioniert + kein Verlust an Berechtigungen. |
DeniedLogin: Impersonation works + No loss of permissions. |
Dasselbe gilt für den sa: Impersonierung funktioniert + kein Verlust a Berechtigungen. Im Folgenden ein Test für den User, dem die Connect-Berechtigung auf die Datenbank entzogen worden ist – und nicht als Login verwendet werden kann. |
Same applies for sa: Impersonation works + No loss of permissions. In the following test for the User which has been denied the Connect-permission onto the database – and cannot be used as a Login. |
Ergebnisse: |
Results: Msg 15517, Level 16, State 1, Line 3 Cannot execute as the database principal because the principal "DeniedLogin" does not exist, this type of principal cannot be impersonated, or you do not have permission. Msg 916, Level 14, State 1, Line 3 The server principal "S-1-9-3-4049223906-1289824279-1154161590-488313048." is not able to access the database "ImpersonateLogin" under the current security context. |
Das Ergebnis ist für beide Datenbank-User effektiv das gleiche. Die GUID repräsentiert keinen reellen Server-Prinzipal, denn der User SQLUser hat keinen entsprechenden Login. Der Unterschied für den 2. User ist, dass dieser User nur innerhalb der Datenbank existiert, aber zugleich expliziert verboten wurde, sich mit ihr zu verbinden Das hat im Endeffekt dasselbe Resultat, wie ihn zu deaktivieren – genau wie der Guest-User es ist. |
The GUID does not represent a real server-principal, because the User SQLUser does not have a matching Login. The difference for the second user is, that this user only exists inside the database but at the same time has been explicitly denied to connect to it. This has essentially the same result as “disabling” it – just as the guest-user is. |
Damit wäre gezeigt, dass das Deaktivieren von Logins keinerlei Sicherheit gegenüber Angriffen von Innen gibt. Und sogenannte Privilegien Erweiterung findet in aller Regel z.B. von innen heraus statt. Auch der alte „Trick“, die Standard-Datenbank des Logins zu löschen, ist da keine Hilfe. Für Datenbank-User hat es durchaus Effekt und verhindert das Anmelden an der jeweiligen Datenbank – auch „von Innen heraus“.
|
Thereby it is shown, that disabling of Logins does not give any security against attacks from inside. And so-called privilege elevation (/-escalation) usually takes part from internal. Also the old “trick”, to drop the default-database of a Login, is of little help. For database-users is indeed does have an effect and prevents logon/connect to the respective database – also “from inside”. |
Konsequenterweise bleiben alle Berechtigungen (natürlich abgesehen von dem jeweiligen Deny) der jeweiligen Logins und User absolut unbeeinflusst von einer Deaktivierung jeglicher Weise. Das gilt auch im Zusammenhang mit „External Access“-Berechtigung für Logins basierend auf asymmetrischen Schlüsseln. ALTER LOGIN ist auch hier in BOL erklärt: technet.microsoft.com/en-us/library/ms189828.aspx
Ich hoffe, diese Dinge erklären einiges und speziell Empfehlungen in Sicherheits-Aspekten. |
Consequentially all permissions (besides the one denied of course) of the respective Login and User stay totally unaffected by and method of deactivation. This is also true in the context of “external access”-permission for Logins based on asymmetric keys. ALTER LOGIN is also explained in BOL here: technet.microsoft.com/en-us/library/ms189828.aspx
I hope those things clarified some things and especially recommendations in security-matters |
Happy securing
Andreas
Security-Session: “SQL Server under Attack” this November @ SQL Rally Amsterdam – privilege elevation, DoS-attack via SQL Injection and more.. live action
Oct 11th
Sicherheits-Vortrag “SQL Server under Attack” diesen November @ SQL Rally Amsterdam – Privilegienerweiterung, DoS-Attack via SQL Injection und mehr.. live Action
(de) - Da ich dieses Jahr auf bereits 7 Konferenzen gesprochen habe, inklusive 1,5 Tagen PreCon (www.andreas-wolter.com/sql-conferences/sql-conferences-2013.htm ) + 3 noch aufkommende Konferenzen (PASS Summit Charlotte USA, TechNet Berlin Germany, PASS Camp Darmstadt Germany), sind 11 Konferenzen 2013 wirklich eine Menge. Auch wenn man bedenkt, dass meine Kunden doch hin und wieder ganz froh sind, wenn ich Zeit für sie habe :-). |
(en) - Having spoken at already 7 conference this year, including 1.5 days of PreCon (www.andreas-wolter.com/sql-conferences/sql-conferences-2013.htm ) + 3 more coming up (PASS Summit Charlotte USA, TechNet Berlin Germany, PASS Camp Darmstadt Germany), 11 conferences in 2013 really is a lot. Also considering once in a while my customers are actually happy if I have time for them :-). |
SQL Rally Amsterdam bietet eine Auswahl von 5 (!) hochwertigen PreCons am 6. Nov. und 3 parallelen Vortrags-Tracks am 7.-8. Nov. an: BI Platform Architecture, Development and Administration, Enterprise Database Administration and Deployment, Database and Application Development mit vielen bekannten internationalen Sprechern, MCMs und MVPs.
Ich selber werde “SQL Attack(ed)” – SQL Server Under Attack präsentieren. Ein demo-geladener Sicherheits-Vortrag mit 2 neu-entwickelten Privilegienerweiterung und DoS-Attack Techniken, ausgeführt via SQL-Injection, in den Hauptrollen, die ich persönlich diesen Sommer in Vorbereitung auf den SQLSaturday Germany/Rheinland entwickelt habe und auch schon auf dem SQLSaturday in Istanbul gezeigt habe. Wer also einige Gründe, Sicherheits-Maßnahmen ernst zu nehmen, live und in Aktion sehen möchte: schaut vorbei! |
SQL Rally Amsterdam offers a choice of 5 (!) real high quality PreCons on Nov. 6th and 3 parallel session tracks on Nov. 7th-8th.: BI Platform Architecture, Development and Administration, Enterprise Database Administration and Deployment, Database and Application Development with many well-known international speakers, MCMs and MVPs.
I will be presenting “SQL Attack(ed)” – SQL Server Under Attack. A demo-loaded security session featuring 2 newly developed privilege elevation and DoS-attack techniques, executed via SQL-Injection, that I personally developed this summer in preparation of SQLSaturday Germany/Rheinland and also shown at SQLSaturday in Istanbul. So if you want to see some reasons for taking security measures like permissions serious, live and in action, check it out! |
CU in Amsterdam
Andreas
CONTROL SERVER vs. sysadmin/sa: permissions, system procedures, DBCC, automatic schema creation and privilege escalation - caveats
Aug 1st
CONTROL SERVER gegen Sysadmin/sa: Berechtigungen, Systemprozeduren, DBCC, automatische Schema-Erstellung und Privilegienausweitung - Fallstricke
(DE) Seit SQL Server 2005 gibt es die Serverweite Berechtigung CONTROL SERVER. Prinzipiell eine Alternative zur sysadmin-Mitgliedschaft, blieb sie dennoch nicht viel mehr als ein Ladenhüter – kaum bekannt und noch weniger verwendet. Einer der Hauptgründe dafür war die fehlende Möglichkeit, dieses Recht einer Gruppe von Prinzipalen/Logins auf Server-Ebene zu geben. Seit SQL Server 2012 ist es ja nun möglich, eigene Server-Rollen zu definieren, so dass diese Berechtigung nun immer mehr Verwendung findet. Dennoch ist sie kein vollständiger Ersatz für sysadmin. Warum das so ist wo die Unterschiede liegen und wo es sogar ein Risiko sein kann, möchte ich im Folgenden für meine Leser festhalten und demonstrieren. |
(EN) Since SQL Server 2005, the server wide permission CONTROL SERVER has been existing. In principle being an alternative to sysadmin-membership, it did not turn out to be much more than a shelf warmer. - Little known and even less used. One of the main reasons for this was the absence of an option to grant this permission to a group of principals/Logins on server-level. Since SQL Server 2012, it has been possible to define custom server-roles, so now this permission is used more and more. However, it is no complete replacement for sysadmin. In the following, I want to demonstrate to my readers exactly why this is, where the differences are and where it can even be a risk. |
Grundlegende Kenntnisse über das Verhalten von sysadmin und dbo setze ich als hinreichend bekannt voraus, und konzentriere mich auf das, was bei der Verwendung von CONTROL SERVER anders ist. |
I will take as a given basic knowledge about the behavior of sysadmin and dbo and therefore focus on the things that are different when using CONTROL SERVER. |
Zunächst wird ein neuer Login, „DBA_TheDude“, angelegt – das Passwort natürlich streng meinen Richtlinien (für Blogs) entsprechend. ;-) Es folgen eine neue Serverrolle, „Role_DBA“, in die der Login als Mitglied aufgenommen wird. Und da diese Rolle für Administratoren gedacht ist, erhält sie die weitest-möglichen Rechte: CONTROL SERVER. |
First of all, a new Login, „DBA_TheDude“, is created – the password of course adhering strongly to my rules (for blogs). ;-) This is followed by a new server role “Role_DBA” to which the Login will be added as a member. And since this role is meant for administrators, it receives the most extensive permission: CONTROL SERVER. |
USE [master]
GO
CREATE LOGIN DBA_TheDude WITH PASSWORD=N'www', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE SERVER ROLE [Role_DBA]
ALTER SERVER ROLE [Role_DBA]
ADD MEMBER DBA_TheDude
GRANT CONTROL SERVER TO [Role_DBA]
GO
CREATE DATABASE ControlServer_Schema_Demo
GO
Als nächstes melden wir uns als DBA am System an und lassen uns „die (effektiven) Rechte verlesen“ :-) |
Next we log onto the system as DBA and have "our (effective) rights" displayed. :-) |
EXECUTE AS LOGIN = 'DBA_TheDude'
SELECT entity_name, permission_name
FROM sys.fn_my_permissions(NULL, NULL)entity_name
entity_name |
permission_name |
server |
CONNECT SQL |
server |
SHUTDOWN |
server |
CREATE ENDPOINT |
server |
CREATE ANY DATABASE |
server |
CREATE AVAILABILITY GROUP |
server |
ALTER ANY LOGIN |
server |
ALTER ANY CREDENTIAL |
server |
ALTER ANY ENDPOINT |
server |
ALTER ANY LINKED SERVER |
server |
ALTER ANY CONNECTION |
server |
ALTER ANY DATABASE |
server |
ALTER RESOURCES |
server |
ALTER SETTINGS |
server |
ALTER TRACE |
server |
ALTER ANY AVAILABILITY GROUP |
server |
ADMINISTER BULK OPERATIONS |
server |
AUTHENTICATE SERVER |
server |
EXTERNAL ACCESS ASSEMBLY |
server |
VIEW ANY DATABASE |
server |
VIEW ANY DEFINITION |
server |
VIEW SERVER STATE |
server |
CREATE DDL EVENT NOTIFICATION |
server |
CREATE TRACE EVENT NOTIFICATION |
server |
ALTER ANY EVENT NOTIFICATION |
server |
ALTER SERVER STATE |
server |
UNSAFE ASSEMBLY |
server |
ALTER ANY SERVER AUDIT |
server |
CREATE SERVER ROLE |
server |
ALTER ANY SERVER ROLE |
server |
ALTER ANY EVENT SESSION |
server |
CONTROL SERVER |
Klingt gut. Scheint Nichts zu fehlen. Vergleichen wir es mal mit der Liste aller Rechte, die es auf Server-Ebene überhaupt gibt: |
Sounds good. Nothing seems to be missing at first glance. Let’s compare it to the list of all permissions which exist on server-scope: |
SELECT class_desc COLLATE Latin1_General_CI_AI, permission_name COLLATE Latin1_General_CI_AI
FROM sys.fn_builtin_permissions('SERVER')
EXCEPT
SELECT entity_name, permission_name
FROM sys.fn_my_permissions(NULL, NULL)
-->
(0 row(s) affected)
Ok, also wir haben wirklich alle Rechte, die man (auf Serverebene) vergeben kann. Diese Berechtigungen und Kommandos funktionieren auch wie dokumentiert. Wie sieht es aber mit gespeicherten Systemprozeduren aus? |
Ok, we really do have all permissions which can be granted (at server scope). Those permissions and commands really do work as documented. But how about system stored procedures? |
exec sp_readerrorlog
-->
Msg 15003, Level 16, State 1, Procedure sp_readerrorlog, Line 11
Only members of the securityadmin role can execute this stored procedure.
Warum das jetzt? Ganz einfach. Sicher ist es den meisten noch gut aus SQL Server 2000-Zeiten bekannt, dass sicherheitskritische Systemprozeduren einen Check auf Mitgliedschaft in bestimmten Rollen enthalten. Und das tun die meisten derer auch heute noch. Ein Artefakt der damaligen unflexiblen Rechte-Verwaltung, kann man sagen. Wenn man in den Code der sp_readerrorlog schaut, wird es dort genau so gemacht: |
Why ist that now? Quite simple. Most do probably remember from SQL 2000 times, that security wise critical system procedures include a check for membership in certain roles. And most of them still do the same today. One can call it an artefact of the then inflexible permission-management. When we look into the code of sp_readerrorlog, this is what is being done there as well: |
if (not is_srvrolemember(N'securityadmin') = 1)
begin
raiserror(15003,-1,-1, N'securityadmin'
return (1)
end
...
exec sys.xp_readerrorlog...
Okay. In der GUI-Anzeige im Management Studio hilft uns das nicht, wir können es als manuellen Workaround verwenden. Weitere Systemprozeduren, die über SSMS aufgerufen werden und die Ausführung verweigern sind unter anderem: sp_addlinkedserver lässt sich dafür ohne Probleme ausführen – nur eben nicht über die GUI wegen eben genannter Prozedur. Die Einrichtung von Database-Mail über die GUI bleibt ebenfalls den sysadmins vorbehalten. Via Script sollte es jedoch funktionieren (ungetestet). Auch die Konfiguration des Distributors für die Replikation mittels sp_adddistributor ist ohne den sysadmin-Bit nicht möglich. Unter SQL Server 2005 – 2008R2 gibt es für das Hinzufügen/Entfernen von (Server-)Rollenmitgliedern nur die Prozedur sp_addsrvrolemember / sp_dropsrvrolemember. Diese führt ebenfalls eine Serverrollen-Mitgliedschafts-Prüfung durch. - Unter SQL Server 2012 ist diese Prozedur aus Rückwärtskompatibilitätsgründen noch vorhanden, jedoch wurde dieser Check aus dem Code entfernt. Damit verhält sie sich in dieser Hinsicht somit wie der direkte Aufruf von ALTER SERVER ROLE {RoleName} ADD MEMBER {Loginname}. Das gleiche gilt für sp_addrolemember / sp_droprolemember für Datenbankrollen. |
Okay. This does not help in the GUI-presentation in Management Studio but we can use it as a manual workaround. Among other system procedures that are called via SSMS and refuse execution are: sp_addlinkedserver on the other hand can be executed without problems – just not via the GUI because of the just mentioned procedure. Setting up Database-Mail via the GUI is also reserved for sysadmins. It should work via script though (untested). Also the configuration of the distributor for replication by means of sp_adddistributor is not possible without the sysadmin bit. Under SQL Server 2005 – 2008R2, to add/remove (server) role members, solely the system procedure sp_addsrvrolemember / sp_dropsrvrolemember exists. This one also conducts a server-role-membership-check. - Under SQL Server 2012 this procedure still exists for backwards-compatibility reasons, but this specific check has been removed from the code. Thereby it now behaves like the direct call of ALTER SERVER ROLE {RoleName} ADD MEMBER {Loginname}. Same applies to sp_addrolemember / sp_droprolemember for database roles. |
Soweit zu Systemprozeduren. Eigentlich ziemlich simpel, wenn man die Hintergründe kennt. Daher, wo möglich: DDL-Kommandos verwenden, wie seit SQL Server 2005 nahegelegt wird. Randnotiz: Es gibt mindestens 7 Variationen der Prüfung auf sysadmin-Mitgliedschaft. :-) :-( Eine Kostprobe: |
So much for system stored procedures. Quite simple after all, if you know the background. Therefore, wherever possible: use DDL-commands, as it is advised since SQL Server 2005. Side-note: there are at least 7 variations for the check of sysadmin-membership. :-) :-( A taster: |
IF IS_SRVROLEMEMBER('sysadmin') != 1
IF is_srvrolemember('securityadmin') = 0
IF (is_srvrolemember('sysadmin') <> 1)
IF (is_srvrolemember(N'sysadmin') <> 1 )
IF (not is_srvrolemember(N'sysadmin') = 1)
IF (ISNULL(IS_SRVROLEMEMBER('sysadmin'),0) = 0)
IF isnull(is_srvrolemember('sysadmin'),0) = 1
Die häufigsten Fehlermeldungen, die dann ggfls. ausgelöst werden, sind: |
The most frequent error messages which are triggered if applicable are: |
EN:
message_id |
text |
14126 |
You do not have the required permissions to complete the operation. |
14260 |
You do not have sufficient permission to run this command. Contact your system administrator. |
15003 |
Only members of the %s role can execute this stored procedure. |
15247 |
User does not have permission to perform this action. |
21089 |
Only members of the sysadmin fixed server role can perform this operation. |
22904 |
Caller is not authorized to initiate the requested action. DBO privileges are required. |
DE:
message_id |
text |
14126 |
Sie haben nicht die erforderlichen Berechtigungen, um den Vorgang abzuschließen. |
14260 |
Sie haben nicht die erforderliche Berechtigung, um diesen Befehl auszuführen. Wenden Sie sich an den Systemadministrator. |
15003 |
Nur Mitglieder der %1!-Rolle können diese gespeicherte Prozedur ausführen. |
15247 |
Der Benutzer besitzt nicht die Berechtigung zum Ausführen dieser Aktion. |
21089 |
Nur Mitglieder der festen Serverrolle 'sysadmin' können diesen Vorgang ausführen. |
22904 |
Der Aufrufer ist nicht zum Initiieren der angeforderten Aktion berechtigt. Es sind DBO-Privilegien erforderlich. |
Eine vollständige Liste aller Prozeduren, die auf sysadmin-Rollenmitgliedschaft prüfen, folgt am Ende. |
A complete list of procedures that check for sysadmin-membership is included at the end of this post. |
Kommen wir zu einem anderen wichtigen Bereich: DBCC-Kommandos |
Let’s come to another important area: DBCC commands |
DBCC CHECKDB
-->
Msg 7983, Level 14, State 36, Line 1
User 'public' does not have permission to run DBCC checkdb for database 'master'.
Das geht ja gut los. Die „Regel“ ist bei DBCC noch einfacher: Von DBCC CHECKDB über DBCC LOGINFO bis zu DBCC TRACEON. Also auch durchaus wertvolle Kommandos auch für den externen Support. Die einzigen Ausnahmen, die mir bekannt sind:
DBCC DETACHDB
DBCC FREEPROCCACHE und DBCC SQLPERF
DBCC DROPCLEANBUFFERS wiederum setzt die sysadmin-Rollenmitgliedschaft voraus. Diese Berechtigungen sind übrigens recht gut dokumentiert. |
That’s a good start, isn’t it.. The „rule“ for DBCC is even simpler: From DBCC CHECKDB via DBCC LOGINFO to DBCC TRACEON. Thus some quite valuable commands also for external support. The only exceptions known to me are:
DBCC DETACHDB
DBCC FREEPROCCACHE and DBCC SQLPERF
DBCC DROPCLEANBUFFERS on the other hand requires sysadmin-role membership. Those permissions are documented quite well by the way. |
Datenbankberechtigungen Mit CONTROL SERVER hat ein Prinzipal auch vollen Zugriff auf alle Datenbanken. Logins mit lediglich CONTROL SERVER-Berechtigung werden nicht(!) zu dbo gemapped. Welche Auswirkungen das hat, sieht man im Folgenden: |
Database permissions With CONTROL SERVER, a principal has full access to all databases. Logins with merely CONTROL SERVER permission are not(!) mapped to dbo. The consequences of this can be seen in the following: |
USE ControlServer_Schema_Demo
GO
SELECT USER_NAME()
-->
DBA_TheDude
CREATE TABLE dbo.DemoTable1_dbo(id int)
GO
CREATE TABLE DemoTable2_NoSchemaSpecified(id int)
GO
SELECT name, schema_id FROM sys.tables
SELECT * FROM sys.schemas
-->
-->
SSMS:
Was ist passiert? Erinnern Sie sich noch an das pre-SQL 2012 Problem, das man Windows-Gruppen kein Default Schema zuweisen konnte? Und was passierte, wenn ein Entwickler über solch eine Gruppe vergaß, beim Anlegen eines Objektes das Schema anzugeben? Richtig. Das ist genau das gleiche: es wurde ein Schema mit dem Login-Namen des Entwicklern angelegt. Eine reine Freude für spätere Aufräumarbeiten, die „richtigen falschen“ Schemas zu identifizieren und zu löschen. Leider wurde dabei verpasst, auch die Behandlung von CONTROL SERVER Berechtigten anzupassen. Dazu hatte ich ebenfalls ein Connect-Item erstellt.: „Login with CONTROL SERVER Permission Creating an Object without specifying Schema leads to creation of new Schema with Login-Name”. - Leider zu spät. :-/ Vermutlich wird dazu ein identischer Code-Block verwendet, denn genau wie in dem Windows-Gruppen-Szenario ist dieses implizite Anlegen des Schemas nicht abfangbar. Fazit: Immer ein Schema angeben, wenn man als CONTROL Server Berechtigter Objekte anlegt – am besten einfach wirklich immer ein Schema angeben (es gibt noch andere Gründe dafür). |
What happened? Do you remember the pre-SQL 2012 problem, that windows groups could not be assigned a default schema? And what happened if a developer forgot to specify a schema when creating an object? Right. This is exactly the same: a schema with the Login-Name of the developer has been created. A true joy for later clean-up, to identify and drop the „right wrong” schemas. Unfortunately the handling of the CONTROL SERVER permission has been overlooked to be fixed. I did create a connect item: „Login with CONTROL SERVER Permission Creating an Object without specifying Schema leads to creation of new Schema with Login-Name”. – Unfortunately too late. :-/ Probably an identical code-block is being used for that, since just like in the Windows-Group scenario, this implicit creation of the schema is uncatchable. Conclusion: Always specify a schema when creating an object as a CONTROL SERVER granted principal – best: always specify a schema. (there are other reasons for that, too) |
Privilege-Escalation-Risiko: Abschließen möchte ich mit einem sicherheitstechnisch extrem wichtigen Hinweis: Logins mit CONTROL SERVER Berechtigung können standardmäßig JEDEN Login impersonifizieren. JEDEN. Also auch alle Sysadmins und sa selber! – Und auch wenn SQL Authentifizierung nicht aktiv ist! Und so lässt sich das wunderbar ausnutzen: |
Privilege-Escalation-risc: I want to wind up with a security-wise extremely important hint: Logins with CONTROL SERVER permission can impersonate EVERY Login. ALL OF THEM. Thus also all sysadmins and sa itself! – And even if SQL authentication is not active! And this is how this can be exploited marvellously: |
ALTER SERVER ROLE sysadmin
ADD MEMBER DBA_TheDude
--> No
EXEC sp_addsrvrolemember'DBA_TheDude', 'sysadmin';
--> No
EXECUTE AS LOGIN = 'sa';
ALTER SERVER ROLE sysadmin
ADD MEMBER DBA_TheDude
--> “Thank you”
REVERT;
-->
Wer sich also gegenüber dieser Form von Privilege-Escalation schützen möchte, muss das impersonate (mithilfe von DENY) verbieten. Sysadmin-Mitglieder können nicht mit DENY eingeschränkt werden. Prinzipale mit bloßer CONTROL SERVER Berechtigung jedoch schon. So funktionieren alle reinen DDL/DML Kommando-Berechtigungen eben. Also, um es noch einmal klar zu sagen, da es so entscheidend ist: Dummerweise geht das nur über "DENY IMPERSONATE ON LOGIN::[Loginname]". Denn IMPERSONATE ist hierarchisch direkt CONTROL SERVER untergeordnet! |
Who wants to protect himself from this form of privilege escalation must DENY impersonating. Sysadmin-members cannot be restricted anything via DENY. Principals with mere CONTROL SERVER permissions yet can. This is how all plain DDL/DML commands work. So, to say it clearly again, because this is vital: Unfortunately this only works via "DENY IMPERSONATE ON LOGIN::[Loginname]". This is because IMPERSONATE is hierarchically a direct subordinate of CONTROL SERVER! |
USE master
DENY IMPERSONATE ON LOGIN::sa TO [DBA_TheDude]
Bei einer sich ändernden Liste an Systemadministratoren hat man ein Problem, wenn man nicht an dieses Deny denkt! (Nächstes Risiko!) - Spätestens an dieser Stelle sollte man sich mit dem Überwachungs-Feature von SQL Server befassen. |
For a changing list of system administrators one has a real problem, in case of not remembering this crucial Deny! (Next risk!) - At the latest at this point one should address the Auditing feature of SQL Server. |
Mein Fazit und Lessons-learned daher: CONTROL-SERVER selber ist eine konsequente Fortführung der Bemühungen des Sicherheits-Teams, SQL Server sicherheitstechnisch noch einfacher und damit robuster zu machen. Jedoch ist aus dem Grund der Impersonate-Rechte eine Privilege Escalation zu sysadmin sehr einfach. Um diese zu verhindern, sollte man gut mit der Berechtigungs-Hierarchie von SQL Server vertraut sein. – Wie immer: „Wissen schafft Sicherheit.“ Was wirklich schmerzt, ist, das eines der besten Anwendungsszenarien: Rechte für Support-Personal, intern oder Extern. Im Endeffekt ist eine strikte „Separation of Duties“, die Funktionstrennung auf verschiedene „Rollen“ das eherne Ziel. Hier kann man dazu Nachlesen – auch das „SQL Server Separation of Duties Framework“ von codeplex, mit vielen guten Ideen kann ich empfehlen einmal anzusehen: |
My conclusion and lessions-learned therefore are: CONTROL SERVER itself is a consistent continuation of the efforts of the security team to make SQL Server even simpler and thereby more robust. Because of the impersonate-permissions, a privilege escalation is really simple. In order to prevent this, one should be familiar with the permission hierarchy of SQL Server. – As always: “Knowledge leads to security.” What really does hurt, is one of the best application cases: Permissions for support-personnel, internal or external. In the end, a strict “separation of duties” is the iron goal. Here you can read more about it – you should also check out the “SQL Server Separation of Duties Framework” on codeplex with many good ideas: |
http://blogs.technet.com/b/fort_sql/archive/2011/09/12/separation-of-duties-for-dba-s.aspx
Update 04-2014: Mit SQL Server 2014 wird CONTROL Server etwas sicherer. Hier kann man mehr zu den neuen Möglichkeiten lesen: |
Update 04-2014: With SQL Server 2014 CONTROL Server becomes a bit safer. You can read more on the new possibilities here: |
Eine Ablösung des „sa" ist übrigens nicht geplant, jedoch sinkt mit jedem Release die Anzahl der Szenarien, wo sa/sysadmin zwingend benötigt wird. |
A displacement of „sa“ is not planned by the way, but with every release the scenarios where sa/sysadmin is imperatively needed become less. |
Happy securing,
Andreas
Anbei die komplette Liste aller Systemprozeduren unter SQL Server 2012, die auf sysadmin-Rollenmitgliedschaft prüfen (171 – gegenüber 173 unter SQL Server 2008R2. SQL Server 2014 CTP1 ist noch das Gleiche): (Hinweis: Insgesamt 197 Systemprozeduren prüfen auf Serverrollenmitgliedschaft, wie diskadmin oder serveradmin usw.) |
Enclosed the list of all system procedures under SQL Server 2012 that check for sysadmin-role membership (171 – vs. 171 under SQL server 2008. SQL Server 2014 CTP 1 still the same): (Hint: Altogether 197 system procedures check for server role membership like diskadmin or serveradmin and so on) |
Module_Name |
fn_yukonsecuritymodelrequired |
sp_add_agent_parameter |
sp_add_agent_profile |
sp_adddatatype |
sp_adddistributiondb |
sp_adddistributor |
sp_addqreader_agent |
sp_addsubscriber |
sp_addsubscriber_schedule |
sp_addtabletocontents |
sp_attachsubscription |
sp_cdc_cleanup_change_table |
sp_cdc_disable_db |
sp_cdc_disable_table |
sp_cdc_drop_job |
sp_cdc_enable_db |
sp_cdc_enable_table |
sp_cdc_restoredb |
sp_cdc_vupgrade |
sp_certify_removable |
sp_change_agent_parameter |
sp_change_agent_profile |
sp_change_subscription_properties |
sp_change_users_login |
sp_changedistpublisher |
sp_changedistributiondb |
sp_changedistributor_password |
sp_changedistributor_property |
sp_changemergesubscription |
sp_changeqreader_agent |
sp_changereplicationserverpasswords |
sp_changesubscriptiondtsinfo |
sp_checkinvalidivarticle |
sp_copysubscription |
sp_create_removable |
sp_cycle_errorlog |
sp_dbcmptlevel |
sp_dbmmonitoraddmonitoring |
sp_dbmmonitorchangealert |
sp_dbmmonitordropalert |
sp_dbmmonitordropmonitoring |
sp_dbmmonitorhelpalert |
sp_dbmmonitorhelpmonitoring |
sp_dbmmonitorresults |
sp_dbmmonitorupdate |
sp_dbremove |
sp_drop_agent_parameter |
sp_drop_agent_profile |
sp_dropdatatypemapping |
sp_dropdistpublisher |
sp_dropdistributiondb |
sp_dropdistributor |
sp_dropmergepullsubscription |
sp_droppullsubscription |
sp_dropsubscriber |
sp_dsninfo |
sp_enumdsn |
sp_flush_commit_table_on_demand |
sp_generate_agent_parameter |
sp_get_distributor |
sp_get_Oracle_publisher_metadata |
sp_getagentparameterlist |
sp_getdefaultdatatypemapping |
sp_grant_publication_access |
sp_help_agent_default |
sp_help_agent_parameter |
sp_help_agent_profile |
sp_helpdistpublisher |
sp_helpdistributor |
sp_helpmergesubscription |
sp_helpqreader_agent |
sp_helpreplicationdboption |
sp_identitycolumnforreplication |
sp_IHValidateRowFilter |
sp_IHXactSetJob |
sp_link_publication |
sp_monitor |
sp_MSadd_distribution_agent |
sp_MSadd_logreader_agent |
sp_MSadd_merge_agent |
sp_MSadd_snapshot_agent |
sp_MSadd_subscriber_schedule |
sp_MSadd_tracer_history |
sp_MSadd_tracer_token |
sp_MScdc_cleanup_job |
sp_MScdc_db_ddl_event |
sp_MScdc_ddl_event |
sp_MSchange_distribution_agent_properties |
sp_MSchange_logreader_agent_properties |
sp_MSchange_merge_agent_properties |
sp_MSchange_snapshot_agent_properties |
sp_MSchangedynamicsnapshotjobatdistributor |
sp_MSchangedynsnaplocationatdistributor |
sp_MScheck_pull_access |
sp_MScleanupmergepublisher_internal |
sp_MSclear_dynamic_snapshot_location |
sp_MScreate_dist_tables |
sp_MSdbuserpriv |
sp_MSdeletefoldercontents |
sp_MSdrop_6x_replication_agent |
sp_MSdrop_merge_agent |
sp_MSdrop_snapshot_dirs |
sp_MSdropmergedynamicsnapshotjob |
sp_MSdynamicsnapshotjobexistsatdistributor |
sp_MSenumallpublications |
sp_MSfetchAdjustidentityrange |
sp_MSfix_6x_tasks |
sp_MSforce_drop_distribution_jobs |
sp_MSget_agent_names |
sp_MSget_jobstate |
sp_MSget_oledbinfo |
sp_MSget_publication_from_taskname |
sp_MSgetdbversion |
sp_MSgetmaxsnapshottimestamp |
sp_MShelp_repl_agent |
sp_MShelp_replication_status |
sp_MShelp_snapshot_agent |
sp_MShelpconflictpublications |
sp_MShelpdynamicsnapshotjobatdistributor |
sp_MShelplogreader_agent |
sp_MShelpsnapshot_agent |
sp_MShelptranconflictcounts |
sp_MSinit_publication_access |
sp_MSreinit_failed_subscriptions |
sp_MSremoveoffloadparameter |
sp_MSrepl_backup_complete |
sp_MSrepl_backup_start |
sp_MSrepl_createdatatypemappings |
sp_MSrepl_dropdatatypemappings |
sp_MSrepl_enumarticlecolumninfo |
sp_MSrepl_enumpublications |
sp_MSrepl_enumpublishertables |
sp_MSrepl_enumsubscriptions |
sp_MSrepl_enumtablecolumninfo |
sp_MSrepl_getdistributorinfo |
sp_MSrepl_startup_internal |
sp_MSreplagentjobexists |
sp_MSreplcheck_permission |
sp_MSreplcheck_pull |
sp_MSreplcheck_subscribe |
sp_MSreplcheck_subscribe_withddladmin |
sp_MSreplcopyscriptfile |
sp_MSreplremoveuncdir |
sp_MSsetalertinfo |
sp_MSSetServerProperties |
sp_MSsetupnosyncsubwithlsnatdist |
sp_MSsetupnosyncsubwithlsnatdist_cleanup |
sp_MSsetupnosyncsubwithlsnatdist_helper |
sp_MSstartdistribution_agent |
sp_MSstartmerge_agent |
sp_MSstartsnapshot_agent |
sp_MSstopdistribution_agent |
sp_MSstopmerge_agent |
sp_MSstopsnapshot_agent |
sp_MSupdate_agenttype_default |
sp_oledbinfo |
sp_procoption |
sp_removedbreplication |
sp_removesrvreplication |
sp_replication_agent_checkup |
sp_replicationdboption |
sp_resetstatus |
sp_restoredbreplication |
sp_SetAutoSAPasswordAndDisable |
sp_setdefaultdatatypemapping |
sp_updatestats |
sp_validatelogins |
sp_vupgrade_mergeobjects |
sp_vupgrade_replication |
sp_vupgrade_replsecurity_metadata |
xp_repl_convert_encrypt_sysadmin_wrapper |
Security Session „SQL Attack..ed“ – Attack scenarios on SQL Server ("Hacking SQL Server")
Jul 16th
Vortrag SQL Server Sicherheit „SQL Attack..ed“ – Angriffszenarien auf SQL Server („SQL Server Hacken“)
(DE) Auf dem diesjährigen SQLSaturday in Deutschland habe ich wieder einmal einen meiner Sicherheitsvorträge gehalten, in denen ich mich auf „Angriff“ konzentriere. Für mich eine gute Gelegenheit, mich wieder einmal intensiv mit SQL Server Sicherheit und einigen Penetrationstest-Tools auseinanderzusetzen, und SQL Server auf Fallstricke in Sachen Sicherheitskonfiguration zu untersuchen. Am Ende hatte ich eine lange Liste an möglichen Demonstrationen, worunter auch eine von mir frisch entwickelte DoS-Attacke via SQL Injection zählt (zumindest habe ich nirgends einen Hinweis auf eine Beschreibung dieser Art Angriff gefunden oder auf meine Nachfragen erhalten), sowie eine „privilege elevation“(Privilegienerweiterung)-Attacke, die in dieser Form auch noch unbekannt zu sein scheint. – Alles jedoch unter Ausnutzung von angepassten Einstellungen, und keine Schwächen in der Engine(!).
Da es speziell zu SQL Server kaum nennenswerte Sessions in Deutschland zu diesem Thema gibt (selbst auf den Summits in den USA war ich damit meist recht allein unterwegs), und mir das Thema in dieser Tiefe natürlich auch besonders Spaß macht, habe ich mich entschieden, hier meine möglichen Themen zu sammeln. Ich werde sie nicht nur auf weiteren kommenden Konferenzen in Europa oder USA präsentieren, sondern auch den Regionalgruppen der deutschen PASS anzubieten – die sich hier sozusagen im „Menü“ bedienen können :-)
|
(EN) At this year’s SQLSaturday in Germany I have shown one of my sessions again, in which I concentrate on “attack”. For me a great opportunity to dive deep into SQL Server Security and several penetration-test-tool, and to explore SQL Server for pitfalls and security configuration. At the end I had a long list of possible demonstrations. Among them a just recently developed DoS-attack via SQL Injection (at least I did not find any clue on a description for this kind of attack anywhere or got an answer on my inquiries), as well as a “privilege elevation”, which in this form seems to be quite unknown as well. – Everything is just done by exploiting customized settings and not by weaknesses in the engine (!).
Since there are barely any nameable sessions on this topic specifically for SQL Server in Germany (even at the Summits in the US I tended to be quite alone with my sessions on security), and I enjoy this topic in this a lot, I have decided to collect all possible topics here. |
Session Beschreibung: SQL Server kann als "secure by default" gelten, aber da das am häufigsten erfolgreich angegriffene Ziel die Daten, die in der Datenbank liegen, sind, möchte ich in dieser Session für das Thema sensibilisieren. In dieser rein Demo-basierten Session werden verschiedene Angriffsszenarien auf verschiedenen Ebenen gezeigt. Auf speziellen Wunsch auch einige Advanced SQL-Injection Beispiele. Des Weiteren zeige ich, wie eine „privilege elevation“ aufgrund einer nicht unüblichen Einstellung möglich ist und die Ausnutzung von Rechten mit einem Datenbank-Rootkit durch einen "Insider". In dieser Art Vortrag gebe ich natürlich keine Anleitung "wie man hackt", sondern ich beleuchte häufige Schwachstellen - "Was kann unter welchen Umständen passieren". (Fast) keine Folien: Demos Demos Demos |
Session Description: SQL Server is considered "secure by default", but one of the most often successfully attacked targets is the data that resides in a Database Server. In this purely demo-based security session, I am showing several attack scenarios on different layers. Due to special request this includes some special SQL Injection types. Furthermore I show how an evaluation of privileges attack is possible due to a not uncommon configuration as well as an “insider-exploit” with a database root kit. Note that in this kind of session I do not give instructions on “how to hack” but rather I am highlighting common weaknesses - “what can happen and under which circumstances”. (Almost) no slides: just Demos Demos Demos |
Inhalte // Contents
(Web)Application Layer
|
(Web)Application Layer
|
Innerhalb des Netzwerk
|
Inside the Network
|
Network Monitor TDS frame capture
Server & Datenbank-Ebene – Angriffe von Innen, Teil 1: der böse Consultant
|
Server & database-Level – attacks from inside, Part 1: evil Consultant
|
Server & Datenbank-Ebene – Angriffe von Innen, Teil 2: der böse Entwickler
|
Server & database-Level – attacks from inside, Part 2: evil Developer
|
Recent Security Reports:
- Data Breach Investigations Report
- White Hat – Website Security Statistics Report, Mai 2013
PASS Essential "SQL Server 2012 Datenbank-Sicherheit, Best Practices & Fallstricke"
- 25.9.2013, Düsseldorf
www.sqlpass.de/Portals/0/PassEssentials/2013-09-25_PE_AWO_Datenbank-Sicherheit_Datenblatt_web.pdf
Security Workshops, 2014:
- SQL Server Security Essentials für Entwickler & Administratoren (SES) (1 Tag)
3. April 2014 in Düsseldorf - Securityworkshop (SID) für SQL Server Entwickler (1 Tag)
"Die Basis für ein sicheres Backend: Von Ausführungskontext bis zu Verschlüsselung."
24. April 2014 in Düsseldorf - Securityworkshop (SIA) für SQL Server Administratoren (1Tag)
"Systemsicherheit für SQL Server: Von Authentifizierung bis zur Sicherheits-Überwachung."4. April 2014 in Düsseldorf
enjoy
and until soon - in your regional chapter, in your company, at a SQL Server Master-Class or at some conference - just say hello if you see me
Andreas