# 05、等保2.0_Sql_Server数据库测评

LLMS index: [llms.txt](/wikis/llms.txt)

---

## 一、SQL server数据库介绍
SQL server美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统。

本次安装环境为Windows10专业版操作系统，数据库版本为Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)  ，单机部署过程比较简单就不在此进行讲解。本文针对SQL server等保测评进行实际操作，不妥之处还恳请留言指正，共同学习。

### 1.1等保测评命令
select @@version 查看数据库版本

select name, LOGINPROPERTY([name], 'PasswordLastSetTime') AS'PasswordChanged' FROM sys.sql_logins;上传口令更换时间

select * from sys.sql_logins; 查看is_policy_checked字段的赋值是否强制实施密码策略

select * from sys.sql_logins ;查看SQL Server身份认证模式的能够登录账户

select * from sys.syslogins ;查看能够连接数据库的账户

sp_configure 'remote login time';查看超时  
sp_configure 'remote query timeout';查看超时

sp_configure ;查看“c2 audit mode”项的值，“0”是未开启C2审计，“1”是开启C2审计。

**二、等保测评**

## 身份鉴别
### a) 应对登录的用户进行身份标识和鉴别，身份标识具有唯一性，身份鉴别信息具有复杂度要求并定期更换；
1）SQL server数据库本身没有密码复杂度策略设置，它是使用Windows操作系统的校验函数来校验账户密码的，所以查看SQL server数据库密码复杂度需要结合操作系统本地安全策略的密码策略来看。SQL server密码策略要同时满足开启Windows密码策略并且勾选SQL server账户的强制实施密码策略才算是符合，但即使这样的话一样可以设置6位长度的口令，所以还要设置服务器的密码最小长度值。

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/5bdb6429bff5710923d54c1ff731b522_MD5.png)

2）在Microsoft SQL Server Management Studio中登录服务器，右键点击服务器，选择“属性”，选择“安全性”项，查看服务器身份验证。在Microsoft SQL Server Management Studio中选择服务器组并展开，选择“安全性->登录名”项，右键点击管理员用户的“属性”，在“常规”中 查看“强制实施密码策略”和“强制密码过期”

SQL server数据库的身份验证方式有多种，经常使用的有:windows身份验证和SQL server 身份验证。如果SQLServer数据库中的登录名添加了该操作系统账户，且没有被禁用，则无需口令即可登录。  


![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/80b29f382d23a282642e639f9153c566_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/faa4217e967f70893e42bc2676de1cac_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/5d6e23ba24fb6eaf722f74a0d1d2a404_MD5.png)

检查是否开启强制密码策略。  


![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/127adb50c74a56f8301b269a73ac2d07_MD5.png)

3）用户唯一标识SQLServer自动实现，这点默认符合。

4）尝试建立弱口令账户，检查是否建立成功。

### b) 应具有登录失败处理功能，应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施；
1）SQL server的账户锁定策略原理也是一样的，都是参照Windows操作系统的校验函数来校验的，所以需要勾选账户的强制密码过期，并且开启操作系统的账户锁定策略。勾选数据库强制密码过期，设置操作系统密码锁定策略。

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/6a81067bacfa246b9a0e3932fae0be67_MD5.png)

2）SQL Server 数据库连接超时包含三类：远程登录超时、客户端连接数据库超时、sql语句执行超时（主要关注远程登录超时），其中：

远程登录超时：  


在Microsoft SQL Server Management Studio中登录服务器并展开，右键点击服务器，选择“属性”，选择“高级”项，查看登录超时设定。也可在Microsoft SQL Server Management Studio的查询中输入命令：“sp_configure”查看数据库启动的配置参数；其中remote login timeout为远程登录超时设定。

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/6536e5f47aef86eefa299bdaecc62566_MD5.png)

客户端连接数据库超时：  


![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/4eab147e3d08138934269bbcfce93421_MD5.png)

  


sql语句执行超时：  


![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/dda7c025bafef459df9731268aad658f_MD5.png)

  


**c) 当进行远程管理时，应采取必要措施防止鉴别信息在网络传输过程中被窃听；**

核查是否采用加密等安全方式对系统进行远程管理，防止鉴别信息在网络传输过程中被窃听。检查远程管理时管理员所使用的管理协议，查看传输过程中的鉴别信息是否是经过加密处理的、抗重放的，并可使用抓包工具，判断管理员远程管理时传输过程中的鉴别信息被窃听的可能性。

