瓜娃子喔 發表於 2025-10-20 09:32:22

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、说明</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1.1 覆盖操作系统和数据库版本</a></li><li><a href="#_lab2_0_1">1.2 查询最小权限要求</a></li></ul><li><a href="#_label1">二、SQL语句</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">2.1 数据库用户密码复杂度认证</a></li><li><a href="#_lab2_1_3">2.2 数据库用户密码有效期策略</a></li><li><a href="#_lab2_1_4">2.3 连接会话限制</a></li><li><a href="#_lab2_1_5">2.4 连接数据库进程数限制</a></li><li><a href="#_lab2_1_6">2.5 物理备份</a></li><li><a href="#_lab2_1_7">2.6 网络传输加密</a></li><li><a href="#_lab2_1_8">2.7 数据库存储加密</a></li><li><a href="#_lab2_1_9">2.8 透明加密</a></li><li><a href="#_lab2_1_10">2.9 连接超时机制</a></li><li><a href="#_lab2_1_11">2.10 数据库版本补丁</a></li><li><a href="#_lab2_1_12">2.11 弱口令</a></li><li><a href="#_lab2_1_13">2.12 C2审计</a></li><li><a href="#_lab2_1_14">2.13 SQL审核</a></li><li><a href="#_lab2_1_15">2.14 SQL注入</a></li></ul><li><a href="#_label2">三、总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、说明</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1.1 覆盖操作系统和数据库版本</h3>
<ul><li>SQL Server版本要求:需覆盖2008 R2及以上版本。所有脚本中的命令都需在不同版本中经过实际测试,并能正常输出结果。</li><li>操作系统版本要求:需覆盖Linux和Windows。</li><li>如果在不同版本中有不同的命令,请在文档中明确标注版本和命令差异。</li></ul>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>1.2 查询最小权限要求</h3>
<p>例如创建的<code>shijw</code>用户,授权如下:</p>
<div class="jb51code"><pre class="brush:sql;">ALTER SERVER ROLE ADD MEMBER ;
ALTER SERVER ROLE ADD MEMBER ;
ALTER SERVER ROLE ADD MEMBER ;
ALTER SERVER ROLE ADD MEMBER ;
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>二、SQL语句</h2>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>2.1 数据库用户密码复杂度认证</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT name, is_policy_checked FROM sys.sql_logins;
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回值=1时,表示合规(pass)。</li><li>当返回值不等于1时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2.2 数据库用户密码有效期策略</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT name, is_policy_checked FROM sys.sql_logins;
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回值=1时,表示合规(pass)。</li><li>当返回值不等于1时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>2.3 连接会话限制</h3>
<div class="jb51code"><pre class="brush: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';
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回值&lt;95时,表示合规(pass)。</li><li>当返回值&gt;95时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>2.4 连接数据库进程数限制</h3>
<div class="jb51code"><pre class="brush: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;
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回值&lt;95时,表示合规(pass)。</li><li>当返回值&gt;95时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>2.5 物理备份</h3>
<div class="jb51code"><pre class="brush: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,
       = 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. = bf.
WHERE bs.backup_start_date &gt; DATEADD(MONTH, - 2, sysdatetime())
ORDER BY bs.database_name ASC, bs.Backup_Start_Date DESC;
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当有返回结果时,表示合规(pass)。</li><li>当无返回结果时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_7"></a></p><h3>2.6 网络传输加密</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT (encrypt_option) FROM sys.dm_exec_connections;
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回结果=true时,表示合规(pass)。</li><li>当无返回结果时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_8"></a></p><h3>2.7 数据库存储加密</h3>
<div class="jb51code"><pre class="brush: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;
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回结果=Encrypted时,表示合规(pass)。</li><li>当返回结果不等于Encrypted时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_9"></a></p><h3>2.8 透明加密</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT name, is_encrypted FROM sys.databases;
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回结果=1时,表示合规(pass)。</li><li>当返回结果不等于1时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_10"></a></p><h3>2.9 连接超时机制</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT COMMENT, value FROM SYS.SYSCONFIGURES WHERE COMMENT LIKE 'remote%';
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回结果&ne;0时,表示合规(pass)。</li><li>当返回结果=0时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_11"></a></p><h3>2.10 数据库版本补丁</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT @@VERSION;
SELECT SERVERPROPERTY('ProductVersion');
</pre></div>
<ul><li><strong>SQL返回结果:</strong>&nbsp;需要根据实际输出填写。</li></ul>
<p class="maodian"><a name="_lab2_1_12"></a></p><h3>2.11 弱口令</h3>
<div class="jb51code"><pre class="brush: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;
</pre></div>
<ul><li><strong>SQL返回结果:</strong>&nbsp;需要根据实际输出填写。</li></ul>
<p class="maodian"><a name="_lab2_1_13"></a></p><h3>2.12 C2审计</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT value FROM sys.sysconfigures WHERE comment = 'c2 audit mode';
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回结果为1时,表示合规(pass)。</li><li>当返回结果为其他值时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_14"></a></p><h3>2.13 SQL审核</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT status FROM sys.dm_server_audit_status WHERE status = 1;
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回结果为1时,表示合规(pass)。</li><li>当返回结果为其他值时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_lab2_1_15"></a></p><h3>2.14 SQL注入</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT value FROM sys.sysconfigures WHERE comment = 'Enable or disable command shell';
</pre></div>
<p><strong>SQL返回结果:</strong></p>
<ul><li>当返回结果为0时,表示合规(pass)。</li><li>当返回结果为其他值时,表示存在风险(Risk)。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>三、总结</h2>
<p>这些SQL脚本主要用于检查SQL Server数据库的安全配置,确保数据库在操作系统、权限控制、备份、加密以及其他关键领域符合最佳实践。根据执行结果,系统管理员可以针对发现的问题采取相应的补救措施,进一步加强数据库的安全性。</p>
<p>以上就是SQL Server安全配置全面检查与优化方案的详细内容,更多关于SQL Server安全配置检查与优化的资料请关注琼殿技术社区其它相关文章!</p>
頁: [1]
查看完整版本: SQL Server安全配置全面检查与优化方案