누가 로그인 암호를 변경했는지 알아낼 수있는 방법이 있습니까?


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
Aaron의 제안 중 하나를 설정 한 다음 현재 비밀번호 해시를 어딘가에 백업 한 다음 비밀번호를 다시 변경합니다. 누가 비명을 지르는 지 확인하십시오. 또는 무작위로 다시 바뀌면 추적 할 수있는 흔적이 있습니다.
Kenneth Fisher

액세스 권한을 얻거나 다른 사람의 액세스를 막기 위해 암호가 변경되었는지는 확실하지 않습니다. 누군가 비명을 지르지 않을 수 있다고 말하면서 Kin은 원래 비밀번호가 무엇인지 모를 수도 있습니다.
Aaron Bertrand

원래 비밀번호는 트랜잭션 로그의 어딘가에있는 해시 (하하를 아는 방법을 묻습니다)를 사용하여 재설정 할 수 있습니다.
Jon Seigel

답변:


11

사전에 이벤트를 설정했지만 이벤트가 과거에 발생하고 감사 메커니즘이 설정되어 있지 않은 경우에는 내 기사가 도움이 될 것입니다.

그래도 여전히 희망이 있습니다. 내가 이것을했다고 가정 해 봅시다.

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

이 정보는 EventClass 104 (Audit Addlogin Event)의 기본 추적에 있습니다. 그러나 다음 방법 중 하나를 사용하여 비밀번호를 변경하면

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) 기본 데이터베이스를 변경하는 사람과 암호를 변경하는 사람을 구별 할 수 없습니다. 당신은 또한 (적어도 내가 볼 수) 말할 수있는이 영향을,이 사람이 변경된 경우에만 해당 로그인 로그인합니다. Jon 은이 정보도 로그에 있다고 생각하는 것처럼 보이지만 정보를 찾지 못했습니다 (시간 정보와 달리 어떻게 든 과거 스크롤).


SQL Server 2012에는 포함 된 사용자에 대한 답변이 다를 수 있지만 암호 변경이 여전히 비슷한 방식으로 난독 화되는 것으로 생각됩니다. 별도의 질문으로 남겨 두겠습니다.


나는 당신이 spelunk를 사용해야하더라도 어떤 주체가 변경되었는지 알아 내기 위해 fn_dblog/ fn_dump_dblog반대 master(또는 사본)를 사용할 수 있다고 생각합니다 DBCC PAGE.
Jon Seigel

를 찾아 LOP_XACT_BEGIN을 위해 Transaction ID당신이 발견했다. 정확한 시간과 시작한 로그인의 SID가 포함됩니다.
Remus Rusanu

@Jon 당신은 그렇게 생각하지만 페이지 ID와 슬롯 ID는 NULL입니다.
Aaron Bertrand

SQL이 트랜잭션을 롤백하는 방법을 알 수있는 방법이 있어야합니다. 실제로는 해당 값이 TVF에 존재하더라도 TVF에 해당 값을 노출시키지 않을 수 있습니다.
Jon Seigel

@Jon 계속해서 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 스케줄러와 최대 3 개의 스레드가 작성되며,이 스레드는 절대 사라지지 않으며 재사용되지 않습니다.
Kin Shah

1

서버 수준에서 DDL 트리거를 활용할 수 있습니다 (이 예에서는 SQL Server 데이터베이스 메일 기능이 활성화 및 설정되어 있어야합니다).

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.