web-dev-qa-db-ja.com

ログインのパスワードを誰が変更したかを知る方法はありますか?

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でのログインパスワードの変更の追跡

11
Kin Shah

私の記事は、事前に設定しておけば役立ちますが、過去にイベントが発生し、監査メカニズムを設定していない場合は役に立ちません。

しかし、まだ希望はあります。私がこれをしたとしましょう:

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

この情報は、EventClass 104(Audit Addloginイベント)の下のデフォルトのトレースにあります。ただし、次のいずれかの方法を使用してパスワードを変更した場合:

ALTER LOGIN flooberella WITH PASSWORD = N'y';

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

これらのイベントはnotです。これは、明らかなセキュリティ上の理由から、デフォルトのトレースによってキャプチャされます。デフォルトのトレースにアクセスできるユーザーが、他のユーザーのパスワードを理解したり、他のユーザーのパスワードを作成したりすることはできません。パスワードが変更されたことを見つけるのも簡単です(たとえば、これらのイベントの頻度をポーリングすると、セキュリティ戦略の特定のプロパティが明らかになる可能性があります)。

それであなたは他に何ができますか?これは、ログに残っている情報に依存し、システムデータベースに対して文書化されていないDBCCコマンドを使用することにも依存します(マスターをバックアップし、別の場所に復元することもできます)some =トランザクションログからの情報。例:

DBCC LOG(master, 1);

これにより、上記の2つのコマンドについて、次の(部分的な)情報を含む行が生成されます。

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の代わりに使用する必要があります)、デフォルトのデータベースを変更しているユーザーとパスワードを変更しているユーザーを区別できません。また、この影響を受けたログインを特定することはできません(少なくとも私は確認できます)。この人が変更したことのみaログイン。ジョンはこの情報もログにあると思っているようですが、私はそれを見つけることができませんでした(時間情報とは異なり、どういうわけか私は右にスクロールしました)。


SQL Server 2012では、含まれているユーザーに対して異なる回答がある可能性があります。ただし、パスワードの変更は依然として同様の方法で難読化されていると思います。別の質問にお任せします。

11
Aaron Bertrand

これはコメントより長く、回答として投稿します

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)
4
Remus Rusanu

サーバーレベルで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 = '[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
1
Ivan Stankovic