Oracle12c-19c如何防止安全检查查出弱密码?
ORACLE数据库在安全方面可靠度绝对完善,包括数据库用户的密码加密,在之前的老版本中如10G及以前,密码在dba_user.password显示密文, 由于使用的是DES加密,很容易从网上找到解密密文的方法,可以现在都12C–19C了,之前分享过《Oracle 12c 关于密码(password)的几个新特性小结》都已经引入了新的密码hash算法,怎么还经常能收到安全检查提示数据库用户有弱密码? 他们还能解密12c以后的PBKDF2的SHA512哈希算法? 那也太牛了吧,经常让DBA去改弱密码,DBA不能忍,于是研究一下怎么回事。
从安全提供12c数据库中个人用户密码的密文发现是类似“FC110DD5268B2BB5“这种短值,不应该呀,从哪取到的?USER$.password列。从11g以后密码区分大小写的值就已经存在了user$.spare4,但是为了向前兼容,在user$.password列还有以前老版本的不区分大小写密文。安全室就是从USER$.password列取到的值做的解密, 如果让他取不到这个值,自然也就解不了密。
到12c了为什么user$.password 有的数据库环境还有值?而有的没有? 是因为有些数据库为了应用或数据库客户端向低版本兼容,在$ORACLE_HOME/netword/admin/sqlnet.ora中的SQLNET.ALLOWED_LOGON_VERSION_SERVER 配置了如8等值,这个问题我在<升级12C注意事项: 连接失败 ORA-28040 ORA-1017提到过。
如果我们的客户端11.2.0.3以上,则没有必要配置低于version 12的值, 下面测试不同version对于user$.password的影响。
测试版本Oracle 19.3
[oracle@zcloud ~]$ for i in 8 9 10 11 12 12a; do
> echo "change version $i ..."
> echo "SQLNET.ALLOWED_LOGON_VERSION_SERVER="$i > $ORACLE_HOME/network/admin/sqlnet.ora;
> sqlplus -s / as sysdba< create user c##anbob$i identified by anbob1;
> exit;
> EOF
> done;
change version 8 ...
User created.
change version 9 ...
User created.
change version 10 ...
User created.
change version 11 ...
User created.
change version 12 ...
User created.
change version 12a ...
User created.
SQL> col name for a30
SQL> col password for a50
SQL> col password_ver for a30
SQL>
SQL> select decode(bitand(u.spare1, 65536), 65536, NULL, decode(
2 REGEXP_INSTR(
3 NVL2(u.password, u.password, ' '),
4 '^ $'
5 ),
6 0,
7 decode(length(u.password), 16, '10G ', NULL),
8 ''
9 ) ||
10 decode(
11 REGEXP_INSTR(
12 REGEXP_REPLACE(
13 NVL2(u.spare4, u.spare4, ' '),
14 'S:000000000000000000000000000000000000000000000000000000000000',
15 'not_a_verifier'
16 ),
17 'S:'
18 ),
19 0, '', '11G '
20 ) ||
21 decode(
22 REGEXP_INSTR(
23 NVL2(u.spare4, u.spare4, ' '),
24 'T:'
25 ),
26 0, '', '12C '
27 ) ||
28 decode(
29 REGEXP_INSTR(
30 REGEXP_REPLACE(
31 NVL2(u.spare4, u.spare4, ' '),
32 'H:00000000000000000000000000000000',
33 'not_a_verifier'
34 ),
35 'H:'
36 ),
37 0, '', 'HTTP '
38 )) password_ver,name,password from user$ u where name like 'C##ANBOB%';
PASSWORD_VER NAME PASSWORD
------------------------------ ------------------------------ --------------------------------------------------
10G 11G 12C C##ANBOB10 0852D701E1A4619C
10G 11G 12C C##ANBOB11 298571205D180182
11G 12C C##ANBOB12
12C C##ANBOB12A
10G 11G 12C C##ANBOB8 AC6D78B1D13E979E
10G 11G 12C C##ANBOB9 9DDA94FCEAA503BA
Note:
当SQLNET.ALLOWED_LOGON_VERSION_SERVER在12及12A时,user$.password列就不再有值。
Note: 本文的目的当然不是为了掩耳盗铃, 有些弱密码还是不建议使用,数据库也有自带的verify_function可以做为最基本的验证,我们也有自定义该方法,修改时过滤弱密码表,也是一种不错的方法。
对不起,这篇文章暂时关闭评论。