- Auditing in SQL Server (Server Audit)
 - How to Create an Audit to Monitor Job Creation, Modification, and Deletion in SQL Server
 - How to create an Audit trigger to log object manipulation in SQL Server
 - SQL Server - How to implement login auditing and control (Logon Trigger)
 - Monitoring DDL and DCL operations using SQL Server's fn_trace_gettable
 - Using the standard SQL Server trace to audit events (fn_trace_gettable)
 - SQL Server – Permissions and privileges audit trigger at database and instance level (GRANT and REVOKE)
 - SQL Server - How to monitor and audit data changes in tables using Change Data Capture (CDC)
 - SQL Server 2016 - How to "time travel" using the Temporal Tables feature
 - SQL Server - How to use auditing to map actual required permissions on a user
 - SQL Server - Trigger to prevent and prevent changes in tables
 - SQL Server - How to Create a Data Change History for Your Tables (Audit Logs)
 - SQL Server - How to avoid brute force attacks on your database
 - SQL Server – Security Checklist – An SP with over 70 security items to validate your database
 - SQL Server - How to know the last login date of a user
 - SQL Server - How to avoid and protect yourself from Ransomware attacks like WannaCry on your database server
 - SQL Server - Watch out for the securityadmin server role! Using elevation of privileges to become sysadmin
 - SQL Server – How to avoid SQL Injection? Stop using Dynamic Query like EXEC(@Query). Now.
 - SQL Server - Understanding the risks of the TRUSTWORTHY property enabled on a database
 - SQL Server - Password Policies, Password Expiration, Mandatory Password Change and Login Blocking after several Attempts
 - SQL Server - How to create a login audit using instance logs
 
Olá pessoal,
Tudo bem com vocês ?
Depois de MUITO tempo sem postar nenhum artigo técnico, estou começando a ter um tempo novamente para trazer mais scripts e artigos legais que eu gostaria de compartilhar com vocês.
Neste post, vou demonstrar como criar uma trigger para auditar eventos de concessão e remoção de permissões (GRANT e REVOKE) em objetos, databases, alterações de usuários em roles (database roles e server roles), além de permissões diretas em databases. Essa necessidade surgiu através de uma demanda que chegou pra mim, pois alguns usuários estavam perdendo acesso em uma determinada instância e não tinha nenhum controle para identificar quem estava removendo e quem concedeu esses acessos.
Script de criação da tabela de histórico de permissões
Com o script abaixo, você poderá criar a tabela que vai armazenar todo o histórico de permissões concedidas e removidas na instância.
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | 
						USE [Auditing] GO IF (OBJECT_ID('dbo.Trace_Alteracao_Privilegios') IS NULL) BEGIN     CREATE TABLE dbo.Trace_Alteracao_Privilegios (         Id_Evento BIGINT IDENTITY(1, 1) PRIMARY KEY,         Ds_Evento VARCHAR(255),         Dt_Evento DATETIME,         Ds_Database VARCHAR(255),         Ds_Schema VARCHAR(255),         Ds_Objeto VARCHAR(255),         Ds_Tipo_Objeto VARCHAR(255),         Ds_Usuario VARCHAR(255),         Ds_Comando VARCHAR(MAX),         Evento XML     );     GRANT INSERT ON dbo.Trace_Alteracao_Privilegios TO [public]; END  | 
					
Script de criação da trigger
Com o script abaixo, você irá criar a trigger que faz a coleta a auditoria das permissões.
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47  | 
						USE [master] GO IF ((SELECT COUNT(*) FROM sys.server_triggers WHERE name = 'trgAudit_Privileges') > 0) DROP TRIGGER [trgAudit_Privileges] ON ALL SERVER GO CREATE TRIGGER trgAudit_Privileges ON ALL SERVER FOR DDL_SERVER_SECURITY_EVENTS, DDL_DATABASE_SECURITY_EVENTS AS BEGIN     DECLARE          @Ds_Evento NVARCHAR(255),         @Ds_Schema NVARCHAR(255),         @Ds_Database VARCHAR(255),         @Ds_Objeto VARCHAR(255),         @Ds_TipoObjeto VARCHAR(255),         @Evento XML,         @Ds_Comando VARCHAR(MAX);     SELECT         @Ds_Evento = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(max)'),         @Ds_Schema = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'nvarchar(max)'),         @Ds_Objeto = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)'),         @Ds_TipoObjeto = EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(max)'),         @Ds_Database = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(max)'),         @Ds_Comando = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)'),         @Evento = EVENTDATA()     INSERT INTO Auditing.dbo.Trace_Alteracao_Privilegios     SELECT         @Ds_Evento,         GETDATE() AS Dt_Evento,         @Ds_Database,         @Ds_Schema,         @Ds_Objeto,         @Ds_TipoObjeto,         SUSER_SNAME(),         @Ds_Comando,         @Evento END  | 
					
Resultados
Agora vou demonstrar alguns exemplos do que essa trigger pode auditar.

And that's it, folks!
Um abraço pra vocês e até o próximo post.

																								
Dirceu, boa tarde. Estou utilizando seus scripts em minha base de testes e estou tendo problemas parecidos com o do Laércio. Eu até consigo logar no ambiente, mas não consigo criar login mais. Sou bloqueada pela trigger. Não entendi como isso ocorre, uma vez que a trigger só faz select e insert. Tem ideia do por que isso estar ocorrendo? Obrigada.
Dirceu,
Consegui resolver! Não fui o primeiro a fazer essa besteira e nesse link tem a solução. Deu certo!
http://www.connectsql.com/2012/09/sql-server-disable-logon-trigger-using.html
Desculpa o incômodo e obrigado pela atenção mais uma vez!
Grande abraço!
Desculpe, Durceu. Comentei na postagem errada!
Estou falando daquela sua trigger de Auditoria de Logins. Nela que fiz a caca.
E não consigo logar nem com “sa” e nem com qualquer usuário do domínio. Só com um único usuário público que deixei de fora dela. Ainda bem, senão o sistema teria parado!
Vou ficar te devendo muito se me ajudar a sair dessa sem ter que reinstalar o SQL no servidor.
Olá, Dirceu!
Estava testando essa trigger e achei um problema com uma situação aqui no meu ambiente, de login com Crystal Reports. Na tentativa de ajustar isso setei os parâmetros CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS e ANSI_PADDING para OFF e recriei a trigger. Resultado: não consigo mais logar no servidor! Só consigo com um usuário público que deixei de fora do controle, mas com isso não consigo mais alterar nem excluir a trigger.
Tem alguma sugestão para me ajudar a resolver essa patetada que fiz ?
Laércio,
Bom dia.
Você tentou logar com o usuário “sa” ou algum usuário que seja sysadmin ? Não entendi porque essa trigger causaria esse efeito, porque ela só audita eventos de segurança e não de login.