क्या यह पता लगाने का एक तरीका है कि लॉगिन के लिए पासवर्ड किसने बदला?


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

सबसे अच्छा लेख जो मैंने पाया है वह आरोन बर्ट्रेंड से है: SQL सर्वर में लॉगिन पासवर्ड परिवर्तन पर नज़र रखना


2
मैं हारून के सुझावों में से एक को सेट करूंगा, फिर वर्तमान पासवर्ड हैश को कहीं और वापस करूंगा और फिर पासवर्ड वापस बदलूंगा। देखें कि कौन चिल्लाता है .. या अगर यह सिर्फ बेतरतीब ढंग से वापस बदल जाता है तो आपके पास उन्हें पकड़ने के लिए जगह है।
केनेथ फिशर

यह पूरी तरह से स्पष्ट नहीं है कि पासवर्ड को एक्सेस हासिल करने के लिए बदला गया था या किसी और की एक्सेस को रोकने के लिए। सिर्फ यह बताते हुए कि कोई चिल्ला नहीं सकता। परिजनों को यह भी पता नहीं हो सकता है कि मूल पासवर्ड क्या था।
हारून बर्ट्रेंड

मूल पासवर्ड को हैश का उपयोग करके रीसेट किया जा सकता है (मुझसे पूछें कि मैं हाहा कैसे जानता हूं), जो लेनदेन लॉग में कहीं होना चाहिए।
जॉन सिगेल

जवाबों:


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 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
जॉन सिगेल

आपको जो मिला , उसके LOP_XACT_BEGINलिए देखें Transaction ID। इसमें सटीक समय और लॉगिन की SID होगी जिसने इसे शुरू किया था।
रेमस रुसानु

@ आप ऐसा सोचते होंगे, लेकिन पेज आईडी और स्लॉट आईडी NULL हैं।
हारून बर्ट्रेंड

एसक्यूएल के लिए यह जानने का तरीका है कि लेन-देन कैसे वापस करना है ... शायद यह टीवीएफ में उन मूल्यों को उजागर नहीं कर रहा है, हालांकि वे वास्तव में वहां हैं।
जॉन सिगेल

@Jon आगे बढ़ो और DBCC LOG(master,3);(या fn_dblog()समतुल्य) पर एक नज़र डालें और देखें कि क्या आप कुछ भी देख सकते हैं जो लक्ष्य को पहचानने में मदद करेगा। जब मुझे क्या करना है तो BEGIN TRANSACTION; ALTER LOGIN...मुझे भी कम उपयोगी जानकारी मिलती है, जो गायब हो जाती है यदि मैं वापस रोल करता हूं, और अगर मैं प्रतिबद्ध हूं तो उपरोक्त बन जाता है।
हारून बर्ट्रेंड

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 यह केवल तभी उपयोगी होगा जब आप सीधे टी-लॉग में व्हाट्सएप को क्वेरी कर रहे हों, लेकिन यदि आप टी-लॉग बैकअप से पढ़ने की कोशिश करते हैं, तो SID का कटा हुआ होगा। इसके अलावा हर बार fn_dump_dblog कहा जाता है, यह एक नई छिपा SQLOS अनुसूचक तीन सूत्र है, जो दूर जाना कभी नहीं होगा और कभी नहीं पुन: उपयोग किया जा करने के लिए बनाता है और।
परिजन शाह

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.