根据了解，SQL Server的加密分成两个部分，一个是对数据的加密，一个是对连接的加密。对于数据的加密，主要是通过一系列的函数如EncryptbyKey，或者TDE来完成的。另外一部分是连接加密，自己分的话还能分成两个阶段。一个是建立连接时候的加密。另外一个阶段是连接建立起来之后，客户端和SQL Server在其上传输数据时候的加密。可以通过抓包判定SQL Server已经使用了SSL来加密。

SQL Server自动生成的证书是一种自签名的证书，而通过自签名证书实现的SSL并不能提供很强的安全性。他对中间人攻击（man-in-the-middle attack）不具有抵抗能力。因此建议在生产环境中，应该手动给SQL Server配置证书，而不是让它使用自动生成的证书。

默认情况下SQL Server是不加密收发的数据包信息，需要通过SQL Server的configuration Manager配置SQL Server使得它加密和客户端之间收发的数据包信息。

其中包含客户端的加密配置和服务器端的加密配置：  


客户端的加密配置：

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/7ca8dacdb91f1763469bae948b731631_MD5.png)

服务器端的加密配置：

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/f688acdd392d7cfda0a4f2bb4d4a06a7_MD5.png)

  


默认状态下客户端和服务器端这个选项是设置为No的，SQL Server对数据包的收发不进行加密，反之，当选项设置为yes时，SQL Server对数据包的收发进行加密。

### d) 应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别，且其中一种鉴别技术至少应使用密码技术来实现。
访谈管理员并进行验证，是否采用双因子身份鉴别技术，鉴别技术是什么 。实际实现双因素认证比较困难，一般情况判定为不符合。

## 访问控制  
a) 应对登录的用户分配账户和权限；
1)查看用户，并结合结合访谈管理员是否存在网络管理员，安全管理员，系统管理员、审计管理员等多个账户，为各个管理用户分配对应的权限；输入命令：“select * from syslogins”，根据所列出的账户，查看是否存在默认账户，默认账户是否已禁用。

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/5d6e23ba24fb6eaf722f74a0d1d2a404_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/c5335b2322af1b51ebe29cec753dd0ff_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/1cc720e37bbd45af4e03c9f09bb3f520_MD5.png)

### b) 应重命名或删除默认账户，修改默认账户的默认口令
执行命令：“select * from syslogins”，检查如sa账户是否重命名（实际检查发现很多sa账户是不能重命名或禁用的，可能会影响系统正常运行，检查过程中也需要权衡业务需求），数据库一般情况不存在默认口令，输入命令：查看是否存在默认账户。（SQLServer中默认账户其实很多，主要检查权限过大的账户）

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/1cc720e37bbd45af4e03c9f09bb3f520_MD5.png)

### c) 应及时删除或停用多余的、过期的账户，避免共享账户的存在
1）询问管理员数据库中的账户使用情况，是否存在无人使用的账户，如果存在建议删除。  


2)检查网络管理员，安全管理员、系统管理员不同用户是否采用不同账户登录数据库。输入命令：“select * from syslogins”，根据所列出的账户，询问数据库管理员各个账户的作用，是否存在多余的、过期的和共享账户。

### d) 应授予管理用户所需的最小权限，实现管理用户的权限分离
1）询问数据库管理员管理账户是否按照最小权限进行划分。在Microsoft SQL Server Management Studio中的查询中输入命令：“sp_helplogins”查看所有数据库登录用户的信息及其权限。在Microsoft SQL Server Management Studio的查询中输入命令：“select * from sys.sql_logins”，查看SQL Server身份认证模式的能够登录账户，其中is_disabled值为1，则登录账户被锁定；输入命令：“select * from sys.syslogins”，查看所有登录账户，其中 “denylogin”的值为1时，拒绝账户连接到数据库引擎，“sysadmin”的值为1时，具有系统管理员权限。Sa之类的系统管理员账户不负责操作业务数据库；业务数据库管理员不应具备系统管理权限（如删除数据库、表和存储过程等）。

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/87a1c8f78b45581fa9272fbcd13c1475_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/4750e2dcf15679ccdc7aa420b74e1abb_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/dc410c9ef1b9857580e3b8d2dfefd1df_MD5.png)

### e) 应由授权主体配置访问控制策略，访问控制策略规定主体对客体的访问规则
1）访谈和查看管理员是否制定了访问控制策略

2）查看管理员权限；（此测评点如果数据库已经启用身份鉴别，且具备权限分离可判定为符合）

**f) 访问控制的粒度应达到主体为用户级或进程级，客体为文件、数据库表级**

结合a）、b）、c）、d）、e）项，并访谈管理员并核查访问控制粒度主体是否为用户级，客体是否为数据库表级。询问数据库管理员是否具有安全策略，数据库是否具有重要的表。在企业管理器中右键点击重要的表，查看其权限。

