มีวิธีหาใครเปลี่ยนรหัสผ่านสำหรับการเข้าสู่ระบบหรือไม่?


11

ฉันพยายามค้นหาว่าใครเปลี่ยนรหัสผ่านสำหรับการเข้าสู่ระบบใน SQL Server 2008 R2

ฉันได้ตรวจสอบการติดตามเริ่มต้นแล้วและไม่ได้บันทึกเหตุการณ์นั้น การติดตามเริ่มต้นจะรวมถึงเหตุการณ์ที่เกี่ยวข้องกับความปลอดภัย:

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

ตรวจสอบการสำรองข้อมูลล็อกธุรกรรมเพื่อค้นหาสิ่งนั้น แต่ไม่มีโชค

มีวิธีอื่นในการค้นหาหรือไม่

นอกจากนี้ผมทราบว่าร่องรอยฝั่งเซิร์ฟเวอร์จะช่วย Audit Login Change Password Eventแต่โชคร้ายในด้านเซิร์ฟเวอร์ร่องรอยของเราเราไม่ได้รวม

บทความที่ดีที่สุดที่ฉันพบคือจาก Aaron Bertrand: การติดตามการเปลี่ยนแปลงรหัสผ่านการเข้าสู่ระบบใน SQL Server


2
ฉันจะตั้งค่าหนึ่งในคำแนะนำของแอรอนจากนั้นสำรองแฮชรหัสผ่านปัจจุบันไว้ที่ใดที่หนึ่งแล้วเปลี่ยนรหัสผ่านกลับ ดูว่าใครกรีดร้อง .. หรือถ้ามันเปลี่ยนกลับมาแบบสุ่มคุณมีร่องรอยในการจับพวกเขา
Kenneth Fisher

ไม่ชัดเจนว่ารหัสผ่านจะถูกเปลี่ยนเป็นการเข้าถึงหรือป้องกันการเข้าถึงของผู้อื่น เพียงแค่ระบุว่าเพราะบางคนอาจไม่กรีดร้อง คินอาจไม่รู้ด้วยว่ารหัสผ่านดั้งเดิมคืออะไร
Aaron Bertrand

รหัสผ่านเดิมสามารถรีเซ็ตได้โดยใช้แฮช (ถามฉันว่าฉันรู้ฮ่าฮ่า) ซึ่งควรจะอยู่ที่ไหนสักแห่งในบันทึกการทำธุรกรรม
Jon Seigel

คำตอบ:


11

บทความของฉันจะช่วยถ้าคุณตั้งค่าล่วงหน้า แต่ไม่ใช่เมื่อเหตุการณ์เกิดขึ้นในอดีตและคุณไม่มีกลไกการตรวจสอบใด ๆ

ยังมีความหวังอยู่ สมมติว่าฉันทำสิ่งนี้:

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

ข้อมูลนี้อยู่ในการติดตามเริ่มต้นภายใต้ EventClass 104 (ตรวจสอบเหตุการณ์ Addlogin ตรวจสอบ) อย่างไรก็ตามหากฉันเปลี่ยนรหัสผ่านโดยใช้วิธีใดวิธีหนึ่งต่อไปนี้:

ALTER LOGIN flooberella WITH PASSWORD = N'y';

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

เหตุการณ์เหล่านี้ไม่ได้ถูกดักจับโดยการติดตามเริ่มต้นด้วยเหตุผลด้านความปลอดภัยที่ชัดเจน - มันไม่ควรเป็นไปได้สำหรับทุกคนที่มีการเข้าถึงการติดตามเริ่มต้นเพื่อหาว่ารหัสผ่านของผู้อื่นคืออะไรและพวกเขาต้องการให้ง่ายต่อการค้นหา รหัสผ่านมีการเปลี่ยนแปลง (เช่นการสำรวจความถี่ของเหตุการณ์เหล่านี้สามารถเปิดเผยคุณสมบัติบางอย่างของกลยุทธ์ความปลอดภัยของคุณ)

แล้วคุณจะทำอะไรได้อีก ขณะที่สิ่งนี้อาศัยข้อมูลที่ยังอยู่ในบันทึกและยังใช้คำสั่ง DBCC ที่ไม่มีเอกสารกับฐานข้อมูลระบบ (คุณอาจต้องการแบ็คอัพมาสเตอร์และเรียกคืนข้อมูลจากที่อื่น) คุณสามารถรับข้อมูลบางอย่างจากบันทึกธุรกรรม เช่น:

