Apakah ada cara untuk mengetahui siapa yang mengubah kata sandi untuk login?

11

Saya mencoba mencari tahu siapa yang mengubah kata sandi untuk login di SQL Server 2008 R2.

Saya sudah memeriksa jejak default - dan tidak mencatat peristiwa itu. Jejak default akan mencakup peristiwa terkait keamanan ini:

/*
    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 
*/

Juga, melihat cadangan log transaksi untuk mengetahui hal itu, tetapi tidak berhasil.

Apakah ada cara lain untuk mengetahuinya?

Saya juga menyadari bahwa jejak sisi server akan membantu, tapi sayangnya di sisi server kami, kami tidak menyertakan Audit Login Change Password Event.

Artikel terbaik yang saya temukan adalah dari Aaron Bertrand: Melacak Login Kata Sandi Perubahan di SQL Server

Kin Shah
sumber
2
Saya akan mengatur salah satu saran Harun lalu mencadangkan hash kata sandi saat ini di suatu tempat dan kemudian mengubah kata sandi kembali. Lihat siapa yang berteriak .. atau jika itu hanya diubah kembali secara acak maka Anda memiliki jejak untuk menangkapnya.
Kenneth Fisher
Tidak sepenuhnya jelas apakah kata sandi diubah untuk mendapatkan akses atau untuk mencegah akses orang lain. Hanya menyatakan itu karena seseorang mungkin tidak berteriak. Kin mungkin juga tidak tahu apa kata sandi aslinya.
Aaron Bertrand
Kata sandi asli dapat diatur ulang menggunakan hash (tanyakan kepada saya bagaimana saya tahu haha), yang seharusnya berada di suatu tempat di log transaksi.
Jon Seigel

Jawaban:

11

Artikel saya akan membantu jika Anda mengaturnya terlebih dahulu, tetapi tidak ketika peristiwa itu terjadi di masa lalu dan Anda tidak memiliki mekanisme audit apa pun.

Namun, masih ada harapan. Katakanlah saya melakukan ini:

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

Informasi ini dalam penelusuran default di bawah EventClass 104 (Audit Addlogin Event). Namun, jika saya mengubah kata sandi menggunakan salah satu metode ini:

ALTER LOGIN flooberella WITH PASSWORD = N'y';

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

Peristiwa ini tidak ditangkap oleh jejak default, karena alasan keamanan yang jelas - seharusnya tidak mungkin bagi siapa pun yang memiliki akses ke jejak default untuk mengetahui apa kata sandi orang lain, atau apakah mereka ingin membuatnya mudah bahkan untuk mengetahui bahwa kata sandi telah diubah (polling frekuensi peristiwa ini, misalnya, dapat mengungkapkan properti tertentu dari strategi keamanan Anda).

Jadi apa lagi yang bisa kamu lakukan? Meskipun ini bergantung pada informasi yang masih dalam log, dan itu juga bergantung pada menggunakan perintah DBCC tidak berdokumen terhadap database sistem (Anda mungkin ingin membuat cadangan master dan mengembalikannya di tempat lain), Anda bisa mendapatkan beberapa informasi dari log transaksi, misalnya:

DBCC LOG(master, 1);

Ini akan menghasilkan, untuk dua perintah di atas, baris dengan informasi (parsial) berikut:

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

Kelihatannya tidak banyak, tapi sekarang ambil bagian deskripsi sebanyak 0x, lalu lakukan:

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

Pistol merokok! Ini adalah orang yang bertanggung jawab atas peristiwa itu.

Tentu saja, jika mereka menggunakan ALTER LOGINsintaks untuk semua operasi (yang seharusnya mereka gunakan alih-alih sp_password), Anda tidak dapat membedakan antara seseorang yang mengubah database default dan seseorang yang mengubah kata sandi. Anda juga tidak bisa mengatakan (setidaknya yang saya bisa melihat) yang masuk ini terpengaruh, hanya bahwa orang ini berubah menjadi login. Jon tampaknya berpikir bahwa informasi ini ada di log juga, tetapi saya gagal menemukannya (tidak seperti informasi waktu, yang entah bagaimana saya gulir ke masa lalu).


Mungkin ada jawaban berbeda untuk pengguna yang terkandung dalam SQL Server 2012 - meskipun saya menduga perubahan kata sandi masih dikaburkan dengan cara yang sama. Akan meninggalkan itu untuk pertanyaan terpisah.

Aaron Bertrand
sumber
Saya pikir Anda bisa menggunakan fn_dblog/ fn_dump_dblogmenentang master(atau salinannya) untuk mengetahui prinsip mana yang diubah, bahkan jika Anda harus menggunakan spelunk DBCC PAGE.
Jon Seigel
Cari untuk LOP_XACT_BEGINyang Transaction IDAnda temukan. Ini akan berisi waktu yang tepat dan SID dari login yang memulainya.
Remus Rusanu
@Jon Anda akan berpikir begitu, tetapi ID Halaman dan ID Slot NULL.
Aaron Bertrand
Harus ada cara bagi SQL untuk mengetahui cara mengembalikan transaksi ... mungkin itu hanya tidak mengekspos nilai-nilai itu di TVF meskipun sebenarnya ada.
Jon Seigel
@Jon, silakan lihat DBCC LOG(master,3);(atau yang fn_dblog()setara) dan lihat apakah Anda dapat menemukan sesuatu yang akan membantu mengidentifikasi target. Ketika saya melakukannya BEGIN TRANSACTION; ALTER LOGIN...saya mendapatkan informasi yang kurang berguna, yang hilang jika saya memutar kembali, dan menjadi di atas jika saya melakukan.
Aaron Bertrand
4

ini lebih panjang dari komentar, posting sebagai jawaban

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)
Remus Rusanu
sumber
1
@RemusRusanu Ini hanya akan berguna jika Anda secara langsung menanyakan apa yang ada di T-log, tetapi jika Anda mencoba membaca dari cadangan T-log, SID akan dipotong. Juga setiap kali fn_dump_dblog dipanggil, ia membuat scheduler SQLOS tersembunyi baru dan hingga tiga utas, yang tidak akan pernah hilang dan tidak akan pernah digunakan kembali.
Kin Shah
1

Anda dapat menggunakan pemicu DDL pada tingkat server (perhatikan bahwa untuk contoh ini Anda harus mengaktifkan dan menyetel fitur SQL Server Database Mail):

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 = '[email protected]'
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
Ivan Stankovic
sumber