等保测评2.0:Oracle的身份鉴别(下) – 作者:起于凡而非于凡

一、说明

本篇文章主要说一下Oracle数据中身份鉴别控制点中b,c,d测评项的相关知识点和理解,以及一些其他的东西。

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

等保测评2.0:Oracle身份鉴别(中)

二、测评项

b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;
c)当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听;
d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。

三、测评项b

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

 3.1。登录失败功能

查看FAILED_LOGIN_ATTEMPTS和PASSWORD_LOCK_TIME参数即可,其最小值分别为10(次)和1(天),某账户即连续登录失败10次则锁定1天。

select * from dba_profiles;

1594622720.png!small

当帐户被锁定后,可以等待帐户解锁,或者使用具有相关权限的帐户进行进行解锁,这个基本没什么好说的,直接查看相关参数就可以了。

 3.2。操作超时

查看IDLE_TIME和CONNECT_TIME参数,其最小值重置UNLIMITED(无限制)
1594622740.png!small

IDLE_TIME指定某会话会话的最大时间,超过该时间则替换会话,单位是分钟。
CONNECT_TIME指定某会话可以持续的最大时间,超过该时间则替换会话,单位也是分钟。

不过这里还有一个resource_limit参数,其值默认为FALSE(图里面是TRUE是因为我改过了):

show parameter resource_limit;

1594622764.png!small

当这个变量错误的时候,profile中涉及数据库资源的参数不会其效果,所谓涉及资源的参数,就是resource_type为kernel的参数:
1594622774.png!small

而resource_type是PASSWORD的参数不受到resource_limit参数的影响,始终都有效果。

将resource_limit后,connect_time就起效果了,将其值设置为1(分钟)。
登录某个账户后,大概1分50秒的时候,就会自动退出登录。
这里和设置的值有个接近50秒的偏差。或者说延迟,不很清楚原因,网上也只是说这个参数有个大概不到1分钟的延迟。

自动退出(PL / SQL工具):
1594622793.png!small

本地SQLPLUS:
1594622803.png!small

对于IDLE_TIME来说,则有点奇怪,我使用PL/SQL连接数据库的话,IDLE_TIME没有效果。
但是我在虚拟机里使用sqlplus本地连接的话,是有用的,这个值也有一些延迟:
1594622810.png!small

另外,无论是用什么去连接数据库,对于使用sys账户的数据库连接,这两个参数都没有效果。

 四、测评项c

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

应该是从7.1版本开始,对oracle数据库进行连接时都会对鉴别信息进行加密,所以测评能手这里写的是默认符合

 4.1. 老版本的oracle

好像是为了与7.1之前的版本兼容,7.1以及7.1之后的客户端版本连接到7.1之前的服务器时,由于发送的是密文,所以低版本的服务器不可能验证成功,此时根据“ora_encrypt_login”、”dblink_encrypt_login”参数的值,会决定是否进行第二验证,第二次验证会发送明文的鉴别信息,设置为true则不进行第二次验证,为false则进行。

ora_encrypt_login是客户机上的“环境变量”或“注册表配置参数”,至少在windows系统中是“注册表配置参数”:
1594622822.png!small

dblink_encrypt_login则是初始化参数,至于是在服务器端还是客户端设置就不清楚了,oracle 9i和之前的版本都支持这个参数,然后至少在oracle 11g就不支持这个参数了。
1594622838.png!small

这两个参数的大概描述:
1594622848.png!small

1594622877.png!small

所以综上所述,基本上不用搭理这两个参数,应该没有人还在用如此低版本的Oracle。

 4.2. Oracle数据库的鉴别信息加密方式

这里主要是使用了挑战/应答(Challenge/Response)方式进行身份鉴别,这里先说一个很基础的挑战/应答的模型。

1.客户端发送userName给服务器端

2.服务器端查询这个UserName是否存在,存在的话生成一随机字符串randomStr,然后发回去

3.客户端接收到randomString,用你输入的明文password的hash值(其实就是数据库里存储的password的hash值)加上randomString,再算出其hash值,得到一个hashStr,然后传给服务器

4.服务器有password的hash值,也有randomStr,根据客户端的算法也生成一个hashStr与传来的hashStr进行对比,如果对比一致,就说明验证成功了

这个过程中并没有使用ssl协议进行加密,但是口令以及口令的哈希值并没有出现在传输过程中,无论是randomString还是hashStr被截取,想要由此获得口令或者口令的哈希值,还是很难的。
至于Oracle的所谓加密传输,其实就是用的挑战/应答,只不过比这个简单的模型要复杂一些,具体实现的细节也不一样,9i、10g、11g这些版本的实现细节也都各自不一样。

网上有相关的文章,虽然大体上说的都差不多,但是细节上有互相矛盾的地方,有些人说oracle的用户名会进行明文传输,有些人又说不会。
我在oracle 11.2.0.1.0这个版本上抓包,是会传输明文的用户名的。(截图在下面一节给)

从基本的模型上来看,Oracle使用挑战/应答基本上是可起到防窃听的作用的,但是似乎不完全:
ORACLE TNS Listener远程注册投毒(Poison Attack)漏洞

所以在默认情况下,即Oracle未采用SSL协议或加密技术的情况下,是给符合还是部分符合,就要自己斟酌了。

 4.3. Oralce如何开启连接加密与完整性校验

Oracle在默认配置下,连接以及连接后进行数据传输,是明文传输的(当然明文传输不代表传输的明文就一定会泄露信息,比如挑战/应答模式)。
可以在服务器端、客户端的sqlnet.ora文件里进行参数设置,从而实现保密性和完整性。
在服务器端,有4个参数:

