等保测评命令——SQL server

依据 GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》等保2.0三级 标准,针对 SQL Server 2016/2017/2019/2022 给出可直接落地的测评 T-SQL 查询语句清单。


一、身份鉴别(8.1.4.1)

1.1 登录账户与密码策略

测评项T-SQL 查询语句达标判据
查看所有登录账户SELECT * FROM sys.sql_logins无默认账户(如sa)滥用
检查密码策略启用SELECT is_policy_checked, is_expiration_checked FROM sys.sql_logins均为1
查看登录失败次数SELECT login_time, program_name FROM sys.dm_exec_sessions监控异常登录
检查Windows认证SELECT * FROM sys.server_principals WHERE type IN ('U', 'G')优先使用Windows认证
-- 1. 查看所有SQL Server登录账户(SQL认证)
SELECT
    name AS[登录名],
    sid AS[安全标识],
    create_date AS[创建时间],
    modify_date AS[修改时间],
    is_policy_checked AS[已检查密码策略],
    is_expiration_checked AS[已检查密码过期],
    is_disabled AS[是否禁用]
FROM sys.sql_logins
ORDERBY name;

-- 2. 查看所有服务器主体(包含Windows认证)
SELECT
    name,
    type_desc AS[类型],
    is_disabled,
    create_date,
    modify_date,
    default_database_name
FROM sys.server_principals
WHEREtypeIN('S','U','G','R')-- S=SQL用户, U=Windows用户, G=Windows组, R=角色
ORDERBY type_desc, name;

-- 3. 检查密码策略未启用的登录(高风险)
SELECT
    name,
    is_policy_checked,
    is_expiration_checked,
CASE
WHEN is_policy_checked =0THEN'未启用密码策略'
WHEN is_expiration_checked =0THEN'未启用密码过期'
ELSE'合规'
ENDAS[状态]
FROM sys.sql_logins
WHERE is_policy_checked =0OR is_expiration_checked =0;

-- 4. 检查sa账户状态(必须禁用或强密码)
SELECT
    name,
    is_disabled,
    is_policy_checked,
    is_expiration_checked,
    modify_date
FROM sys.sql_logins
WHERE name ='sa';

-- 5. 查看最近登录失败记录(需启用登录审计)
SELECT
    login_time,
    program_name,
    client_net_address,
    status_desc
FROM sys.dm_exec_sessions s
JOIN sys.dm_exec_connections c ON s.session_id = c.session_id
LEFTJOIN sys.dm_exec_requests r ON s.session_id = r.session_id
WHERE s.status='sleeping'
ORDERBY s.login_time DESC;

1.2 密码复杂度与有效期

-- 6. 查看SQL Server密码策略配置(依赖Windows策略或SQL Server策略)
-- 检查是否强制实施密码策略
SELECT
    SERVERPROPERTY('IsIntegratedSecurityOnly')AS[仅Windows认证],
    SERVERPROPERTY('InstanceDefaultDataPath')AS[默认数据路径];

-- 7. 查看登录密码最后修改时间
SELECT
    name,
    modify_date AS[密码最后修改时间],
    DATEDIFF(day, modify_date, GETDATE())AS[密码使用天数],
CASE
WHEN DATEDIFF(day, modify_date, GETDATE())>90THEN'建议更换'
ELSE'正常'
ENDAS[状态]
FROM sys.sql_logins
WHERE is_policy_checked =1;

-- 8. 检查空密码或弱密码登录(通过登录属性)
SELECT
    name,
    LOGINPROPERTY(name,'PasswordHash')AS[密码哈希],
    LOGINPROPERTY(name,'PasswordLastSetTime')AS[密码设置时间],
    LOGINPROPERTY(name,'BadPasswordCount')AS[错误密码次数],
    LOGINPROPERTY(name,'BadPasswordTime')AS[最后错误时间],
    LOGINPROPERTY(name,'HistoryLength')AS[历史密码长度],
    LOGINPROPERTY(name,'LockoutTime')AS[锁定时间]
FROM sys.sql_logins
WHERE is_policy_checked =1;

1.3 登录失败处理与会话超时

测评项T-SQL 查询语句达标判据
检查登录锁定策略SELECT * FROM sys.sql_logins WHERE LOGINPROPERTY(name, 'IsLocked') = 1失败锁定生效
查看连接超时设置EXEC sp_configure 'remote query timeout'配置合理值
检查空闲超时EXEC sp_configure 'user options'配置超时参数
-- 9. 查看当前被锁定的登录账户
SELECT
    name,
    LOGINPROPERTY(name,'IsLocked')AS[是否锁定],
    LOGINPROPERTY(name,'LockoutTime')AS[锁定时间],
    LOGINPROPERTY(name,'BadPasswordCount')AS[失败次数]
FROM sys.sql_logins
WHERE LOGINPROPERTY(name,'IsLocked')=1;

