【数据库】MSSQL等保核查命令大全|亲测有效_+_持续更新
【数据库】MSSQL等保核查命令大全|亲测有效 + 持续更新
解决以下3个痛点:
1️⃣能查到的大部分检查命令没有运行结果的截图,无法确定命令是否有效。
2️⃣不同版本的被侧目标可能使用不同的命令,过时或者较新的命令可能无法有效运行,明显降低检查效率**。**
3️⃣网络公开的检查方法整体缺乏系统性与持续维护
💽测试环境:虚拟机
💽测试镜像版本:cn_windows_server_2019_updated_july_2020_x64_dvd_2c9b67da.iso
💽数据库版本:Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
目录结构:
一、身份认证与账户策略 * 1.1 认证模式检查 * 1.2 sa 账户状态 * 1.3 空账户 * 1.4 登录失败锁定【未查看】 + 使用 Windows 身份验证 + 使用 SQL Server 身份验证 (如 sa 账户) * 1.5 密码复杂度策略 二、权限管理与最小特权 * 2.1 sysadmin 成员列表 * 2.2 公共角色权限 (public) * 2.3 Guest 用户状态 * 2.4 xp_cmdshell 状态 * 2.5 其他扩展存储过程状态查询 | 三、网络与表面面积配置 * 3.1 端口/IP 查看 * 3.2 检查远程连接开关 * 3.3 加密连接 四、审计与日志 * 4.1 登录审计 * 4.2 日志轮转 * 4.3 日志信息 * 4.4 默认跟踪配置 五、数据保护与加密 * 5.1 数据库加密状态 * 5.2 敏感数据列加密 六、补丁安全 * 6.1 补丁/版本查看 |
一、身份认证与账户策略
1.1 认证模式检查
1 (仅 Windows 认证) ,若为混合模式 (0),需确保 sa 已禁用或强密码。
SELECT SERVERPROPERTY('IsIntegratedSecurityOnly');

| 返回值 | 含义 | 身份验证模式 |
|---|---|---|
| 1 | 仅集成身份验证 | Windows 身份验证 (只能用 Windows 账号登录,不支持 SQL Server 独立账号密码) |
| 0 | 混合模式身份验证 | SQL Server 和 Windows 身份验证 (既可以用 Windows 账号,也可以用 sa 等独立账号登录) |
1.2 sa 账户状态
is_disabled = 1 (禁用) ,若必须启用,必须重命名且设置强密码。
SELECT name, is_disabled FROM sys.sql_logins WHERE name = 'sa';

1.3 空账户
默认结果为空 ,严禁存在无密码账户。
SELECT name FROM sys.sql_logins WHERE password_hash IS NULL;