（此测评点多数测评机构默认判定为符合）

### g)应对重要主体和客体设置安全标记，并控制主体对有安全标记信息资源的访问
通过访谈管理员是否对重要主体和客体设置安全标记。SQL Server数据库自身应该很难实现这个功能，可能需要依赖操作系统或者第三方来实现。该项一般默认都不符合。

## 安全审计
### a) 应启用安全审计功能，审计覆盖到每个用户，对重要的用户行为和重要安全事件进行审计
1）查看SQL server日志是否有日志审计记录，检查安全性中是否创建了审核目标。在Microsoft SQL Server Management Studio中登录服务器并展开，右键点击服务器，选择“属性”，选择“安全性”项，查看登录审核和是否启用C2 审计跟踪。也可在Microsoft SQL Server Management Studio的查询中输入命令：“sp_configure”查看“c2 audit mode”项的值，“0”是未开启C2审计，“1”是开启C2审计。SQL Server数据库的审计内容包括SQL Server日志和应用程序日志。SQL Server的SQL Server日志可通过Microsoft SQL Server Management Studio进行查看，展开服务器点击“管理-〉SQL Server 日志"；SQL Server的应用程序日志可通过操作系统的日志进行查看。

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/33b837770a423b3148c375aa42dcbe44_MD5.png)

2）访谈管理员是否通过第三方工具（数据库审计系统）收集审计数据进行分析。

### b) 审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息
1）检查SQL server日志记录的各类信息（告警日志、运行日志、错误日志、登录日志等）

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/ba9839e1fdd51e1e19f1f861a727cf58_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/5d469ba95f693a97be47df25fac9f32e_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/a2d1024eb9b63bd44dd9fc3c11d7e592_MD5.png)

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/bda67bf30923aae3a7f06417219aeafb_MD5.png)

2)核查是否部署第三方工具（数据库审计系统）增强SQL server日志功能。记录第三方审计工具的审计内容，查看是否包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息。

### c) 应对审计记录进行保护，定期备份，避免受到未预期的删除、修改或覆盖等
应保证各个管理员尽可以访问与自身相关的日志文件，如关键日志仅允许特权账户访问

1)访谈管理员对审计记录如何保护，对审计记录是否定期备份，备份策略。

是否采取了备份、转存等手段对审计记录进行保护，避免未预期的删除、修 改或覆盖，数据库本地日志保存时间超过6个月。采用第三方数据库审计产品，审计记录保存时间超过6个月。

2)是否严格限制用户访问审计记录的权限，可以通过普通用户登录然后是否能够访问修改删除日志。

### d) 应对审计进程进行保护，防止未经授权的中断
可以根据权限建立各类型的账户，可以防止审计进程未经授权的中断，如果数据库已建立审计账户且各个数据库管理员权限已分离，可判定为符合。

## 入侵防范
### a) 应遵循最小安装的原则，仅安装需要的组件和应用程序
数据库系统此测评项可判定为不适用。

### b) 应关闭不需要的系统服务、默认共享和高危端口
数据库系统此测评项不适用。

### c) 应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制
SQL server数据库没有登录地址限制的相关配置，多数情况下是限制数据库服务器的登录地址，从而实现对数据库的登录地址限制。

### d) 应提供数据有效性检验功能，保证通过人机接口输入或通过通信接口输入的内容符合系统设定要求
数据库系统此测评项不适用。  


### e) 应能发现可能存在的已知漏洞，并在经过充分测试评估后，及时修补漏洞
1） 访谈管理员是否定期或不定期进行漏洞扫描或渗透测试，周期按照天/月/季度/半年/年等方式（建议漏洞扫描周期最长半年一次）。  
2）通过本次漏洞扫描是否发现与数据库相关的高危漏洞，若存在，是否及时进行漏洞修补，执行命令：“select @@version”检查数据库版本。

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/54f62f8e5a3415604623d236a847343e_MD5.png)

### f) 应能够检测到对重要节点进行入侵的行为，并在发生严重入侵事件时提供报警
数据库系统此测评项不适用。

## 恶意代码防范
### a）应采用免受恶意代码攻击的技术措施或主动免疫可信验证机制及时识别入侵和病毒行为，并将其有效阻断
数据库系统此测评项不适用。

## 可信验证
### a）可基于可信根对计算设备的系统引导程序、 系统程序、重要配置参数和应用程序等进行可信验证，并在应用程序的关键执行环节进行动态可信验证，在检测到其可信性受到破坏后进行报警，并将验证结果形成审计记录送至安全管理中心
通过访谈管理员，是否采取了可信技术，可信技术主要是基于可信芯片、可信根，目前实现此技术的可能性不大，一般判定为不符合。