DBCC LOG(master, 1);

สิ่งนี้จะให้ผลสำหรับสองคำสั่งข้างต้นแถวที่มีข้อมูล (บางส่วน) ดังต่อไปนี้:

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

ดูเหมือนจะไม่มากนัก แต่ตอนนี้ใช้คำอธิบายส่วนที่ 0x จากนั้นทำ:

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

ปืนสูบบุหรี่! นี่คือบุคคลที่รับผิดชอบเหตุการณ์นั้น

แน่นอนถ้าพวกเขาใช้ALTER LOGINไวยากรณ์สำหรับการดำเนินการทั้งหมด (ซึ่งควรใช้แทนsp_password) คุณจะไม่สามารถแยกแยะความแตกต่างระหว่างคนที่เปลี่ยนฐานข้อมูลเริ่มต้นกับคนที่เปลี่ยนรหัสผ่านได้ คุณไม่สามารถบอกได้ว่าอย่างน้อยฉันก็จะเห็นว่าการเข้าสู่ระบบนี้ได้รับผลกระทบเพียงใดโดยที่บุคคลนี้เปลี่ยนการเข้าสู่ระบบ จอนดูเหมือนว่าจะคิดว่าข้อมูลนี้อยู่ในล็อกด้วย แต่ฉันไม่พบมัน (ต่างจากข้อมูลเวลาซึ่งฉันเลื่อนไปทางขวาอย่างใดอย่างหนึ่ง)


อาจมีคำตอบที่แตกต่างกันสำหรับผู้ใช้ที่มีอยู่ใน SQL Server 2012 - แม้ว่าฉันสงสัยว่าการเปลี่ยนแปลงรหัสผ่านจะยังคงสับสนในวิธีที่คล้ายกัน จะปล่อยให้เป็นคำถามแยกต่างหาก


ฉันคิดว่าคุณสามารถใช้fn_dblog/ fn_dump_dblogผิดmaster(หรือสำเนาของมัน) DBCC PAGEจะคิดออกซึ่งหลักคือการเปลี่ยนแปลงแม้ว่าคุณจะต้องใช้
Jon Seigel

มองหาสิ่งLOP_XACT_BEGINที่Transaction IDคุณพบ มันจะมีเวลาที่แน่นอนและ SID ของการเข้าสู่ระบบที่เริ่มต้นขึ้น
Remus Rusanu

@ จอนคุณคิดอย่างนั้น แต่ Page ID และ Slot ID นั้นเป็น NULL
Aaron Bertrand

จะต้องมีวิธีการสำหรับ SQL ที่จะรู้วิธีย้อนกลับการทำธุรกรรม ... บางทีมันอาจจะไม่เปิดเผยค่าเหล่านั้นใน TVF แม้ว่าพวกเขาจะอยู่ที่นั่นจริง ๆ
Jon Seigel

@ จอนไปข้างหน้าและดูDBCC LOG(master,3);(หรือfn_dblog()เทียบเท่า) และดูว่าคุณสามารถมองเห็นสิ่งที่จะช่วยระบุเป้าหมาย เมื่อฉันBEGIN TRANSACTION; ALTER LOGIN...ฉันได้รับข้อมูลที่เป็นประโยชน์น้อยลงซึ่งจะหายไปถ้าฉันย้อนกลับและกลายเป็นข้างต้นถ้าฉันกระทำ
Aaron Bertrand

4

นี่ยาวเกินความคิดเห็นโดยโพสต์เป็นคำตอบ

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 สิ่งนี้จะมีประโยชน์เฉพาะเมื่อคุณทำการสอบถามข้อมูลใน T-log โดยตรง แต่ถ้าคุณพยายามอ่านจากการสำรองข้อมูล T-log SID จะถูกตัดออก นอกจากนี้ทุกครั้งที่เรียกว่า fn_dump_dblog จะสร้างตัวกำหนดตารางเวลา SQLOS ใหม่ที่ซ่อนอยู่และเธรดได้สูงสุดสามเธรดซึ่งจะไม่มีวันหายไปและไม่ถูกนำมาใช้ซ้ำ
Kin Shah

1

คุณสามารถใช้ทริกเกอร์ DDL ในระดับเซิร์ฟเวอร์ (โปรดทราบว่าสำหรับตัวอย่างนี้คุณต้องเปิดใช้งานและตั้งค่าคุณสมบัติจดหมายเซิร์ฟเวอร์ฐานข้อมูล SQL):

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.