1.4 登录失败锁定【未查看】
使用 Windows 身份验证
- • 当你使用 Windows 账户(如
DOMAIN\User)登录 SQL Server 时,SQL Server 完全依赖 Windows 操作系统进行身份验证。 - • 如果该 Windows 账户因为在其他服务(如远程桌面、文件共享)中密码输入错误过多而触发了 Windows 账户锁定策略,那么该账户在尝试登录 SQL Server 时也会失败,并提示账户已锁定。
- • 此时,SQL Server 只是“传递”了 Windows 的锁定状态。
使用 SQL Server 身份验证 (如 sa 账户)
- • 原生行为:SQL Server 2019 默认没有“连续失败 X 次自动锁定 Y 分钟”的原生配置功能。即使你开启了“强制实施密码策略” (
CHECK_POLICY = ON),这也只是强制密码符合 Windows 的复杂性要求(长度、字符种类等),并不包含失败计数锁定功能。 - • 为何会被锁定?
-
- 手动禁用:管理员通过
ALTER LOGIN [name] DISABLE禁用了账户。
- 手动禁用:管理员通过
-
- 映射关系:如果该 SQL 登录名实际上映射到了一个 Windows 主体(较少见,通常 SQL 登录名是独立的),则受 Windows 策略影响。
-
- 误解:很多时候,应用报错“登录失败”被误认为是“账户锁定”,实际上只是密码错误。
-
- 第三方扩展/审计:某些企业安全插件或触发器可能模拟了这种行为,但这并非 SQL Server 引擎的标准功能。
1.5 密码复杂度策略
在 Windows Server 2012 及更高版本(包括 2016, 2019, 2022)上,创建新的 SQL 登录名时,CHECK_POLICY 的默认值通常是 ON。
如果此策略被启用,密码必须满足以下条件👇:
-
- 不包含用户名:密码不能包含用户账户名(SAM Account Name)或全名的一部分(超过两个连续字符)。
-
- 长度:至少 6 个字符(这是 Windows API 的硬性下限,尽管最佳实践建议更长)。
-
- 字符种类:必须包含以下四类字符中的三类:
- • 英文大写字母 (A-Z)
- • 英文小写字母 (a-z)
- • 数字 (0-9)
- • 非字母数字符号 (例如:! $ # %)
SELECT
name AS 登录名,
is_policy_checked AS 是否启用密码策略,
is_expiration_checked AS 是否启用密码过期,
type_desc AS 登录类型
FROM sys.sql_logins -- 只查SQL身份验证登录
ORDER BY name;

针对单一用户的检查方式:SQL Server 2019 Management Studio → 安全性 → 登录名 → 属性

二、权限管理与最小特权
2.1 sysadmin 成员列表
仅限必要管理员加入,严禁应用账号、普通用户加入此角色。
EXEC sp_helpsrvrolemember 'sysadmin';

2.2 公共角色权限 (public)
- • 每个数据库都有
public角色,所有数据库用户(包括新建的用户)默认自动成为其成员; - • 给
public授权 = 给所有用户授权,因此严禁给 public 分配过高权限(如ALTER、CONTROL、DELETE等)。 - • 全新数据库中,
public仅默认拥有CONNECT(连接数据库)、VIEW ANY COLUMN ENCRYPTION KEY DEFINITION等基础权限,这是正常的; - • 若输出中出现
SELECT、INSERT、EXECUTE等权限,说明有人给public额外授权,存在权限风险。
SELECT * FROM sys.database_permissions WHERE grantee_principal_id = 0;

2.3 Guest 用户状态
排查 guest 账户(数据库默认来宾账户)权限风险。
SELECT * FROM sys.database_principals WHERE name = 'guest';

| 字段名 | 含义 | 关键说明 |
|---|---|---|
is_disabled | guest 账户是否禁用 | 0 = 启用(高风险),1= 禁用(安全) |
type_desc | 账户类型 | 固定为 SQL_USER,是系统内置账户 |
principal_id | 主体 ID | guest 账户的固定 ID 为 2,不可修改 |
2.4 xp_cmdshell 状态
查看 xp_cmdshell 的启用状态,run_value = 1 是高风险状态,生产环境必须设为 0;
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell';

2.5 其他扩展存储过程状态查询
USE master;
GO
SELECT
'sp_OACreate' AS 扩展存储过程名,
CASE WHEN EXISTS (
SELECT 1 FROM sys.objects
WHERE name = 'sp_OACreate' AND type = 'P' AND schema_id = 4 -- schema_id=4 是 sys 架构
) THEN '存在' ELSE '已删除' END AS 存在状态,
-- 检查 OLE 自动化功能是否启用(控制 sp_OACreate 能否执行)
(SELECT CAST(value_in_use AS VARCHAR) FROM sys.configurations WHERE name = 'Ole Automation Procedures') AS OLE自动化启用状态,
'高风险:可创建OLE对象执行系统操作' AS 风险等级
UNION ALL
SELECT
'xp_regread' AS 扩展存储过程名,
CASE WHEN EXISTS (
SELECT 1 FROM sys.objects
WHERE name = 'xp_regread' AND type = 'P' AND schema_id = 4
) THEN '存在' ELSE '已删除' END AS 存在状态,
'无独立开关,存在即可能执行' AS 启用状态说明,
'中高风险:可读取注册表敏感配置' AS 风险等级
UNION ALL
SELECT
'xp_dirtree' AS 扩展存储过程名,
CASE WHEN EXISTS (
SELECT 1 FROM sys.objects
WHERE name = 'xp_dirtree' AND type = 'P' AND schema_id = 4
) THEN '存在' ELSE '已删除' END AS 存在状态,
'无独立开关,存在即可能执行' AS 启用状态说明,
'中风险:可遍历服务器文件目录,泄露路径信息' AS 风险等级
UNION ALL
SELECT
'xp_cmdshell' AS 扩展存储过程名,
CASE WHEN EXISTS (
SELECT 1 FROM sys.objects
WHERE name = 'xp_cmdshell' AND type = 'P' AND schema_id = 4
) THEN '存在' ELSE '已删除' END AS 存在状态,
(SELECT CAST(value_in_use AS VARCHAR) FROM sys.configurations WHERE name = 'xp_cmdshell') AS 启用状态,
'极高风险:执行系统CMD命令' AS 风险等级;
GO

三、网络与表面面积配置
3.1 端口/IP查看
- • 端口建议修改为非常用高位端口。
- • IP仅限非公网地址。
配置管理器 -> SQL server网络配置 -> MSSQLSERVER的协议 -> 属性 -> 强制加密

3.2 检查远程连接开关
EXEC sp_configure 'remote access';

远程DAC查看,run_value = 0 → 合规(仅本地可用,推荐); run_value = 1 → 不合规(允许远程使用DAC,高风险)。
USE master;
GO
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'remote admin connections';

3.3 加密连接
需要改为 Yes,同时需提前配置服务器证书(否则用自签名证书)。
配置管理器 -> SQL server网络配置 -> MSSQLSERVER的协议 -> 属性 -> 强制加密

四、审计与日志
4.1 登录审计
数据库管理工具 -> 数据库名 -> 属性 -> 安全性 -> 登录审核

4.2 日志轮转
数据库管理工具 -> 管理 -> SQL Server 日志 -> 右键(配置)

4.3 日志信息
查看日志记录了的信息格式
数据库管理工具 -> 管理 -> SQL Server 日志 -> 选择对应日期的日志

4.4 默认跟踪配置
默认跟踪是 SQL Server 最轻量化的审计工具,几乎不消耗服务器资源,能自动记录以下关键操作(安全审计必备):
- • 数据库对象的创建 / 修改 / 删除(表、存储过程、视图等);
- • 登录账户的权限变更、创建 / 删除;
- • 数据库备份 / 还原、分离 / 附加操作;
- • 服务器配置选项的修改。
status = 1 (运行中) ,用于记录部分 DDL 操作和性能事件。
SELECT * FROM sys.traces WHERE is_default = 1;

五、数据保护与加密
5.1 数据库加密状态
TDE(透明数据加密)是 SQL Server 对数据库文件的实时加密 / 解密,作用是:
- • 防止攻击者窃取数据库文件(.mdf/.ldf)后直接附加读取数据;
- • TDE 保护的是数据库文件本身,而非传输过程(传输加密需配合 “强制加密连接”);
- • 启用 TDE 后,务必备份加密证书和私钥,这是数据库恢复的关键。
SELECT db.name, dek.encryption_state FROM sys.databases db LEFT JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id;

进阶版:
USE master;
GO
SELECT
db.name AS 数据库名,
dek.encryption_state,
CASE dek.encryption_state
WHEN 0 THEN '未加密(无加密密钥)'
WHEN 1 THEN '未加密(有密钥但未启用)'
WHEN 2 THEN '加密进行中'
WHEN 3 THEN '已加密(合规)'
WHEN 4 THEN '密钥变更进行中'
WHEN 5 THEN '解密进行中'
WHEN 6 THEN '保护程序变更进行中'
ELSE '未知状态' END AS 加密状态说明,
dek.encryptor_type AS 加密器类型
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dek
ON db.database_id = dek.database_id
ORDER BY db.name;

| 字段 / 值 | 含义 & 合规要求 |
|---|---|
encryption_state = 3 | 数据库已启用 TDE 加密(合规状态,核心业务库推荐配置) |
encryption_state = 0/NULL | 未加密(无加密密钥,非核心库可接受,核心库高风险) |
tempdb 加密状态 | 只要实例中有任意数据库启用 TDE,tempdb 会自动加密(属于正常现象) |
encryptor_type | 加密器类型:CERTIFICATE(证书,推荐)、ASYMMETRIC KEY(非对称密钥) |
5.2 敏感数据列加密
实机核查密码、电话、身份证等敏感信息是否加密。
非通用型手段【根据实际列命名决定】:
-- 遍历所有用户数据库,检查敏感列加密状态
DECLARE @DBName NVARCHAR(128);
DECLARE @SQL NVARCHAR(MAX);
-- 创建临时表存储检查结果
CREATE TABLE#SensitiveColumns (
数据库名 NVARCHAR(128),
表名 NVARCHAR(128),
列名 NVARCHAR(128),
数据类型 NVARCHAR(128),
是否AlwaysEncrypted BIT,
加密类型 NVARCHAR(50),
风险等级 NVARCHAR(10)
);
-- 遍历所有用户数据库(排除系统库)
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')
AND state = 0; -- 仅检查在线数据库
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @DBName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = N'
USE [' + @DBName + N'];
INSERT INTO #SensitiveColumns
SELECT
''' + @DBName + N''' AS 数据库名,
SCHEMA_NAME(t.schema_id) + ''.'' + t.name AS 表名,
c.name AS 列名,
ty.name AS 数据类型,
CASE WHEN c.encryption_type IS NOT NULL THEN 1 ELSE 0 END AS 是否AlwaysEncrypted,
ISNULL(c.encryption_type_desc, ''未加密'') AS 加密类型,
CASE WHEN c.encryption_type IS NULL AND (
c.name LIKE ''%idcard%'' OR c.name LIKE ''%id_number%'' OR -- 身份证相关列
c.name LIKE ''%phone%'' OR c.name LIKE ''%mobile%'' OR -- 手机号相关列
c.name LIKE ''%password%'' OR c.name LIKE ''%pwd%'' OR -- 密码相关列
c.name LIKE ''%bank%'' OR c.name LIKE ''%card_no%'' -- 银行卡相关列
) THEN ''高风险'' ELSE ''合规'' END AS 风险等级
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
JOIN sys.types ty ON c.system_type_id = ty.system_type_id
WHERE
-- 匹配敏感列命名规则(可根据业务调整)
c.name LIKE ''%idcard%''
OR c.name LIKE ''%id_number%''
OR c.name LIKE ''%phone%''
OR c.name LIKE ''%mobile%''
OR c.name LIKE ''%password%''
OR c.name LIKE ''%pwd%''
OR c.name LIKE ''%bank%''
OR c.name LIKE ''%card_no%'';';
EXEC sp_executesql @SQL;
FETCH NEXT FROM db_cursor INTO @DBName;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
-- 输出检查结果
SELECT * FROM#SensitiveColumns
WHERE 风险等级 = '高风险' -- 仅显示未加密的敏感列
ORDER BY 数据库名, 表名, 列名;
-- 清理临时表
DROP TABLE#SensitiveColumns;