## 数据完整性
### a)应采用密码技术保证重要数据在传输过程中的完整性，包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等；
传输过程中的完整性一般是通过通信协议来实现的，常见的包括TLS、SSL、SSH等协议，对数据库而言，查看是否启用了安全协议进行数据通信，同时询问管理员，确认是否还有其他保证数据传输过程中的完整性措施。根据上文描述，可知SQL Server已经使用SSL来加密。（本地管理可判定为不适用，远程管理根据实际情况判定）

### b)应采用密码技术保证重要数据在存储过程中的完整性，包括但不限于鉴别数据、重要业务数据和重要个人信息等。
对数据库配置文件进行一个完整性检测，需要配置文件初始可信状态时的哈希值，然后再根据目前的文件生成一个哈希值，对比前后的一致性，确认数据是否被篡改过，根据了解一般数据库自身不带这种机制，询问管理人员是否使用了第三方软件对数据库重要数据进行了完整性校验。

实际操作中可核查数据库表中的业务数据、审计数据有无存在哈希字段，据了解数据在前端一般通过json或xml格式进行传输，相关数据库表字段中具有完整性校验字段。目前一般做不到，判定为不符合。

## 数据保密性
### a)应采用密码技术保证重要数据在传输过程中的保密性，包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等；
若password是以明文密码传送给数据库，建议不在生产环境中使用。若数据库未开启SSL时，我通过Wireshare对数据库认证过程的数据包进行抓取，可能发现传输的密码字段信息。根据上文描述，可知SQL Server已经使用SSL来加密。

总结，最直接验证的办法就是抓包验证重要的加密数据（鉴别数据、需要加密的业务数据、个人信息等）是否明文传输。  


### b)应采用密码技术保证重要数据在存储过程中的保密性，包括但不限于鉴别数据、重要业务数据和重要个人信息等。
检查数据库表中的重要数据是否明文存储，根据经验除鉴别数据外，业务数据、审计数据实际很少加密存储，所以一般不符合或者部分符合。如果使用数据库加密功能，就可以符合符合，数据库加密主要分库内加密和库外加密，库内加密主要是调用的数据库本身的加密功能，库外加密主要通过第三方厂家的数据库加密功能。

据了解，SQL Server几乎支持所有的主流对称加密算法。一般推荐使用AES-128或AES-256作为对称加密的数据加密算法。

## 数据备份恢复
### a)应提供重要数据的本地数据备份与恢复功能；
1）访问管理员配置数据、审计数据、业务数据的备份策略，检查备份策略的备份情况与管理员所说是否一致，是否具有恢复测试记录。

![](/wikis/_resources/5%E3%80%81%E7%AD%89%E4%BF%9D2.0_SQL_server%E6%95%B0%E6%8D%AE%E5%BA%93%E6%B5%8B%E8%AF%84/20ba03f5da274ec70922dccc836354b3_MD5.png)

2）可以通过数据库管理工具进行备份。

### b)应提供异地实时备份功能，利用通信网络将重要数据实时备份至备份场地；
部署异地备份机房，并符合备份策略通过网络定期进行异地备份。

### c)应提供重要数据处理系统的热冗余，保证系统的高可用性；
集群部署、双机热备均可判定为符合。

## 剩余信息保护
### a)应保证鉴别信息所在的存储空间被释放或重新分配前得到完全清除；
一般情况下数据库系统内核层默认无法实现剩余信息保护功能，需要第三方工具才能实现。

### b)应保证存有敏感数据的存储空间被释放或重新分配前得到完全清除。
一般情况下数据库系统内核层默认无法实现剩余信息保护功能，需要第三方工具才能实现。

## 个人信息保护
### a)应仅采集和保存业务必需的用户个人信息；
检查数据库中是否存储个人信息，若有，检查个人信息保护机制和个人信息保护管理制度

### b)应禁止未授权访问和非法使用用户个人信息。
检查个人信息保护机制和个人信息保护管理制度，验证非授权人员是否可以访问个人信息存储的相关组件内容。

## 总结
SQL server数据库运行在windows操作系统中，部分安全策略主要依赖于操作系统的安全配置，大部分安全配置几乎可以实现，但是在实际测评过程中很多单位不愿意配置等保中要求的策略，一方面是管理员认为不方便自己运维管理，另一方面可能是数据库在实时生产环境中，管理员担心更改相关安全配置后影响系统的正常运行，所以我们在测评中要做好安全和生产、安全和管理的平衡。
