Hogyan auditáljuk a sysadmin joggal rendelkező felhasználókat?

Azt gondolnánk, hogy a sysadmin joggal rendelkező felhasználók nem csinálnak galibát, de legalábbis megbízhatóak. Ezeket tényként kezelném :) de azért vannak olyan esetek, amikor mégiscsak a körmükre kell nézni. Ilyen eset lehet, amikor egy előírás, törvény vagy egyéb szabvány megköveteli ezt, pl.: SOX, PCI DSS, HIPA.

Na akkor, hogyan is lehet ezt megcsinálni? Ez attól függ, hogy melyik verziót használom: SQL Server 2005 esetén csak a szerver oldali trace áll rendelkezésre. Ezzel most nem foglalkoznék, ha valakinek kell a script, odaadom. SQL 2008 és újabb verziók esetében Enterprise edition tartalmazza a SERVER AUDIT szolgáltatást. Nem enterprise editon esetén marad az SQL Serevr 2005-nél már említett szerver oldali trace.

SQL Server 2008 vagy újabb, enterprise editon esetén rendelkezésre áll a SERVER AUDIT és a SERVER AUDIT SPECIFICATION objektum. Ezek segítségével az alábbi megoldást szoktam javasolni, a teljesség igénye nélkül:

  • az audit adatokat/auditált eseményeket file-ba mentsük,
  • az audit file egy másik szeveren legyen, mint az SQL Server szolgáltatás,
  • az audit file ne legyen elérhető az SQL Server sysadmin tagjai által (NTFS és share ACL korlátozás),
  • az SQL Server Database Engine service account-nak csak WRITE jogot adjunk az audit file-t tartalmazó mappához (a read nem igazán kell, csak az - auditoroknak),
  • az SQL Server sysadmin tagjai ne legyenek domain/enterprise admin csoport tagja (felelőségi körök szétválasztása)

Ezek után már készülhet is az audit, aminél az alábbi paramétereket adtam meg:

  • max 1024 MB-os audit file-ok,
  • max 5 db audit file,
  • ha az audit adat beírása nem sikerül, akkor a szolgáltatás fut tovább (bizonyos esetekben ez nem engedhető meg, előírástól függ. itt most nagyon - engedékeny vagyok :) )
  • főbb, szerver szintű objektumok auditálása ( részelteket lásd: http://msdn.microsoft.com/en-us/library/cc280663(v=sql.100).aspx)
 1--Use ALT + Q + M to run in SQLCMD mode
 2:CONNECT SERVER\instance,port
 3:SETVAR AuditFilePath "C:\temp\"
 4USE [master]
 5GO
 6
 7
 8CREATE SERVER AUDIT [sa_sysadmin_audit]
 9TO FILE
10(   FILEPATH = N'$(AuditFilePath)'
11   ,MAXSIZE = 1024 MB
12   ,MAX_ROLLOVER_FILES = 5
13   ,RESERVE_DISK_SPACE = OFF
14)
15WITH
16(   QUEUE_DELAY = 1000,
17   ON_FAILURE = CONTINUE
18)
19GO
20
21ALTER SERVER AUDIT [sa_sysadmin_audit]
22WITH (STATE = ON);
23GO
24
25CREATE SERVER AUDIT SPECIFICATION [sas_sysadmin_audit_specification]
26FOR SERVER AUDIT [sa_sysadmin_audit]
27ADD (APPLICATION_ROLE_CHANGE_PASSWORD_GROUP),
28ADD (AUDIT_CHANGE_GROUP),
29ADD (BACKUP_RESTORE_GROUP),
30ADD (DATABASE_CHANGE_GROUP),
31ADD (DBCC_GROUP),
32ADD (DATABASE_PRINCIPAL_CHANGE_GROUP),
33ADD (DATABASE_PRINCIPAL_IMPERSONATION_GROUP),
34ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP),
35ADD (LOGIN_CHANGE_PASSWORD_GROUP),
36ADD (SERVER_OBJECT_CHANGE_GROUP),
37ADD (SERVER_OBJECT_PERMISSION_CHANGE_GROUP),
38ADD (SERVER_OPERATION_GROUP),
39ADD (SERVER_PERMISSION_CHANGE_GROUP),
40ADD (SERVER_PRINCIPAL_CHANGE_GROUP),
41ADD (SERVER_PRINCIPAL_IMPERSONATION_GROUP),
42ADD (SERVER_PRINCIPAL_IMPERSONATION_GROUP),
43ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
44ADD (SERVER_STATE_CHANGE_GROUP),
45ADD (TRACE_CHANGE_GROUP)
46WITH (STATE = ON)
47GO 

Ezek után már csak nézegetni kell, hogy miket állítgatnak be/el :) , ami lehetséges SSMS vagy a sys.fn_get_audit_file TVF segítségével is.