六、补丁安全
6.1 补丁/版本查看
SELECT
@@VERSION AS 完整版本信息,
SERVERPROPERTY('ProductVersion') AS 产品版本号, -- 核心:用于匹配补丁
SERVERPROPERTY('ProductLevel') AS 补丁级别, -- RTM/SPx/CUx/GDR
SERVERPROPERTY('Edition') AS 版本类型, -- 企业版/标准版/开发版
SERVERPROPERTY('BuildClrVersion') AS CLR版本,
SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS 服务器名;

关键标识说明:
- •
RTM:初始发布版本(无补丁,必须升级); - •
SPx:服务包(Service Pack,大版本补丁); - •
CUx:累积更新(Cumulative Update,月度安全补丁); - •
GDR:安全更新(仅修复高危漏洞,无功能更新)。 -
[]
学习资源

为了帮助大家更好的塑造自己,成功转型,我给大家准备了一份网络安全入门/进阶学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂这些资料!
网络安全/黑客零基础入门
【----帮助网安学习,以下所有学习资料文末免费领取!----】
> ① 网安学习成长路径思维导图
> ② 60+网安经典常用工具包
> ③ 100+SRC漏洞分析报告
> ④ 150+网安攻防实战技术电子书
> ⑤ 最权威CISSP 认证考试指南+题库
> ⑥ 超1800页CTF实战技巧手册
> ⑦ 最新网安大厂面试题合集(含答案)
> ⑧ APP客户端安全检测指南(安卓+IOS)
大纲
首先要找一份详细的大纲。