-- 10. 查看SQL Server高级配置(超时相关)
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'remote query timeout (s)';
EXEC sp_configure 'remote login timeout (s)';
EXEC sp_configure 'query wait (s)';

-- 11. 查看用户连接选项(空闲超时)
DBCC USEROPTIONS;

-- 12. 查看当前活动连接和空闲时间
SELECT
    s.session_id,
    s.login_name,
    s.program_name,
    s.login_time,
    s.last_request_start_time,
    s.last_request_end_time,
    DATEDIFF(second, s.last_request_end_time, GETDATE())AS[空闲秒数],
    c.client_net_address
FROM sys.dm_exec_sessions s
LEFTJOIN sys.dm_exec_connections c ON s.session_id = c.session_id
WHERE s.status='sleeping'
AND DATEDIFF(second, s.last_request_end_time, GETDATE())>600-- 空闲超过10分钟
ORDERBY[空闲秒数]DESC;

二、访问控制(8.1.4.2)

2.1 权限管理与角色分离

测评项T-SQL 查询语句达标判据
查看固定服务器角色成员SELECT * FROM sys.server_role_members最小权限原则
检查数据库角色权限SELECT * FROM sys.database_permissions按库分配权限
查看对象级权限SELECT * FROM sys.database_permissions WHERE class = 1精细化授权
检查权限继承SELECT * FROM fn_my_permissions(NULL, 'SERVER')权限清晰
-- 13. 查看固定服务器角色及其成员
SELECT
    r.name AS[角色名],
    m.name AS[成员登录名],
    r.type_desc AS[角色类型]
FROM sys.server_role_members rm
JOIN sys.server_principals r ON rm.role_principal_id = r.principal_id
JOIN sys.server_principals m ON rm.member_principal_id = m.principal_id
ORDERBY r.name, m.name;

-- 14. 查看具有sysadmin权限的登录(最高权限,需严格审查)
SELECT
    l.name AS[登录名],
    l.type_desc AS[类型],
    r.name AS[服务器角色],
'拥有完全控制权'AS[权限说明]
FROM sys.server_role_members rm
JOIN sys.server_principals r ON rm.role_principal_id = r.principal_id
JOIN sys.server_principals l ON rm.member_principal_id = l.principal_id
WHERE r.name ='sysadmin'
ORDERBY l.name;

-- 15. 查看每个数据库的用户和权限
EXEC sp_MSforeachdb '
USE [?];
SELECT 
    DB_NAME() AS [数据库名],
    u.name AS [用户名],
    u.type_desc AS [类型],
    r.name AS [数据库角色],
    p.permission_name AS [权限],
    p.state_desc AS [权限状态]
FROM sys.database_principals u
LEFT JOIN sys.database_role_members rm ON u.principal_id = rm.member_principal_id
LEFT JOIN sys.database_principals r ON rm.role_principal_id = r.principal_id
LEFT JOIN sys.database_permissions p ON u.principal_id = p.grantee_principal_id
WHERE u.type IN (''S'', ''U'', ''G'', ''R'')
ORDER BY u.name;
';

-- 16. 查看特定对象的权限分配(以表为例)
SELECT
    o.name AS[对象名],
    u.name AS[被授予者],
    p.permission_name AS[权限],
    p.state_desc AS[状态]
FROM sys.database_permissions p
JOIN sys.objects o ON p.major_id = o.object_id
JOIN sys.database_principals u ON p.grantee_principal_id = u.principal_id
WHERE p.class =1AND o.type='U'-- U=用户表
ORDERBY o.name, u.name;

-- 17. 检查直接授权(非角色授权,建议最小化)
SELECT
    grantee.name AS[被授予者],
    grantor.name AS[授权者],
    p.permission_name,
    p.state_desc,
    o.name AS[对象名]
FROM sys.database_permissions p
JOIN sys.database_principals grantee ON p.grantee_principal_id = grantee.principal_id
JOIN sys.database_principals grantor ON p.grantor_principal_id = grantor.principal_id
LEFTJOIN sys.objects o ON p.major_id = o.object_id
WHERE grantee.typeIN('S','U')-- 直接用户授权
AND p.major_id >0-- 排除数据库级权限
ORDERBY grantee.name;

2.2 数据库级访问控制

-- 18. 查看所有数据库及所有者
SELECT
    name AS[数据库名],
    SUSER_SNAME(owner_sid)AS[所有者],
    is_trustworthy_on AS[可信数据库],
    is_db_chaining_on AS[跨库链],
    is_broker_enabled AS[Service Broker],
    is_encrypted AS[已加密],
    create_date,
    compatibility_level
FROM sys.databases
ORDERBY name;

-- 19. 检查guest用户权限(应禁用)
EXEC sp_MSforeachdb '
USE [?];
SELECT 
    DB_NAME() AS [数据库],
    name,
    permission_name,
    state_desc
