Bir giriş şifresini kimin değiştirdiğini öğrenmenin bir yolu var mı?


11

SQL Server 2008 R2'de bir oturum açma parolasını kimin değiştirdiğini bulmaya çalışıyorum.

Zaten varsayılan izlemeyi kontrol ettim - ve bu olayı günlüğe kaydetmiyor. Varsayılan izleme, güvenlikle ilgili şu olayları içerir:

/*
    Audit Add DB user event
    Audit Add login to server role event
    Audit Add Member to DB role event
    Audit Add Role event
    Audit Add login event
    Audit Backup/Restore event
    Audit Change Database owner
    Audit DBCC event
    Audit Database Scope GDR event (Grant, Deny, Revoke)
    Audit Login Change Property event
    Audit Login Failed
    Audit Login GDR event
    Audit Schema Object GDR event
    Audit Schema Object Take Ownership
    Audit Server Starts and Stops 
*/

Ayrıca, bunu bulmak için işlem günlüğü yedeklemesine baktım, ama şans yok.

Bunu bulmanın başka bir yolu var mı?

Ayrıca, bir sunucu tarafı izleme yardımcı olacağını biliyorum, ama ne yazık ki bizim sunucu tarafı izleme, biz dahil etmedi Audit Login Change Password Event.

Bulduğum en iyi makale Aaron Bertrand'dan: SQL Server'da Giriş Şifresi Değişikliklerini İzleme


2
Aaron'un önerilerinden birini ayarladım, sonra mevcut şifre karmasını bir yere yedekledim ve sonra şifreyi geri değiştirirdim. Kimin çığlık attığını görün .. ya da sadece rastgele değiştirilirse onları yakalamak için yerinde iz var.
Kenneth Fisher

Erişim elde etmek veya bir başkasının erişimini engellemek için şifrenin değiştirilip değiştirilmediği tamamen açık değildir. Sadece birileri çığlık atmayabileceğinden bunu söylüyorum. Kin, orijinal şifrenin ne olduğunu da bilmiyor olabilir.
Aaron Bertrand

