SQL Server安全配置全面检查与优化方案

一、说明

1.1 覆盖操作系统和数据库版本

  • SQL Server版本要求:需覆盖2008 R2及以上版本。所有脚本中的命令都需在不同版本中经过实际测试,并能正常输出结果。
  • 操作系统版本要求:需覆盖Linux和Windows。
  • 如果在不同版本中有不同的命令,请在文档中明确标注版本和命令差异。

1.2 查询最小权限要求

例如创建的shijw用户,授权如下:

sql 复制代码
ALTER SERVER ROLE [diskadmin] ADD MEMBER [shijw];
ALTER SERVER ROLE [processadmin] ADD MEMBER [shijw];
ALTER SERVER ROLE [securityadmin] ADD MEMBER [shijw];
ALTER SERVER ROLE [setupadmin] ADD MEMBER [shijw];

二、SQL语句

2.1 数据库用户密码复杂度认证

sql 复制代码
SELECT name, is_policy_checked FROM sys.sql_logins;
  • SQL返回结果:

    • 当返回值=1时,表示合规(pass)。
    • 当返回值不等于1时,表示存在风险(Risk)。

2.2 数据库用户密码有效期策略

sql 复制代码
SELECT name, is_policy_checked FROM sys.sql_logins;
  • SQL返回结果:

    • 当返回值=1时,表示合规(pass)。
    • 当返回值不等于1时,表示存在风险(Risk)。

2.3 连接会话限制

sql 复制代码
SELECT CONVERT(Numeric(18,2), CONVERT(Numeric(18,2), c.value_in_use) / CONVERT(Numeric(18,2), maximum) * 100) AS user_count
FROM sys.configurations c
WHERE c.name = 'user connections';
  • SQL返回结果:

    • 当返回值<95时,表示合规(pass)。
    • 当返回值>95时,表示存在风险(Risk)。

2.4 连接数据库进程数限制

sql 复制代码
SELECT CONVERT(Decimal(18,0), (SUM(s.current_workers_count) * 1.0 / i.max_workers_count) * 100) AS CPU线程使用率
FROM sys.dm_os_sys_info i, sys.dm_os_schedulers s
GROUP BY i.max_workers_count;
  • SQL返回结果:

    • 当返回值<95时,表示合规(pass)。
    • 当返回值>95时,表示存在风险(Risk)。

2.5 物理备份

sql 复制代码
SELECT bs.database_name, 
       BACKUPTYPE = CASE
           WHEN bs.type = 'D' AND bs.is_copy_only = 0 THEN 'Full Database'
           WHEN bs.type = 'D' AND bs.is_copy_only = 1 THEN 'Full Copy-Only Database'
           WHEN bs.type = 'I' THEN 'Differential database backup'
           WHEN bs.type = 'L' THEN 'Transaction Log'
           WHEN bs.type = 'F' THEN 'File or filegroup'
           WHEN bs.type = 'G' THEN 'Differential file'
           WHEN bs.type = 'P' THEN 'Partial'
           WHEN bs.type = 'Q' THEN 'Differential partial' END + ' Backup',
       CASE bf.device_type 
           WHEN 2 THEN 'Disk'
           WHEN 5 THEN 'Tape'
           WHEN 7 THEN 'Virtual device'
           WHEN 9 THEN 'Azure Storage'
           WHEN 105 THEN 'A permanent backup device'
           ELSE 'Other Device' END AS DeviceType,
       bs.Backup_Start_Date, 
       BackupFinishDate = bs.Backup_Finish_Date,
       [BackupStatus] = CASE bs.Backup_Start_Date WHEN NULL THEN '备份失败' ELSE '成功' END,
       LatestBackupLocation = bf.physical_device_name
FROM msdb.dbo.backupset bs
LEFT JOIN msdb.dbo.backupmediafamily bf ON bs.[media_set_id] = bf.[media_set_id]
WHERE bs.backup_start_date > DATEADD(MONTH, - 2, sysdatetime())
ORDER BY bs.database_name ASC, bs.Backup_Start_Date DESC;
  • SQL返回结果:

    • 当有返回结果时,表示合规(pass)。
    • 当无返回结果时,表示存在风险(Risk)。

2.6 网络传输加密

sql 复制代码
SELECT DISTINCT (encrypt_option) FROM sys.dm_exec_connections;
  • SQL返回结果:

    • 当返回结果=true时,表示合规(pass)。
    • 当无返回结果时,表示存在风险(Risk)。

2.7 数据库存储加密

sql 复制代码
SELECT D.name AS 'Database Name',
       CASE
           WHEN E.encryption_state = 3 THEN 'Encrypted'
           WHEN E.encryption_state = 2 THEN 'In Progress'
           ELSE 'Not Encrypted'
       END AS state
FROM sys.dm_database_encryption_keys E
RIGHT JOIN sys.databases D ON D.database_id = E.database_id
LEFT JOIN sys.certificates c ON E.encryptor_thumbprint = c.thumbprint;
  • SQL返回结果:

    • 当返回结果=Encrypted时,表示合规(pass)。
    • 当返回结果不等于Encrypted时,表示存在风险(Risk)。

2.8 透明加密

sql 复制代码
SELECT name, is_encrypted FROM sys.databases;
  • SQL返回结果:

    • 当返回结果=1时,表示合规(pass)。
    • 当返回结果不等于1时,表示存在风险(Risk)。

2.9 连接超时机制

sql 复制代码
SELECT COMMENT, value FROM SYS.SYSCONFIGURES WHERE COMMENT LIKE 'remote%';
  • SQL返回结果:

    • 当返回结果≠0时,表示合规(pass)。
    • 当返回结果=0时,表示存在风险(Risk)。

2.10 数据库版本补丁

sql 复制代码
SELECT @@VERSION;
SELECT SERVERPROPERTY('ProductVersion');
  • SQL返回结果: 需要根据实际输出填写。

2.11 弱口令

sql 复制代码
SELECT name, create_date, is_disabled FROM sys.sql_logins WHERE PWDCOMPARE('', password_hash) = 1;
SELECT name, create_date, is_disabled FROM sys.sql_logins WHERE PWDCOMPARE(name, password_hash) = 1;
  • SQL返回结果: 需要根据实际输出填写。

2.12 C2审计

sql 复制代码
SELECT value FROM sys.sysconfigures WHERE comment = 'c2 audit mode';
  • SQL返回结果:

    • 当返回结果为1时,表示合规(pass)。
    • 当返回结果为其他值时,表示存在风险(Risk)。

2.13 SQL审核

sql 复制代码
SELECT status FROM sys.dm_server_audit_status WHERE status = 1;
  • SQL返回结果:

    • 当返回结果为1时,表示合规(pass)。
    • 当返回结果为其他值时,表示存在风险(Risk)。

2.14 SQL注入

sql 复制代码
SELECT value FROM sys.sysconfigures WHERE comment = 'Enable or disable command shell';
  • SQL返回结果:

    • 当返回结果为0时,表示合规(pass)。
    • 当返回结果为其他值时,表示存在风险(Risk)。

三、总结

这些SQL脚本主要用于检查SQL Server数据库的安全配置,确保数据库在操作系统、权限控制、备份、加密以及其他关键领域符合最佳实践。根据执行结果,系统管理员可以针对发现的问题采取相应的补救措施,进一步加强数据库的安全性。

相关推荐
ma_king3 小时前
入门 java 和 数据库
java·数据库·后端
jiayou646 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
NineData18 小时前
NineData 迁移评估功能正式上线
数据库·dba
用户962377954481 天前
DVWA 靶场实验报告 (High Level)
安全
NineData1 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师1 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全