FROM sys.database_permissions p
JOIN sys.database_principals u ON p.grantee_principal_id = u.principal_id
WHERE u.name = ''guest'';
';

-- 20. 查看数据库角色及其成员
EXEC sp_helprole;
EXEC sp_helprolemember;

-- 21. 查看应用程序角色(特殊角色)
SELECT
    name,
    default_schema_name,
    create_date,
    modify_date,
    authentication_type_desc
FROM sys.database_principals
WHEREtype='A';-- A=应用程序角色

三、安全审计(8.1.4.3)

3.1 SQL Server审计配置

测评项T-SQL 查询语句达标判据
检查服务器审计SELECT * FROM sys.server_audits审计已启用
查看审计规范SELECT * FROM sys.server_audit_specifications覆盖关键操作
检查数据库审计SELECT * FROM sys.database_audits数据库级审计
查看审计日志路径SELECT * FROM sys.server_file_audits安全存储路径
-- 22. 查看服务器级审计配置
SELECT
    name AS[审计名],
    type_desc AS[类型],
    status_desc AS[状态],
    is_state_enabled AS[已启用],
    create_date,
    modify_date
FROM sys.server_audits;

-- 23. 查看审计详细配置(文件路径、大小等)
SELECT
    name,
    type_desc,
    status_desc,
    is_state_enabled,
    audit_file_path AS[文件路径],
    max_file_size AS[最大文件大小],
    max_rollover_files AS[最大轮转文件数],
    queue_delay AS[队列延迟毫秒],
    on_failure_desc AS[失败时操作]
FROM sys.server_audits
WHERE type_desc ='FILE';

-- 24. 查看服务器审计规范(审计哪些操作)
SELECT
    s.name AS[审计名],
    sp.name AS[规范名],
    sp.is_state_enabled AS[规范启用],
    audit_action_name AS[审计动作],
    class_desc AS[对象类型],
    is_group AS[是否动作组]
FROM sys.server_audit_specifications sp
JOIN sys.server_audits s ON sp.audit_guid = s.audit_guid
JOIN sys.server_audit_specification_details spd ON sp.server_specification_id = spd.server_specification_id
WHERE sp.is_state_enabled =1;

-- 25. 查看数据库级审计(所有数据库)
EXEC sp_MSforeachdb '
USE [?];
IF EXISTS (SELECT 1 FROM sys.database_audits)
SELECT 
    DB_NAME() AS [数据库],
    name AS [审计名],
    type_desc,
    is_state_enabled,
    audit_file_path
FROM sys.database_audits;
';

-- 26. 查看数据库审计规范
EXEC sp_MSforeachdb '
USE [?];
IF EXISTS (SELECT 1 FROM sys.database_audit_specifications)
SELECT 
    DB_NAME() AS [数据库],
    sp.name AS [规范名],
    sp.is_state_enabled,
    spd.audit_action_name,
    spd.class_desc
FROM sys.database_audit_specifications sp
JOIN sys.database_audit_specification_details spd ON sp.database_specification_id = spd.database_specification_id;
';

-- 27. 查看当前审计日志状态(最近写入时间)
SELECT
    name,
    status_desc,
    type_desc,
    audit_file_path,
(SELECTMAX(event_time)FROM sys.fn_get_audit_file(audit_file_path,DEFAULT,DEFAULT))AS[最后事件时间]
FROM sys.server_audits
WHERE type_desc ='FILE'AND status_desc ='STARTED';

3.2 扩展事件与日志分析

-- 28. 查看扩展事件会话(XEvents,轻量级审计)
SELECT
    name,
    status_desc AS[状态],
    start_time,
    target_name AS[目标类型]
FROM sys.dm_xe_sessions
ORDERBY name;

-- 29. 查看默认跟踪是否启用(SQL Server 2016及之前)
SELECT
status,
    path,
    max_size,
    stop_time
FROM sys.traces
WHERE is_default =1;

-- 30. 查看错误日志配置
EXEC xp_readerrorlog 0,1, N'Logging';-- 查看日志配置信息

-- 31. 查看最近登录审计(需启用审计或扩展事件)
-- 方法1:使用fn_get_audit_file读取审计文件
SELECT
    event_time,
    action_id,
    action_name,
    succeeded,
    session_server_principal_name AS[登录名],
    server_instance_name,
    database_name,
    schema_name,
    object_name,
    statement
FROM sys.fn_get_audit_file('D:\SQLAudit\*.sqlaudit',DEFAULT,DEFAULT)
WHERE action_name IN('LOGIN','LOGOUT','FAILED_LOGIN_GROUP')
ORDERBY event_time DESC
OFFSET0ROWSFETCHNEXT100ROWS ONLY;

-- 32. 查看权限变更审计记录
SELECT
    event_time,
    action_name,
    session_server_principal_name,
    database_name,
    schema_name,
    object_name,
    statement,
    succeeded
