【数据库】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 的复杂性要求(长度、字符种类等),并不包含失败计数锁定功能。
  • • 为何会被锁定?
    1. 手动禁用:管理员通过 ALTER LOGIN [name] DISABLE 禁用了账户。
    1. 映射关系:如果该 SQL 登录名实际上映射到了一个 Windows 主体(较少见,通常 SQL 登录名是独立的),则受 Windows 策略影响。
    1. 误解:很多时候,应用报错“登录失败”被误认为是“账户锁定”,实际上只是密码错误。
    1. 第三方扩展/审计:某些企业安全插件或触发器可能模拟了这种行为,但这并非 SQL Server 引擎的标准功能。

1.5 密码复杂度策略

在 Windows Server 2012 及更高版本(包括 2016, 2019, 2022)上,创建新的 SQL 登录名时,CHECK_POLICY 的默认值通常是 ON。

如果此策略被启用,密码必须满足以下条件👇:

    1. 不包含用户名:密码不能包含用户账户名(SAM Account Name)或全名的一部分(超过两个连续字符)。
    1. 长度:至少 6 个字符(这是 Windows API 的硬性下限,尽管最佳实践建议更长)。
    1. 字符种类:必须包含以下四类字符中的三类:
  • • 英文大写字母 (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_disabledguest 账户是否禁用0 = 启用(高风险),1= 禁用(安全)
type_desc账户类型固定为 SQL_USER,是系统内置账户
principal_id主体 IDguest 账户的固定 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)

大纲

首先要找一份详细的大纲。
在这里插入图片描述

学习教程

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

img

该阶段学完即可年薪15w+

第二阶段:技术入门

弱口令与口令爆破
XSS漏洞
CSRF漏洞
SSRF漏洞
XXE漏洞
SQL注入
任意文件操作漏洞
业务逻辑漏洞

该阶段学完年薪25w+
在这里插入图片描述

阶段三:高阶提升

反序列化漏洞
RCE
综合靶场实操项目
内网渗透
流量分析
日志分析
恶意代码分析
应急响应
实战训练

该阶段学完即可年薪30w+

面试刷题

img

在这里插入图片描述

最后,我其实要给部分人泼冷水,因为说实话,上面讲到的资料包获取没有任何的门槛。

但是,我觉得很多人拿到了却并不会去学习。

大部分人的问题看似是“如何行动”,其实是“无法开始”。

几乎任何一个领域都是这样,所谓“万事开头难”,绝大多数人都卡在第一步,还没开始就自己把自己淘汰出局了。

如果你真的确信自己喜欢网络安全/黑客技术,马上行动起来,比一切都重要。

资料领取

上述这份完整版的网络安全学习资料已经上传网盘,朋友们如果需要可以微信扫描下方二维码 ↓↓↓ 或者 点击以下链接都可以领取

点击领取 《网络安全&黑客&入门进阶学习资源包》

在这里插入图片描述

文章来自网上,侵权请联系博主

结语

网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

特别声明:

此教程为纯技术分享!本书的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本书的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失!!!

本文转自 https://blog.csdn.net/2402_84205067/article/details/159923264?spm=1001.2014.3001.5502,如有侵权,请联系删除。

更多推荐