首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQLServer记录密码变更的几种方式

SQLServer记录密码变更的几种方式

原创
作者头像
保持热爱奔赴山海
发布于 2025-06-25 01:01:50
发布于 2025-06-25 01:01:50
1760
举报
文章被收录于专栏:数据库相关数据库相关

方法1 使用自定义日志表 + DDL 触发器

虽然 SQL Server 不会在审计日志中直接记录密码变更的具体内容(如新密码),但你可以通过 DDL 触发器 在每次执行 ALTER LOGIN 操作时捕获相关信息,并将操作记录到一个自定义的日志表中。这种方式虽然无法记录密码本身,但可以记录 谁在什么时候对哪个账号执行了密码修改操作。

创建日志表

代码语言:txt
AI代码解释
复制
use master;
CREATE TABLE dbo.PasswordChangeLog (
    LogID INT IDENTITY(1,1) PRIMARY KEY,
    EventTime DATETIME DEFAULT GETDATE(),          -- 事件发生时间
    LoginName NVARCHAR(128),                        -- 被修改的登录账户名
    ChangedBy NVARCHAR(128),                        -- 执行操作的登录账户名
    ChangeType NVARCHAR(50),                        -- 变更类型(例如:密码修改)
    AdditionalInfo NVARCHAR(MAX)                    -- 附加信息(可选)
);

创建一个DDL触发器

代码语言:txt
AI代码解释
复制
CREATE TRIGGER trg_PasswordChangeAudit
ON ALL SERVER
FOR ALTER_LOGIN
AS
BEGIN
    DECLARE @LoginName NVARCHAR(128);
    DECLARE @ChangedBy NVARCHAR(128);
    DECLARE @EventData XML;
    -- 获取当前执行操作的登录账户名
    SET @ChangedBy = ORIGINAL_LOGIN();
    -- 获取事件数据(包括被修改的登录账户名)
    SET @EventData = EVENTDATA();
    -- 从事件数据中提取被修改的登录账户名
    SET @LoginName = @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(128)');
    -- 判断是否是密码修改操作(注意:无法直接判断是否修改了密码,但可以假设 ALTER LOGIN 可能涉及密码修改)
    -- 这里我们简单地将所有 ALTER LOGIN 操作都记录为可能的密码修改
    INSERT INTO dbo.PasswordChangeLog (LoginName, ChangedBy, ChangeType)
    VALUES (@LoginName, @ChangedBy, '密码修改');
END;

执行几个修改密码的操作

代码语言:txt
AI代码解释
复制
ALTER LOGIN [devops] WITH PASSWORD = 'Abcd123!', CHECK_POLICY = ON;
ALTER LOGIN [sa] WITH PASSWORD = 'Abcd123!', CHECK_POLICY = ON;
ALTER LOGIN [sa] WITH PASSWORD = 'Abcd09876', CHECK_POLICY = ON;

查询日志表

代码语言:txt
AI代码解释
复制
SELECT * FROM dbo.PasswordChangeLog;

方法2 历史密码hash比对

创建历史表存储密码哈希

代码语言:txt
AI代码解释
复制
use master;
CREATE TABLE dbo.LoginPasswordHistory (
    LogID INT IDENTITY PRIMARY KEY,
    LoginName NVARCHAR(128),
    PasswordHash VARBINARY(256),
    ChangeTime DATETIME DEFAULT GETDATE()
);

定期记录密码哈希(需手动或通过作业执行)

代码语言:txt
AI代码解释
复制
INSERT INTO dbo.LoginPasswordHistory (LoginName, PasswordHash)
SELECT name, password_hash FROM sys.sql_logins;

查询历史表中sa的密码哈希记录

代码语言:txt
AI代码解释
复制
select * from dbo.LoginPasswordHistory where LoginName='sa';

方法3 使用服务器审计功能

创建服务器审计对象