FROM sys.fn_get_audit_file('D:\SQLAudit\*.sqlaudit',DEFAULT,DEFAULT)
WHERE action_name IN('GRANT','REVOKE','DENY','ALTER','CREATE','DROP')
ORDERBY event_time DESC;

四、入侵防范(8.1.4.4)

4.1 配置安全与漏洞修复

测评项T-SQL 查询语句达标判据
检查SQL Server版本SELECT @@VERSION官方支持版本
查看补丁级别SELECT SERVERPROPERTY('ProductLevel')最新SP/CU
检查危险存储过程EXEC sp_helptext 'xp_cmdshell'应禁用
查看OLE自动化EXEC sp_configure 'Ole Automation Procedures'应禁用
-- 33. 查看SQL Server详细版本信息
SELECT
    @@VERSIONAS[完整版本],
    SERVERPROPERTY('ProductVersion')AS[产品版本],
    SERVERPROPERTY('ProductLevel')AS[补丁级别],-- RTM/SP1/SP2/CUxx
    SERVERPROPERTY('Edition')AS[版本类型],
    SERVERPROPERTY('InstanceName')AS[实例名],
    SERVERPROPERTY('MachineName')AS[计算机名],
    SERVERPROPERTY('IsClustered')AS[是否集群],
    SERVERPROPERTY('IsFullTextInstalled')AS[全文搜索],
    SERVERPROPERTY('IsIntegratedSecurityOnly')AS[仅Windows认证];

-- 34. 查看所有SQL Server配置选项(高级选项)
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure;

-- 35. 检查危险存储过程和扩展存储过程
-- xp_cmdshell(命令执行)
EXEC sp_configure 'xp_cmdshell';
-- 应返回:config_value=0, run_value=0

-- 36. 检查OLE自动化(调用COM对象)
EXEC sp_configure 'Ole Automation Procedures';

-- 37. 检查CLR集成(代码执行风险)
EXEC sp_configure 'clr enabled';

-- 38. 检查数据库邮件(数据外泄风险)
EXEC sp_configure 'Database Mail XPs';

-- 39. 检查SMO和DMO(管理对象)
EXEC sp_configure 'SMO and DMO XPs';

-- 40. 检查xp_regread等注册表访问
-- 这些没有显式配置,需检查是否存在
SELECT
    name,
    object_id,
    type_desc
FROM sys.system_objects
WHERE name IN('xp_regread','xp_regwrite','xp_regdeletekey','xp_regdeletevalue')
ANDtype='X';-- X=扩展存储过程

-- 41. 检查链式配置(跨数据库所有权链)
EXEC sp_configure 'cross db ownership chaining';

-- 42. 检查代理账户(xp_cmdshell等使用)
EXEC sp_configure 'xp_cmdshell proxy account';

-- 43. 查看所有扩展存储过程(排查危险)
SELECT
    name,
    object_id,
    type_desc,
    create_date
FROM sys.system_objects
WHEREtype='X'-- 扩展存储过程
ORDERBY name;

4.2 网络安全配置

-- 44. 查看SQL Server网络配置(需查询注册表或使用动态管理视图)
-- 查看当前连接使用的协议
SELECT
    net_transport,
    auth_scheme,
    client_net_address,
    local_net_address,
    local_tcp_port,
    connection_id
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;

-- 45. 查看所有连接的传输协议
SELECTDISTINCT
    net_transport,
COUNT(*)AS[连接数]
FROM sys.dm_exec_connections
GROUPBY net_transport;

-- 46. 查看SQL Server端口配置(需结合配置管理器)
-- 查看动态端口使用
EXEC xp_readerrorlog 0,1, N'Server is listening on';

-- 47. 查看加密连接状态
SELECT
    session_id,
    net_transport,
    auth_scheme,
    encrypt_option AS[加密选项],
    client_net_address
FROM sys.dm_exec_connections
WHERE encrypt_option ='FALSE'AND net_transport ='TCP';
-- 上述查询返回非加密TCP连接,生产环境应全部为TRUE

-- 48. 查看SQL Server强制加密配置
-- 需检查注册表或使用配置管理器,T-SQL无法直接查询
-- 但可以通过连接属性推断
SELECT
'检查SQL Server配置管理器中的Force Encryption设置'AS[检查项],
'应启用Force Encryption'AS[要求];

五、数据安全(8.1.4.5/8.1.4.8)

5.1 加密配置检查

测评项T-SQL 查询语句达标判据
检查透明数据加密(TDE)SELECT * FROM sys.databases WHERE is_encrypted = 1敏感数据库启用
查看列级加密SELECT * FROM sys.column_encryption_keys敏感字段加密
检查连接加密SELECT encrypt_option FROM sys.dm_exec_connections强制加密
查看Always EncryptedSELECT * FROM sys.column_master_key_definitions客户端加密配置
-- 49. 查看透明数据加密(TDE)状态
SELECT
    name AS[数据库名],
    is_encrypted AS[已加密],
