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


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によるものです。SQLServerでのログインパスワードの変更の追跡


2
アーロンの提案の1つを設定し、現在のパスワードハッシュをどこかにバックアップしてから、パスワードを元に戻します。誰が悲鳴を上げるかを確認してください。または、ランダムに変更された場合は、追跡してトレースを取得します。
ケネスフィッシャー

アクセスを取得するために、または他の人のアクセスを防止するためにパスワードが変更されたかどうかは完全には明らかではありません。誰かが悲鳴を上げないかもしれないので、それを述べてください。Kinは、元のパスワードが何であったかを知らない可能性もあります。
アーロンバートランド

トランザクションログのどこかにあるはずのハッシュを使用して、元のパスワードをリセットできます(どうすればいいのかを尋ねてください)。
Jon Seigel、2014年

回答:


11

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

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

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';

これらのイベントは、明らかなセキュリティ上の理由から、デフォルトのトレースでキャプチャされません -デフォルトのトレースにアクセスできる人が他の誰かのパスワードが何かを理解することは不可能であるはずです。パスワードが変更された(たとえば、これらのイベントの頻度をポーリングすると、セキュリティ戦略の特定のプロパティが明らかになる可能性があります)。

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

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


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


私はあなたがfn_dblog/ fn_dump_dblogに対してmaster(またはそのコピー)を使用して、どのプリンシパルが変更されたかを知るために使用できると思いますDBCC PAGE
Jon Seigel 2014年

あなたが見つけたLOP_XACT_BEGINを探してくださいTransaction ID。正確な時刻とそれを開始したログインのSIDが含まれます。
Remus Rusanu 2014年

@Jonあなたはそう思うだろうが、ページIDとスロットIDはNULLである。
アーロンバートランド

SQLがトランザクションをロールバックする方法を知る方法が必要です...多分それは実際にそこにあるのにTVFでそれらの値を公開していないだけかもしれません。
Jon Seigel、2014年

@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これは、Tログの内容を直接クエリしている場合にのみ役立ちますが、Tログのバックアップから読み取ろうとすると、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.