NEWS.ALL
Ruizhao's News Reader

等保测评2.0:SQLServer身份鉴别(上)

FreeBuf /2020-02-13

一、说明

本篇文章主要说一说SQLServer数据库中身份鉴别控制点的中a、b测评项相关内容和理解。

二、测评项

a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;

b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;

三、测评项a

a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;

3.1. 测评项a要求1

应对登录的用户进行身份标识和鉴别

身份标识功能(用户名)就不用说了,属于SQLServer自带功能。而对用户进行鉴别也就是登录时需要你输入用户名、口令的行为。

对于SQLServer而言,一方面自然是不能存在空口令账户,还有在使用Microsoft SQL Server Management Studio时不能勾选记住记住密码

另外一方面,由于SQLserver数据库中的登录名中可以添加Windows系统账户,也就是可以使用Windows系统账户的身份登录。当使用Microsoft SQL Server Management Studio连接数据库时,选择Windows身份验证,Microsoft SQL Server Management Studio会自动读取当前的操作系统账户,如果SQLServer数据库中的登录名添加了该操作系统账户,且没有被禁用,则无需口令即可登录(这里我在登录名中没有添加这个账户,所以登录失败):图片.png

这种方式实际是相当于借用了windows的身份验证机制,也就是你如果能登录Windows系统,那么我(SQLSERVER)就不进行第二次验证了。

SQLServer数据库可以设置身份验证方式,这里符合要求的话应该选择SQLserver和Windows身份验证模式图片.png

那么总结下来,对于这个要求,服务器身份验证方式要选择SQLserver和Windows身份验证模式,SQLServer的账户不能存在空口令,且服务器的登录名中要么禁用了Windows操作系统账户,要么直接删除

如果禁用,在这里可以在登录名的属性中单独进行设置:图片.png

这里的是否允许连接到数据库引擎是否启用登录,对于不属于服务器角色sysadmin的账户而言,其中任何一个拒绝或禁用,该账户都不能登录,好像没啥区别,我发现的区别就是登录时错误提示不一样以及账户图标的变化不一样。

如果是是否允许连接到数据库引擎选择拒绝,则登录时错误提示如下:图片.png

同时账户图标无变化。

如果是登录选择禁用,则登录时错误提示如下:图片.png

同时,账户图标会多一个向下的箭头:图片.png

对于属于服务器角色sysadmin的账户而言,是否允许连接到数据库引擎中选择拒绝,对该账户无效,此账户仍然可以登录数据库。服务器角色sysadmin在这里设置:图片.png

更多的区别,大家可以自行百度。

3.2. 测评项a要求2

身份标识具有唯一性

即用户名或用户ID不能重复,这个不用多说,SQLServer自动实现,默认符合。

3.3. 测评项a要求3

身份鉴别信息具有复杂度要求

这个要从两个方面看,我个人觉得两个方面都符合才能算达到要求。

第一个方面即实际的口令是否具有一定的复杂度,也即口令至少8位,且包含大写字母、小写字母、数字、特殊字符这四类字符种的三种,且口令不包含简单排列规律,如admin!@#123此类弱口令。

第二个方面即SQLServer是否进行了口令复杂度策略的设置,强制要求口令具有一定的复杂度,也即在SQLServer的口令复杂度策略中进行了设置。

但是SQLServer数据库和Windows操作系统的耦合比较深,SQLServer自身没有口令复杂度策略设置功能,它是通过NetValidatePasswordPolicy API,使用Windows操作系统的校验函数来校验SQLServer中数据库账户的口令复杂度。说得再明白一点,SQLServer实质使用的是Windows组策略中的密码策略:图片.png

SQLServer本身能决定的就是是否去引用Windows组策略中的密码策略中,在每个登录名的属性中:图片.png

这里如果勾选了强制实施密码策略则代表引用了Windows组策略中的一部分密码策略,经过试验,它引用了密码必须符合复杂性要求、密码长度最小值这两个策略,至于强制密码历史、用可还原的的加密储存密码这两个策略,并未引用。

所以这个测评项要求对于SQLServer而言,一方面需要在各个登录名属性中勾选强制实施密码策略,另外一方面则需要在windows的密码策略中做相应的设置,否则就算引用windows的密码策略,也没有任何意义。

至于具体的windows的密码策略要如何设置,可看:等保测评2.0:Windows身份鉴别中查看。

除了使用图形化界面进行核查是否勾选强制实施密码策略,也可以使用SQL语句进行核查:

select * from sys.sql_logins; 

图片.png

这里的is_policy_checked就是强制实施密码策略

3.4. 测评项a要求4

要求并定期更换

和口令复杂度一样,一个方面是看实际的口令更换周期。

这里可以通过访谈相关人员或者直接核查配置,我推荐第二种方法。对于简单的、不复杂的问题还是自己查配置较好,你去访谈相关人员,对方基本也不会有什么证据,或者压根就不清楚,这种情况下,访谈的结果可靠性很难有保证。当然,访谈、核查都用也是可以的,对于口令更换周期,使用如下sql语句即可得知上一次口令更换时间:

SELECT name, LOGINPROPERTY([name], 'PasswordLastSetTime') AS 'PasswordChanged' FROM sys.sql_logins; 

图片.png

对于上述语句的LOGINPROPERTY,大家自己看看就明白了:LOGINPROPERTY (Transact-SQL)?redirectedfrom=MSDN)

另一方面,SqlServer的密码策略实际引用了windows的密码策略,在每个登录名的属性中的强制密码过期,引用了windows组策略中的密码最长使用期限图片.png

图片.png

这里要说的是,在登录名的属性中,只有先勾选了强制实施密码策略,才能勾选强制密码过期图片.png

和密码策略一样,这里的设置只是决定是否应用windows密码更换策略,实际上为了达到要求,windows密码策略中应该也要进行相关设置。

除了使用图形化界面进行核查是否勾选强制密码过期,也可以使用SQL语句进行核查:

select * from sys.sql_logins; 

图片.png

这里的is_expiration_checked就是强制密码过期

四、测评项b

b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;

4.1. 测评项b要求1

应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数(等相关措施)

对于SQLServer而言,登录失败策略也是引用的Windows策略,勾选登录名的属性中的强制密码过期,即代表引用Windows组策略中的账户锁定策略

图片.png

图片.png

被锁定后,输入正确密码登录SQLServer,会出现以下提示:

图片.png

此时,登录其他账户去查看该账户的状态,会发现已经被锁定:

图片.png

所以,这里也是需要在SQLServer和Windows中共同进行设置,才能起到效果。

4.2. 测评项b要求2

当登录连接超时自动退出

可以用sp_configure 'remote login time'进行查询:

图片.png

不过实际上嘛,SQLServer涉及到超时策略的地方很多,具体可看:等保测评:SQLServer操作超时

五、总结

由上述可知,SQLServer不愧是微软全家桶的产品,在一些方面和Windows的耦合很深。所以我们实际进行测评时,一定要结合该数据库所在服务器的情况结合起来写测评结论。

*本文原创作者:起于凡而非于凡,本文属FreeBuf原创奖励计划,未经许可禁止转载