CASE is_encrypted 
WHEN1THEN'TDE已启用'
ELSE'未加密'
ENDAS[加密状态],
    compatibility_level
FROM sys.databases
ORDERBY is_encrypted DESC, name;

-- 50. 查看TDE加密详细配置(对加密数据库)
USE[master];
SELECT
    db.name,
    db.is_encrypted,
    dm.encryption_state,
    dm.percent_complete,
    dm.key_algorithm,
    dm.key_length,
    dm.server_name,
    dm.create_date
FROM sys.databases db
LEFTJOIN sys.dm_database_encryption_keys dm ON db.database_id = dm.database_id
WHERE db.is_encrypted =1OR dm.encryption_state ISNOTNULL;

-- 51. 查看列主密钥(Always Encrypted)
SELECT
    name AS[密钥名],
    column_encryption_key_id,
    create_date,
    modify_date
FROM sys.column_master_keys;

-- 52. 查看列加密密钥
SELECT
    name AS[密钥名],
    column_encryption_key_id,
    create_date
FROM sys.column_encryption_keys;

-- 53. 查看加密列定义
SELECT
    t.name AS[表名],
    c.name AS[列名],
    cek.name AS[加密密钥],
    cmk.name AS[主密钥],
    ct.name AS[加密类型]
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
JOIN sys.column_encryption_keys cek ON c.column_encryption_key_id = cek.column_encryption_key_id
JOIN sys.column_encryption_key_values cekv ON cek.column_encryption_key_id = cekv.column_encryption_key_id
JOIN sys.column_master_key_definitions cmk ON cekv.column_encryption_key_id = cmk.column_encryption_key_id
JOIN sys.symmetric_keys ct ON cekv.column_encryption_key_id = ct.symmetric_key_id
WHERE c.encryption_type ISNOTNULL;

-- 54. 查看连接加密状态统计
SELECT
    encrypt_option,
COUNT(*)AS[连接数],
    CAST(COUNT(*)*100.0/SUM(COUNT(*))OVER()ASDECIMAL(5,2))AS[百分比]
FROM sys.dm_exec_connections
GROUPBY encrypt_option;

-- 55. 查看非加密连接详情(风险)
SELECT
    s.session_id,
    s.login_name,
    s.program_name,
    s.host_name,
    c.client_net_address,
    c.net_transport,
    c.encrypt_option
FROM sys.dm_exec_sessions s
JOIN sys.dm_exec_connections c ON s.session_id = c.session_id
WHERE c.encrypt_option ='FALSE'
AND c.net_transport ='TCP'
AND s.is_user_process =1;

5.2 备份与恢复安全

-- 56. 查看数据库备份历史
SELECT
    database_name,
    backup_start_date,
    backup_finish_date,
typeAS[备份类型],-- D=完整, I=差异, L=日志
    backup_size/1024/1024AS[大小MB],
    is_password_protected AS[密码保护],
    is_encrypted AS[已加密],
    encryptor_thumbprint,
    recovery_model
FROM msdb.dbo.backupset
ORDERBY backup_start_date DESC;

-- 57. 查看备份文件位置
SELECT
    database_name,
    physical_device_name AS[备份路径],
type,
    backup_start_date
FROM msdb.dbo.backupset bs
JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id
WHEREtype='D'
ORDERBY backup_start_date DESC;

-- 58. 查看数据库恢复模式
SELECT
    name,
    recovery_model_desc AS[恢复模式],
    log_reuse_wait_desc AS[日志等待]
FROM sys.databases;

-- 59. 查看AlwaysOn可用性组(高可用)
SELECT
    group_name,
    replica_server_name,
    role_desc,
    synchronization_health_desc
FROM sys.dm_hadr_availability_replica_states;

-- 60. 查看日志传送配置
SELECT
    primary_server,
    primary_database,
    backup_directory,
    copy_job_name,
    restore_job_name,
    monitor_server
FROM msdb.dbo.log_shipping_primary_databases;

六、高可用与容灾(8.1.4.9)

6.1 集群与镜像配置

-- 61. 查看故障转移群集实例
SELECT
    cluster_name,
    type_desc,
    quorum_state_desc,
    quorum_type_desc
FROM sys.dm_hadr_cluster;

-- 62. 查看AlwaysOn可用性组详细状态
SELECT
    ag.name AS[可用性组],
    ar.replica_server_name AS[副本服务器],
    ar.availability_mode_desc AS[可用性模式],
    ar.failover_mode_desc AS[故障转移模式],
    rs.role_desc AS[当前角色],
    rs.synchronization_health_desc AS[同步健康],
    rs.last_hardened_lsn
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states rs ON ar.replica_id = rs.replica_id;

