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でのログインパスワードの変更の追跡
私の記事は、事前に設定しておけば役立ちますが、過去にイベントが発生し、監査メカニズムを設定していない場合は役に立ちません。
しかし、まだ希望はあります。私がこれをしたとしましょう:
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では、含まれているユーザーに対して異なる回答がある可能性があります。ただし、パスワードの変更は依然として同様の方法で難読化されていると思います。別の質問にお任せします。
これはコメントより長く、回答として投稿します
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)
サーバーレベルで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