学习教程
第一阶段:零基础入门系列教程

该阶段学完即可年薪15w+
第二阶段:技术入门
弱口令与口令爆破
XSS漏洞
CSRF漏洞
SSRF漏洞
XXE漏洞
SQL注入
任意文件操作漏洞
业务逻辑漏洞
该阶段学完年薪25w+

阶段三:高阶提升
反序列化漏洞
RCE
综合靶场实操项目
内网渗透
流量分析
日志分析
恶意代码分析
应急响应
实战训练
该阶段学完即可年薪30w+
面试刷题


最后,我其实要给部分人泼冷水,因为说实话,上面讲到的资料包获取没有任何的门槛。
但是,我觉得很多人拿到了却并不会去学习。
大部分人的问题看似是“如何行动”,其实是“无法开始”。
几乎任何一个领域都是这样,所谓“万事开头难”,绝大多数人都卡在第一步,还没开始就自己把自己淘汰出局了。
如果你真的确信自己喜欢网络安全/黑客技术,马上行动起来,比一切都重要。
资料领取
上述这份完整版的网络安全学习资料已经上传网盘,朋友们如果需要可以微信扫描下方二维码 ↓↓↓ 或者 点击以下链接都可以领取

文章来自网上,侵权请联系博主
结语
网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。
特别声明:
此教程为纯技术分享!本书的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本书的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失!!!
本文转自 https://blog.csdn.net/2402_84205067/article/details/159923264?spm=1001.2014.3001.5502,如有侵权,请联系删除。
更多推荐
所有评论(0)