-- 63. 查看数据库镜像(传统方式)
SELECT
    database_id,
    db.name,
    mirroring_state_desc AS[镜像状态],
    mirroring_role_desc AS[镜像角色],
    mirroring_partner_name,
    mirroring_witness_name,
    mirroring_connection_timeout
FROM sys.database_mirroring dm
JOIN sys.databases db ON dm.database_id = db.database_id
WHERE mirroring_guid ISNOTNULL;

-- 64. 查看复制配置(数据分发)
SELECT
    name AS[发布名],
    database_id,
    is_snapshot_in_defaultfolder,
    compress_snapshot_files
FROM distribution.dbo.MSpublications;

-- 65. 查看事务日志状态(恢复关键)
SELECT
    db.name,
    db.log_reuse_wait_desc,
    ls.cntr_value/1024.0AS[日志大小MB],
    lu.cntr_value/1024.0AS[已用日志MB]
FROM sys.databases db
JOIN sys.dm_os_performance_counters ls ON db.name = ls.instance_name AND ls.counter_name ='Log File(s) Size (KB)'
JOIN sys.dm_os_performance_counters lu ON db.name = lu.instance_name AND lu.counter_name ='Log File(s) Used Size (KB)'
WHERE ls.object_name LIKE'%Databases%';

七、一键巡检脚本(SQL Server版)

-- ==========================================
-- SQL Server 等保三级一键巡检脚本
-- 执行方式:在SQL Server Management Studio (SSMS) 中执行
-- 权限要求:sysadmin 或 securityadmin + 各数据库访问权限
-- ==========================================

CREATETABLE#InspectionResults (
    Category NVARCHAR(50),
    Item NVARCHAR(100),
Status NVARCHAR(10),
    Detail NVARCHAR(MAX),
    CheckTime DATETIMEDEFAULT GETDATE()
);

DECLARE@Result NVARCHAR(MAX);

-- 1. 身份鉴别检查
PRINT'正在检查身份鉴别...';

-- 1.1 检查SQL认证和密码策略
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'身份鉴别',
'密码策略启用',
CASE
WHENCOUNT(*)=0THEN'PASS'
WHENSUM(CASEWHEN is_policy_checked =0OR is_expiration_checked =0THEN1ELSE0END)=0THEN'PASS'
ELSE'WARN'
END,
'总登录数: '+ CAST(COUNT(*)AS NVARCHAR)+
', 未启用策略: '+ CAST(SUM(CASEWHEN is_policy_checked =0THEN1ELSE0END)AS NVARCHAR)+
', 未启用过期: '+ CAST(SUM(CASEWHEN is_expiration_checked =0THEN1ELSE0END)AS NVARCHAR)
FROM sys.sql_logins;

-- 1.2 检查sa账户
SELECT@Result=CASE
WHEN is_disabled =1THEN'PASS: sa账户已禁用'
WHEN is_policy_checked =1AND is_expiration_checked =1THEN'WARN: sa已启用但受密码策略保护'
ELSE'FAIL: sa账户处于活动状态且无密码策略'
END
FROM sys.sql_logins WHERE name ='sa';

INSERTINTO#InspectionResults VALUES ('身份鉴别', 'sa账户状态', 
CASEWHEN@ResultLIKE'PASS%'THEN'PASS'WHEN@ResultLIKE'WARN%'THEN'WARN'ELSE'FAIL'END,
@Result);

-- 1.3 检查Windows认证优先
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'身份鉴别',
'Windows认证',
CASEWHENCOUNT(*)>0THEN'PASS'ELSE'WARN'END,
'Windows认证登录数: '+ CAST(COUNT(*)AS NVARCHAR)
FROM sys.server_principals 
WHEREtypeIN('U','G')AND is_disabled =0;

-- 2. 访问控制检查
PRINT'正在检查访问控制...';

-- 2.1 检查sysadmin权限分配
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'访问控制',
'sysadmin权限审查',
CASEWHENCOUNT(*)<=2THEN'PASS'ELSE'WARN'END,
'具有sysadmin权限的登录数: '+ CAST(COUNT(*)AS NVARCHAR)+
' (建议仅保留1-2个管理员)'
FROM sys.server_role_members rm
JOIN sys.server_principals r ON rm.role_principal_id = r.principal_id
JOIN sys.server_principals m ON rm.member_principal_id = m.principal_id
WHERE r.name ='sysadmin';

-- 2.2 检查guest用户
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'访问控制',
'guest用户权限',
CASEWHENCOUNT(*)=0THEN'PASS'ELSE'FAIL'END,
CASE
WHENCOUNT(*)=0THEN'未发现guest用户直接授权'
ELSE'发现'+ CAST(COUNT(*)AS NVARCHAR)+'个数据库中guest用户有权限'
END
FROM sys.databases db
WHEREEXISTS(
SELECT1FROM sys.database_permissions p
JOIN sys.database_principals u ON p.grantee_principal_id = u.principal_id
WHERE u.name ='guest'AND p.major_id >0
);