SQLNET.ENCRYPTION_SERVER
SQLNET.ENCRYPTION_TYPES_SERVER
SQLNET.CRYPTO_CHECKSUM_SERVER
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER

对于SQLNET.ENCRYPTION_SERVER、SQLNET.CRYPTO_CHECKSUM_SERVER,其取值都是下面4个:

accepted 在另一方要求或要求时启用安全服务。
rejected 禁用安全服务,即使对方要求也是如此。
requested 如果另一方允许,则启用安全服务。
required 启用安全服务,如果另一侧未启用安全服务,则禁止连接。

对于SQLNET.ENCRYPTION_TYPES_SERVER、SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER,则是指定具体的加密算法和哈希算法:

3des112 用于带两键(112位)选项的三重DES
3des168 具有三键(168位)选项的三重DES
des 用于标准56位密钥大小
des40 用于40位密钥大小
……
md5 用于RSA Data Security的MD5算法
sha1 用于安全哈希算法

在客户端,也是这样的4个参数,只不过参数的名字有点不一样,将SERVER后缀改为CLIENT后缀,如SQLNET.ENCRYPTION_CLIENT。

对于客户端参数,SQLNET.ENCRYPTION_CLIENT与SQLNET.CRYPTO_CHECKSUM_CLIENT的默认值都是accepted
对于服务器端参数,SQLNET.ENCRYPTION_SERVER与SQLNET.CRYPTO_CHECKSUM_SERVER其默认值也都是accepted

所以,如果想要生效,只要在服务器端的sqlnet.ora文件里进行参数设置即可。

在默认情况下,传输为明文,使用Wireshark抓包可以发现,连接时的用户名时明文传输,连接成功后的SQL语句也是明文传输:

下图的test则是连接数据库时使用的用户名
1594622901.png!small

执行SQL语句:select username,password from DBA_USERS where ACCOUNT_STATUS=’OPEN’;
1594622916.png!small

当在服务器端进行参数设置后(SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER未指定,使用默认值):

#encryption
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = R*4_256(*是C,因为是敏感词所以替换掉了)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED

还是使用Wireshark抓包,重新连接数据库,以及执行SQL语句,会发现数据已被加密:
1594622934.png!small

查询分组字节流里的详细信息,也查不到test以及DBA_USERS关键字:

1594622950.png!small1594622984.png!small

那么设置了相关参数,是否能够能加确保鉴别信息的传输不被窃听呢?
我个人觉得应该是可以的。

在设置这些参数以前,以挑战/应答的基本模型来说的话,Oracle的鉴别过程中,服务器端发给客户端的随机字符串(这里叫AUTH_SESSKEY)以及客户端发给服务器端的哈希字符串(这里叫AUTH_PASSWORD)都是可以看到的,虽然也是密文:
1594623001.png!small

1594623010.png!small

在设置参数后,也就是加密后,应该变成了乱码,也搜不到了:
1594623022.png!small

1594623035.png!small

这样一来,应该是比较好的保证了鉴别信息不被窃听了。

注:直接在服务器端的sqlnet.ora文件里修改参数就可以对新的连接生效,无需重新启动数据库。另外,这样最,会影响数据库的性能,但是似乎影响不大。

 4.4. Oracle如何开启SSL

这个太麻烦了,有需要了解的还是自己去网上查阅相关文章吧……
判断的话,就去看listener.ora、sqlnet.ora文件,是否存在tcps,不存在应该就是没开启,当然,存在也不代表一定就开启了:
1594623049.png!small

 4.5. 鉴别信息具体指什么

PS:这方面的问题是群友“REEBUF上的等保不好做啊”告诉我的,我一开始也没在意鉴别信息具体指什么。

毕竟测评项的要求是指防止鉴别信息被窃听,那么鉴别信息在这里包不包括用户名呢?
严格来说的话,应该是不包括用户名的。

用户登录操作系统的过程,分为标识与鉴别两个部分。
其实等保1.0的初级教程中写得很清楚的,这里我直接截图:
1594623062.png!small

标识的作用是表明身份,鉴别就是对你表明的身份进行验证。

其实从身份鉴别的测评项a的描述中,也能看出来:
应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;

身份标识(信息)一般指的是用户名或者ID,身份鉴别信息一般指的是口令。
在测评项一个中的对身份鉴别信息有复杂度要求并定期更换,我们能够很清晰的分辨出,这是对口令有复杂度要求并定期更换,而不是对用户名有这样的要求。

所以,回到测评项c,防止鉴别信息被窃听中的鉴别信息,应该也只是单指密码,而不包含用户名。

实际上,明显的,标识,鉴别,鉴别信息等词本身没有基本要求的人自己造出来的,是一个具有明确含义的专业性名词。
实际上这在很多书籍中都有体现,群友“ REEBUF上的等保不好做啊”给我提供过相关的截图:
1594623081.png!small

1594623100.png!small

所以,如果在传输过程中用户名是明文传输的,理论上不会影响到测评项的满足。

 五、测评项

d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。

这个就不要强求了,只要能用补救措施降低风险,不成为高风险就好。

不过对于Windows系统而言,可以使用第三方软件实现双因素认证:

 5.1。火绒企业版

http://www.huorong.cn/dynamic/2020-02-27/1582786160432.html
1594623145.png!small

不过看了说明,没搞明白这个动态密码是随机生成的字符串,还是用了密码技术。

 5.2。360天擎

1594623159.png!small

这个说得很清楚,其原理是在控制中心和手机上的软件使用相同的密钥和算法进行计算,算出相同的结果,然后进行对比,不存在传递,需要联网,信号方面的问题。意义上的短信验证码的区别还是很大的。

 

来源:freebuf.com 2020-07-13 14:59:55 by: 起于凡而非于凡

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论