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)
--Use ALT + Q + M to run in SQLCMD mode
:CONNECT SERVER\instance,port
:SETVAR AuditFilePath "C:\temp\"
USE [master]
GO
CREATE SERVER AUDIT [sa_sysadmin_audit]
TO FILE
( FILEPATH = N'$(AuditFilePath)'
,MAXSIZE = 1024 MB
,MAX_ROLLOVER_FILES = 5
,RESERVE_DISK_SPACE = OFF
)
WITH
( QUEUE_DELAY = 1000,
ON_FAILURE = CONTINUE
)
GO
ALTER SERVER AUDIT [sa_sysadmin_audit]
WITH (STATE = ON);
GO
CREATE SERVER AUDIT SPECIFICATION [sas_sysadmin_audit_specification]
FOR SERVER AUDIT [sa_sysadmin_audit]
ADD (APPLICATION_ROLE_CHANGE_PASSWORD_GROUP),
ADD (AUDIT_CHANGE_GROUP),
ADD (BACKUP_RESTORE_GROUP),
ADD (DATABASE_CHANGE_GROUP),
ADD (DBCC_GROUP),
ADD (DATABASE_PRINCIPAL_CHANGE_GROUP),
ADD (DATABASE_PRINCIPAL_IMPERSONATION_GROUP),
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP),
ADD (LOGIN_CHANGE_PASSWORD_GROUP),
ADD (SERVER_OBJECT_CHANGE_GROUP),
ADD (SERVER_OBJECT_PERMISSION_CHANGE_GROUP),
ADD (SERVER_OPERATION_GROUP),
ADD (SERVER_PERMISSION_CHANGE_GROUP),
ADD (SERVER_PRINCIPAL_CHANGE_GROUP),
ADD (SERVER_PRINCIPAL_IMPERSONATION_GROUP),
ADD (SERVER_PRINCIPAL_IMPERSONATION_GROUP),
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
ADD (SERVER_STATE_CHANGE_GROUP),
ADD (TRACE_CHANGE_GROUP)
WITH (STATE = ON)
GO
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.