-- 3. 安全审计检查
PRINT'正在检查安全审计...';

-- 3.1 检查服务器审计
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'安全审计',
'服务器审计配置',
CASE
WHENCOUNT(*)=0THEN'FAIL'
WHENSUM(CASEWHEN is_state_enabled =1THEN1ELSE0END)=0THEN'WARN'
ELSE'PASS'
END,
'审计配置数: '+ CAST(COUNT(*)AS NVARCHAR)+
', 已启用: '+ CAST(SUM(CASEWHEN is_state_enabled =1THEN1ELSE0END)AS NVARCHAR)
FROM sys.server_audits;

-- 3.2 检查审计规范
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'安全审计',
'审计规范配置',
CASE
WHENCOUNT(*)=0THEN'WARN'
WHENSUM(CASEWHEN is_state_enabled =1THEN1ELSE0END)=0THEN'WARN'
ELSE'PASS'
END,
'审计规范数: '+ CAST(COUNT(*)AS NVARCHAR)+
', 已启用: '+ CAST(SUM(CASEWHEN is_state_enabled =1THEN1ELSE0END)AS NVARCHAR)
FROM sys.server_audit_specifications;

-- 4. 入侵防范检查
PRINT'正在检查入侵防范...';

-- 4.1 检查xp_cmdshell
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'入侵防范',
'xp_cmdshell状态',
CASEWHENvalue=0THEN'PASS'ELSE'FAIL'END,
'当前值: '+ CAST(valueAS NVARCHAR)+' (0=禁用, 1=启用)'
FROM sys.configurations WHERE name ='xp_cmdshell';

-- 4.2 检查OLE自动化
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'入侵防范',
'OLE Automation',
CASEWHENvalue=0THEN'PASS'ELSE'WARN'END,
'当前值: '+ CAST(valueAS NVARCHAR)
FROM sys.configurations WHERE name ='Ole Automation Procedures';

-- 4.3 检查CLR
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'入侵防范',
'CLR Enabled',
CASEWHENvalue=0THEN'PASS'ELSE'WARN'END,
'当前值: '+ CAST(valueAS NVARCHAR)
FROM sys.configurations WHERE name ='clr enabled';

-- 5. 数据安全检查
PRINT'正在检查数据安全...';

-- 5.1 检查TDE加密
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'数据安全',
'透明数据加密(TDE)',
CASEWHENSUM(CASEWHEN is_encrypted =1THEN1ELSE0END)>0THEN'PASS'ELSE'WARN'END,
'加密数据库数: '+ CAST(SUM(CASEWHEN is_encrypted =1THEN1ELSE0END)AS NVARCHAR)+
'/'+ CAST(COUNT(*)AS NVARCHAR)+' (系统数据库除外)'
FROM sys.databasesWHERE name NOTIN('master','tempdb','model','msdb');

-- 5.2 检查连接加密
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'数据安全',
'连接加密',
CASE
WHENCOUNT(*)=0THEN'WARN'
WHENSUM(CASEWHEN encrypt_option ='TRUE'THEN1ELSE0END)=COUNT(*)THEN'PASS'
ELSE'WARN'
END,
'总连接: '+ CAST(COUNT(*)AS NVARCHAR)+
', 加密: '+ CAST(SUM(CASEWHEN encrypt_option ='TRUE'THEN1ELSE0END)AS NVARCHAR)+
', 未加密: '+ CAST(SUM(CASEWHEN encrypt_option ='FALSE'THEN1ELSE0END)AS NVARCHAR)
FROM sys.dm_exec_connections WHERE net_transport ='TCP';

-- 6. 高可用检查
PRINT'正在检查高可用...';

-- 6.1 检查AlwaysOn
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'高可用',
'AlwaysOn可用性组',
CASEWHENCOUNT(*)>0THEN'PASS'ELSE'WARN'END,
'可用性组副本数: '+ CAST(COUNT(*)AS NVARCHAR)
FROM sys.availability_replicas;

-- 6.2 检查备份策略
INSERTINTO#InspectionResults (Category, Item, Status, Detail)
SELECT
'高可用',
'备份策略',
CASE
WHENCOUNT(*)=0THEN'FAIL'
WHEN DATEDIFF(day,MAX(backup_finish_date), GETDATE())>7THEN'WARN'
ELSE'PASS'
END,
'最近备份: '+ ISNULL(CONVERT(NVARCHAR,MAX(backup_finish_date),120),'无')+
', 备份数据库数: '+ CAST(COUNT(DISTINCT database_name)AS NVARCHAR)
FROM msdb.dbo.backupset WHEREtype='D';

-- 输出结果
PRINT'';
PRINT'==========================================';
PRINT'   SQL Server 等保三级巡检结果';
PRINT'==========================================';