Orijinal şifre, işlem günlüğünde bir yerde olması gereken karma (bana haha'yı nasıl bildiğimi sor) kullanılarak sıfırlanabilir.
Jon Seigel

Yanıtlar:


11

Makalem önceden ayarladıysanız yardımcı olacaktır, ancak olay geçmişte gerçekleştiğinde ve herhangi bir denetim mekanizması ayarlanmadığında değil.

Yine de umut var. Diyelim ki bunu yaptım:

CREATE LOGIN flooberella WITH PASSWORD = N'x', CHECK_POLICY = OFF;

Bu bilgiler, EventClass 104 (Denetim Eklenti Olayı) altındaki varsayılan izdedir. Ancak, şu yöntemlerden birini kullanarak parolayı değiştirirsem:

ALTER LOGIN flooberella WITH PASSWORD = N'y';

EXEC sp_password N'y', N'z', N'flooberella';

Bu olaylar vardır değil başkasının şifresi ne olduğunu şekle varsayılan iz erişimi olan herkes için mümkün olmamalı, ne de hatta öğrenmek için kolay yapmak istiyorum yapmak - bariz güvenlik nedenleriyle varsayılan iz tarafından yakalanan bir şifre değiştirildi (örneğin, bu olayların sıklığını sorgulamak güvenlik stratejinizin belirli özelliklerini ortaya çıkarabilir).

Peki başka ne yapabilirsiniz? Bu, hala günlükte bulunan bilgilere dayanırken ve aynı zamanda bir sistem veritabanına karşı belgelenmemiş bir DBCC komutu kullanmaya dayanır (master'ı yedeklemek ve başka bir yerde geri yüklemek isteyebilirsiniz), işlem günlüğünden bazı bilgiler alabilirsiniz , Örneğin:

DBCC LOG(master, 1);

Bu, yukarıdaki iki komut için, aşağıdaki (kısmi) bilgilere sahip satırlar verecektir:

Current LSN             Description
======================  ======================================================================
000000f2:000001b8:0002  ALTER LOGIN;0x01050000000000051500000093a3bcd7a9f8fb1417ab13bce8030000
000000f2:000001b8:0004  Alter login change password;0x01050000000000 ... same sid as above ...

Çok fazla görünmüyor, ancak şimdi açıklamanın 0x bölümünü al ve sonra yap:

SELECT name FROM sys.server_principals
  WHERE sid = 0x01050000000000051500000093a3bcd7a9f8fb1417ab13bce8030000;

Tütsüleme tabancası! Bu olaydan sorumlu olan kişi budur.

Elbette, ALTER LOGINtüm işlemler için sözdizimi kullanıyorlarsa (bunun yerine kullanmaları gerekir sp_password), varsayılan veritabanını değiştiren ve parolayı değiştiren biri arasında ayrım yapamazsınız. Ayrıca bunun hangi girişi etkilediğini (en azından görebildiğimi) söyleyemezsiniz, sadece bu kişinin bir girişi değiştirdiğini söyleyemezsiniz . Jon, bu bilgilerin de günlükte olduğunu düşünüyor gibi görünüyor, ancak bulamadım (zaman bilgilerinin aksine, bir şekilde sağa kaydırdım).


SQL Server 2012'de içerilen kullanıcılar için farklı yanıtlar olabilir - ancak şifre değişikliklerinin yine de benzer şekilde gizlendiğinden şüpheleniyorum. Ayrı bir soru için bırakacağım.


Kullanarak spelunk olsanız bile, hangi anapara değiştiğini anlamak için fn_dblog/ fn_dump_dblogkarşı master(veya bir kopyasını) kullanabileceğinizi düşünüyorum DBCC PAGE.
Jon Seigel

Arayın LOP_XACT_BEGINiçin Transaction IDBulduğunuz. Tam zamanı ve başlatan girişin SID'sini içerecektir.
Remus Rusanu

@ Sizce, ancak Sayfa Kimliği ve Alan Kimliği NULL.
Aaron Bertrand

SQL'in işlemi nasıl geri alacağını bilmesi için bir yol olmalı ... belki de gerçekte orada olsalar bile bu değerleri TVF'de göstermiyorlar.
Jon Seigel

@ Devam edin ve DBCC LOG(master,3);(veya fn_dblog()eşdeğeri) bir göz atın ve hedefi belirlemeye yardımcı olacak herhangi bir şeyi tespit edip edemeyeceğinize bakın. Bunu yaptığımda, BEGIN TRANSACTION; ALTER LOGIN...daha az yararlı bilgiler elde ederim , bu da geri döndüğümde kaybolur ve taahhüt edersem yukarıda olur.
Aaron Bertrand

4

bu bir yorumdan daha uzun, cevap olarak gönderiyor

select top(10) 
    [Transaction ID], 
    [Begin Time], 
    [Transaction Name], 
    [Transaction SID],
    SUSER_SNAME([Transaction SID])
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';

Transaction ID Begin Time               Transaction Name                  Transaction SID
-------------- ------------------------ --------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0000:00002b12  2014/01/08 20:10:14:890  Event_Session_Startup             NULL
0000:00002b13  2014/01/08 20:10:15:027  DBMgr::StartupDB                  NULL
0000:00002b14  2014/01/08 20:10:15:513  AddGuestUserToTempdb              NULL
0000:00002b15  2014/01/08 20:10:15:537  DBMgr::StartupDB                  NULL
0000:00002b16  2014/01/08 20:10:15:537  DBMgr::StartupDB                  NULL
0000:00002b17  2014/01/08 20:10:15:537  DBMgr::StartupDB                  NULL
0000:00002b18  2014/01/08 20:10:15:540  DBMgr::StartupDB                  NULL
0000:00002b19  2014/01/08 20:10:15:550  DBMgr::StartupDB                  NULL
0000:00002b1a  2014/01/11 11:49:42:760  AutoCreateQPStats                 0x010500000000000515000000A065CF7E784B9B5FE77C877084B65600
0000:00002b1b  2014/01/11 11:53:26:620  test_ack                          0x010500000000000515000000A065CF7E784B9B5FE77C877084B65600

(10 row(s) affected)

1
@RemusRusanu Bu, yalnızca T-logundaki neyi doğrudan sorguluyorsanız yararlı olacaktır, ancak bir T-log yedeklemesinden okumaya çalışırsanız, SID'ler kesilir. Ayrıca fn_dump_dblog her çağrıldığında, yeni bir gizli SQLOS zamanlayıcısı ve üç adede kadar iş parçacığı oluşturur;
Kin Shah

1

DDL tetikleyicisini sunucu düzeyinde kullanabilirsiniz (bu örnek için SQL Server Veritabanı Posta özelliğinin etkinleştirilmiş ve ayarlanmış olması gerektiğini unutmayın):

CREATE Trigger [Trg_TrackLoginManagement]
on ALL Server
for DDL_LOGIN_EVENTS
as
set nocount on
declare @data xml,
          @EventType varchar(100),
          @EventTime datetime,
          @ServerName varchar(100),
          @AffectedLoginName varchar(100),
          @WhoDidIt varchar(100),
          @EmailSubject varchar(500),
          @EmailBody varchar(800),
          @EmailRecipients varchar(300)
set @EmailRecipients = 'name@domain.com'
set @data = eventdata()
set @EventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(100)')
set @EventTime = @data.value('(/EVENT_INSTANCE/PostTime)[1]','datetime')
set @ServerName = @data.value('(/EVENT_INSTANCE/ServerName)[1]','varchar(100)')
set @AffectedLoginName = @data.value('(/EVENT_INSTANCE/ObjectName)[1]','varchar(100)')
set @WhoDidIt = @data.value('(/EVENT_INSTANCE/LoginName)[1]','varchar(100)')

set @EmailSubject = 'ALERT: DDL_LOGIN_Event: ' + @EventType + ' occured by ' + @WhoDidIt + ' on ' + @ServerName

set @EmailBody =  'DDL_Login_Event: ' + @EventType + char(10) + 
                 'Event Occured at: ' + convert(Varchar, @EventTime) + char(10) + 
                 'ServerName: ' + @ServerName + char(10) +
                 'Affected Login Name:      ' + @AffectedLoginName + char(10) + 
                 'Event Done by: ' + @WhoDidIt
EXEC msdb.dbo.sp_send_dbmail
    @recipients = @EmailRecipients,
    @body = @EmailBody,
    @subject = @EmailSubject ;
GO
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.