代码语言:txt
AI代码解释
复制
CREATE SERVER AUDIT PasswordChangeAudit TO FILE (FILEPATH = 'D:\mssql2022\auditlogs\');

启用审计

代码语言:txt
AI代码解释
复制
ALTER SERVER AUDIT PasswordChangeAudit WITH (STATE = ON);

创建审计规范,捕获 ALTER LOGIN 操作

代码语言:txt
AI代码解释
复制
CREATE SERVER AUDIT SPECIFICATION AuditSpec_PasswordChange
FOR SERVER AUDIT PasswordChangeAudit
ADD (SUCCESSFUL_LOGIN_GROUP),          -- 可选:成功登录
ADD (FAILED_LOGIN_GROUP),              -- 可选:失败登录
ADD (DATABASE_OBJECT_CHANGE_GROUP),    -- 数据库对象变更(不包含密码变更)
ADD (SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP), -- 权限变更
ADD (SERVER_PRINCIPAL_CHANGE_GROUP);   -- 服务器主体(登录账户)变更,**包括 ALTER LOGIN**

启用审计规范

代码语言:txt
AI代码解释
复制
ALTER SERVER AUDIT SPECIFICATION AuditSpec_PasswordChange WITH (STATE = ON);

执行一些模拟修改密码的命令

代码语言:txt
AI代码解释
复制
ALTER LOGIN [devops_test] WITH PASSWORD = 'NewPassword123!', CHECK_POLICY = ON;

查询日志

代码语言:txt
AI代码解释
复制
SELECT  * 
FROM sys.fn_get_audit_file ('D:\mssql2022\auditlogs\PasswordChangeAudit*.sqlaudit', NULL, NULL)
where 1=1 and statement like '%alter%'
order by event_time desc ;

或者

SELECT 
	event_time,
	host_name,
	database_name,
	object_name, 
	statement ,
	action_id,
	succeeded,
	target_server_principal_name
FROM sys.fn_get_audit_file ('D:\mssql2022\auditlogs\PasswordChangeAudit*.sqlaudit', NULL, NULL)
where 1=1
-- and statement like '%alter%'
order by event_time desc ;

注意:

如果是通过T-SQL改密码的话,statement中会记录类似到 ALTER LOGIN [sa] WITH PASSWORD = '******', CHECK_POLICY = ON;  这种明确体现密码修改的记录。

如果是通过SSMS的图形界面修改的话,只能记录到类似:ALTER LOGIN [lirulei23] WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;  这种无法明确体现出是密码出现了修改(因为在SSMS中修改某个用户的默认语言也是这种日志)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQLServer开启服务器审计
官方文档 https://learn.microsoft.com/en-us/sql/relational-databases/system-functions/sys-fn-get-audit-file-transact-sql?view=sql-server-ver17&tabs=sqlserver
保持热爱奔赴山海
2025/07/01
1370
MySQL数据库审计功能全解析:从原理到实战部署
在金融行业数据安全合规审计案例中,某银行通过开启MySQL审计功能,成功追踪到异常账户的资金操作记录,有效防范了内部数据泄露风险。这个案例揭示了数据库审计的核心价值:
是山河呀
2025/06/29
1830
开源KMS之vault part5 database secret engine
https://lonegunmanb.github.io/essential-vault/6.%E6%9C%BA%E5%AF%86%E5%BC%95%E6%93%8E/6.3.Database_MSSQL.html
保持热爱奔赴山海
2024/06/03
2540
SQL注入语句和方法总结
前提需要工具(SQL Query Analyzer和SqlExec Sunx Version)
沙漠尽头的狼
2021/12/01
1.3K0
普通用户竟这样执行xp_cmdshell存储过程!
作者 | 邹建,资深数据库专家,精通各项 SQL Server 技术,具有丰富的管理、维护、优化能力以及业务应用经验。他一直热心于技术知识的分享、传播,持续活跃在 CSDN 和 MSDN 社区,曾多年蝉联 CSDN 论坛积分榜首。
数据和云
2018/10/08
1K0
普通用户竟这样执行xp_cmdshell存储过程!
Docker 安装部署Sql Server
  在如今,容器化概念越来越盛行,.Net Core项目也可以跨平台部署了,那么思考下Sql Server能不能呢?当然是可以的啦。本文今天就是介绍Docker部署配置和连接Sql Server。本文基于Centos7。
小世界的野孩子
2019/08/01
2.8K0
Docker 安装部署Sql Server
技术分享 | OceanBase 安全审计之身份鉴别
本文以 MySQL 作为参考,介绍了 OceanBase(MySQL 模式)安全体系中关于身份鉴别的相关功能,包括身份鉴别机制、用户名组成、密码复杂度、密码过期策略等。
爱可生开源社区
2023/08/18
4570
技术分享 | OceanBase 安全审计之身份鉴别
SQLServer中的DDL触发器
1 检测到drop table和alter table的sql,自动回滚并输入提示信息
保持热爱奔赴山海
2024/02/27
5620
关于SQL Server 镜像数据库快照的创建及使用
从SQL Server 2005 SP1 起,SQL 开始支持数据库镜像。它的设计目的是试图为SQL Server 提供一个具有实时性数据同步的灾难恢复技术,即能够提供数据冗余备份,切换起来比较方便。每个主体数据库只能有一个镜像数据库。镜像数据库作为主体数据库的一个副本,在主体数据库发生故障、不可访问时能够迅速恢复数据库访问,提供故障恢复功能。镜像数据库一直处于“恢复”状态,因此不能被直接访问。
东山絮柳仔
2021/03/20
2.5K0
sqlserver简便创建用户并授权
很多研发人员程序连接SQL Server直接用的就是SA帐号。如果对数据库管理稍微严格一点的话,就不应该给应用程序这种权限,通常应用程序只需要进行增删改查,而很少有DDL操作,因此配置帐号时应该遵循“最小权限分配”的原则仅仅赋予所需的权限。
用户1217611
2019/05/25
1.9K0
窃取MSSQL各版本密码HASH
MSSQL使用自制的密码哈希算法对用户密码进行哈希,在内网渗透中,大多数服务口令都是一样的,收集MSSQL数据库的用户和密码可能会有用。
Bypass
2021/02/03
4.1K0
窃取MSSQL各版本密码HASH
easyui+nodejs+sqlserver增删改查实现
用到的模块或者技术: Express: http://www.expressjs.com.cn/4x/api.html#express Easyui: http://www.jeasyui.com
用户1141560
2017/12/26
3.2K0
easyui+nodejs+sqlserver增删改查实现
MsSQL编程入门-待补充
https://www.cnblogs.com/rainman/p/6203065.html
全栈工程师修炼指南
2022/09/29
7280
MsSQL编程入门-待补充
SQL server数据库用户映射到登陆用户
    最近有朋友的SQL server数据库意外中枪,几经周折,数据将数据库恢复到新环境。恢复后在数据库级别有用户名而实例级别则无相应的登陆用户。这在SQL server数据库中是一个比较普遍的情形。本文描述的是即是对这些孤立的账户通过系统过程sp_change_users_login来建立其映射关系。
Leshami
2018/08/13
2.5K0
【YashanDB 知识库】YashanDB 安全设置示例
密码复杂度开关打开,打开后密码必须满足:①至少八位长度 ② 数字+大小写+特殊字符
用户10349277
2025/02/28
1110
【DB宝84】使用OGG for MSSQL微服务快速双向同步RDS数据库(双主)
OGG有传统的经典架构,也有最新的微服务,2个都可以远程捕获和应用数据,对数据库服务器是0侵入,而传统的经典架构是纯命令行模式,最新的微服务架构是图形化界面操作,几乎所有操作都可以在界面进行。
AiDBA宝典
2022/02/23
2.9K0
【DB宝84】使用OGG for MSSQL微服务快速双向同步RDS数据库(双主)
干货 | MSSQL注入和漏洞利用姿势总结
Microsoft SQL Server 是微软开发的关系型数据库管理系统。作为数据库服务器,它是一种软件产品,主要功能是根据其他软件应用程序的请求存储和检索数据,这些应用程序可以在同一台计算机上运行,也可以在网络(包括 Internet)上的另一台计算机上运行。SQL Server 默认开放的端口是 TCP 1433。
HACK学习
2023/01/03
7.9K0
干货 | MSSQL注入和漏洞利用姿势总结
数据库结构同步之通过DDL触发器记录数据库结构的变更
1.FOR DROP_TABLE, ALTER_TABLE ,CREATE_TABLE   这里只记录了这几个事件
liulun
2022/05/09
8090
在Docker中快速使用SQL Server 2022环境
docker hub地址:https://hub.docker.com/_/microsoft-mssql-server
AiDBA宝典
2023/04/27
5.5K0
在Docker中快速使用SQL Server 2022环境
SQLServer中使用登录触发器限制用户的访问地址
目前有个需求,需要限制个别账号(或者其他权限较高的账号)的登录IP,降低访问的风险。
保持热爱奔赴山海
2024/09/24
4530
推荐阅读
相关推荐
SQLServer开启服务器审计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档