SELECT
    Category AS[检查类别],
    Item AS[检查项],
StatusAS[状态],
    Detail AS[详细信息],
    CheckTime AS[检查时间]
FROM#InspectionResults
ORDERBY
CASE Category
WHEN'身份鉴别'THEN1
WHEN'访问控制'THEN2
WHEN'安全审计'THEN3
WHEN'入侵防范'THEN4
WHEN'数据安全'THEN5
WHEN'高可用'THEN6
ELSE7
END,
    Item;

-- 统计
SELECT
Status,
COUNT(*)AS[数量]
FROM#InspectionResults
GROUPBYStatus
ORDERBYCASEStatusWHEN'PASS'THEN1WHEN'WARN'THEN2WHEN'FAIL'THEN3ELSE4END;

-- 清理
DROPTABLE#InspectionResults;
PRINT'';
PRINT'巡检完成。';

高风险项重点核查清单

检查项验证T-SQL语句不合规判定整改建议
未启用密码策略SELECT * FROM sys.sql_logins WHERE is_policy_checked=0存在记录启用CHECK_POLICY
sa账户未禁用SELECT is_disabled FROM sys.sql_logins WHERE name='sa'返回0ALTER LOGIN sa DISABLE
xp_cmdshell启用EXEC sp_configure 'xp_cmdshell'run_value=1禁用并删除代理账户
OLE自动化启用EXEC sp_configure 'Ole Automation Procedures'run_value=1禁用
未启用审计SELECT * FROM sys.server_audits无记录创建服务器审计
TDE未启用SELECT * FROM sys.databases WHERE is_encrypted=1敏感库未加密启用透明数据加密
连接未加密SELECT * FROM sys.dm_exec_connections WHERE encrypt_option='FALSE'存在TCP未加密配置Force Encryption
权限过于集中SELECT * FROM sys.server_role_members WHERE role_principal_id=3过多sysadmin按最小权限分配角色
最近无备份SELECT MAX(backup_finish_date) FROM msdb.dbo.backupset超过7天配置定期备份计划
存在SQL注入风险SELECT * FROM sys.sql_modules WHERE definition LIKE '%exec(%'动态SQL未参数化审查存储过程

SQL Server版本差异说明

功能项SQL Server 2016SQL Server 2017SQL Server 2019SQL Server 2022
行级安全(RLS)支持增强增强增强
动态数据掩码支持增强增强增强
Always Encrypted基础安全Enclave增强增强
TDE支持支持支持支持
审计支持支持增强增强
扩展事件支持增强增强增强
查询存储支持增强增强增强
ledger表不支持不支持支持增强
国密算法需配置需配置需配置原生增强

常用命令速查

-- 连接与服务器信息
SELECT @@SERVERNAME, @@VERSION, DB_NAME();
EXEC sp_helpserver;

-- 用户管理
CREATE LOGIN userWITH PASSWORD ='StrongP@ssw0rd' MUST_CHANGE, CHECK_POLICY =ON;
ALTER LOGIN userDISABLE;
DROP LOGIN user;

-- 权限管理
GRANTSELECTONschema::dbo TOuser;
DENYDELETEONschema::dbo TOuser;
REVOKEINSERTONschema::dbo FROMuser;

-- 角色管理
EXEC sp_addrolemember 'db_datareader','user';
EXEC sp_droprolemember 'db_datawriter','user';

-- 审计管理
CREATE SERVER AUDIT audit TOFILE(PATH ='D:\Audit\');
CREATE SERVER AUDIT SPECIFICATION spec FOR SERVER AUDIT audit ADD (FAILED_LOGIN_GROUP);
ALTER SERVER AUDIT audit WITH (STATE = ON);

-- 加密管理
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256;
ALTER DATABASE db SET ENCRYPTION ON;

-- 备份恢复
BACKUP DATABASE db TO DISK = 'D:\Backup\db.bak' WITH ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = cert);
RESTORE DATABASE db FROM DISK = 'D:\Backup\db.bak';

-- 性能监控
EXEC sp_who2;
SELECT * FROM sys.dm_exec_requests;
SELECT * FROM sys.dm_exec_sessions WHERE status = 'sleeping';

参考标准:GB/T 22239-2019、GB/T 28448-2019、CIS Microsoft SQL Server Benchmark、Microsoft SQL Server Security Best Practices

适用版本:SQL Server 2016 SP3、2017 CU31、2019 CU22、2022 RTM及更高版本

执行权限:多数命令需 sysadmin 固定服务器角色,部分需 CONTROL SERVER 或特定数据库权限

声明:来自汪汪虚拟空间,仅代表创作者观点。链接:https://eyangzhen.com/6639.html

汪汪虚拟空间的头像汪汪虚拟空间

相关推荐

添加微信
添加微信
Ai学习群
返回顶部