AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 56930
Accepted
Kin Shah
Kin Shah
Asked: 2014-01-17 10:11:46 +0800 CST2014-01-17 10:11:46 +0800 CST 2014-01-17 10:11:46 +0800 CST

有没有办法找出谁更改了登录密码?

  • 772

我试图找出谁更改了 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:Tracking Login Password Changes in SQL Server

security sql-server-2008-r2
  • 3 3 个回答
  • 14777 Views

3 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2014-01-17T10:23:25+08:002014-01-17T10:23:25+08:00

    如果您提前设置,我的文章会有所帮助,但当事件发生在过去并且您没有设置任何类型的审核机制时则不会。

    不过还是有希望的。假设我这样做了:

    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 命令(您可能希望备份 master 并在其他地方恢复它),但您可以从事务日志中获取一些信息,例如:

    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 中包含的用户可能有不同的答案——尽管我怀疑密码更改仍然以类似的方式被混淆。将把它留给一个单独的问题。

    • 11
  2. Remus Rusanu
    2014-01-17T13:18:21+08:002014-01-17T13:18:21+08:00

    这比评论长,作为答案发布

    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
  3. Ivan Stankovic
    2014-01-22T13:42:36+08:002014-01-22T13:42:36+08:00

    您可以在服务器级别使用 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

相关问题

  • SA 帐户和其他已知帐户名称对安全构成了哪些安全威胁?

  • 在 Oracle 中执行 PL/SQL 工作的应用程序开发人员的安全性

  • 基于用户的不同登录凭据

  • 存储过程可以防止 SQL 注入吗?

  • 保护数据库密码

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve