KingbaseES支持基于强化口令的身份鉴别,包括对数据库用户的口令加密,以及复杂度进行检查、帐户口令的有效期限设置、帐户异常登录锁定、账户登录信息显示等安全策略的管理机制。
1. 口令加密 ¶
1.1. 口令加密认证 ¶
在配置文件kingbase.conf中的password_encryption参数决定用户口令加密的算法。当在CREATE/ALTER USER 中指定了口令时,这个参数决定用于加密该口令的算法。默认值是 scram-sha-256
。目前支持的口令加密算法有 md5
、 sm3
、 scram-sm3
、 sm4
。
有几种基于口令的认证方法。这些方法的过程类似,但是区别在于用户口令如何被存放在服务器上以及客户端提供的口令如何被通过连接发送。
scram-sha-256
方法
scram-sha-256
按照 RFC 7677 中的描述执行SCRAM-SHA-256认证。它使用的是一种挑战-响应的方案,可以防止在不可信连接上对口令的嗅探并且支持在服务器上以一种加密哈希的方式存放口令,因此被认为是安全的。这是当前提供的方法中最安全的一种,但是旧的客户端库不支持这种方法。
md5
方法
md5
使用一种自定义的安全性较低的挑战-响应机制。它能防止口令嗅探并且防止口令在服务器上以明文存储,但是无法保护攻击者想办法从服务器上窃取了口令哈希的情况。此外,现在认为MD5哈希算法对于确定攻击已经不再安全。
md5
方法不能与 db_user_namespace 特性一起使用。为了简化从
md5
方法到较新的SCRAM方法的转变,如果在sys_hba.conf
中指定了md5
但是用户在服务器上的口令是为SCRAM(见下文)加密的,则将自动选择基于SCRAM的认证。
password
方法
password
以明文形式发送口令,因此它对于口令“嗅探”攻击很脆弱。如果可能应该尽量避免使用它。不过,如果连接被SSL加密保护着,那么可以安全地使用password
(不过如果依靠SSL,SSL证书认证可能是更好的选择)。
sm3
方法
sm3
是中华人民共和国政府采用的一种密码散列函数标准,相关标准为“GM/T0004-2012《sm3密码杂凑算法》”。当进行口令认证时,会在传输前结合用户名和salt(服务器发送给客户端的随机数)对密码进行单向sm3
加密,以增加安全性。据国家密码管理局表示,其安全性及效率与SHA-256相当。
scram-sm3
国密算法的scram身份认证,通过sm3 hmac算法完成scram身份认证,用来替换掉sha-256算法。sha256算法为国际标准,不符合国密要求。
sm4
根据标准
GM/T --91-2020
,支持使用PBKDF2密钥生成算法及sm4算法加密的身份认证。
不同的基于口令的认证方法的可用性取决于用户的口令在服务器上是如何被加密(或者更准确地说是哈希)的。这由设置口令时的配置参数 password_encryption 控制。如果口令使用 scram-sha-256
设置加密,那么它可以被用于认证方法 scram-sha-256
和 password
(但后一种情况中口令将以明文传输)。如上所释,在这种情况下,指定的认证方法 md5
将自动切换到使用 scram-sha-256
方法。如果口令使用 md5
设置加密,那么它仅能用于 md5
和 password
认证方法说明(同样,后一种情况中口令以明文传输)。(之前的KingbaseES发行版支持在服务器上存储明文口令。现在已经不可能了)。要检查当前存储的口令哈希,可以参考系统目录 sys_authid
。
要把现有的安装从 md5
升级到 scram-sha-256
,可以在确保所有在用的客户端已经足以支持SCRAM之后,在 kingbase.conf
中设置 password_encryption = 'scram-sha-256'
,然后让所有用户设置新口令并且在 sys_hba.conf
中将认证方法说明改为 scram-sha-256
。
1.2. 设置口令密文 ¶
在KingbaseES中使用密码配置工具sys_encpwd来设置口令密文。用户密码配置工具sys_encpwd可以通过事先配置好指定用户的密码,将该用户的密码以密文形式存在.encpwd或encpwd.conf文件中。
使用方法:
该工具包含5个参数,5个参数均需要输入才能配置成功。
参数说明:
-H, --hostname=
主机地址,允许单主机地址匹配和全匹配,全匹配时使用*指定
-P, --portnum=
端口号,仅允许单端口匹配
-D, --database=
数据库名,允许单数据库匹配和全匹配,全匹配时使用*指定
-U, --user=
用户名,仅允许单用户匹配
-W, --password=
用户对应的密码,仅允许单用户匹配
注意
当前四个参数输入与原文件中的某一条记录完全相同时,会修改该条记录相应的密码,否则生成一条新的记录。
示例:
第一步:修改sao用户密码
ALTER USER SAO PASSWORD '12345678abc';
第二步:使用sys_encpwd工具配置密码
./sys_encpwd -H 127.0.0.1 -P 54321 -D security -U sao -W 12345678abc
./sys_encpwd -H \* -P 54321 -D \* -U sao -W 12345678abc
查看.encpwd文件可以看到密码为密文
cat ~/.encpwd
2. 口令大小写的区分 ¶
使用 CREATE USER 创建用户时,PASSWORD指定用户口令。口令需要使用单引号括起来,所以在KINGBASEES数据库中用户口令是区分大小写的。
3. 口令复杂性管理 ¶
口令的复杂度检查是由数据库安全员对口令的最小长度,所包含的数字、英文字母、特殊符号的数目进行设置后,在创建和修改用户时,自动对口令进行相关方面的检查。如果口令不满足指定的条件,那么创建用户将不成功。
KingbaseES通过插件的方式来进行口令的复杂度管理。这种方式更为灵活,当数据库的实用场景需要进行口令的复杂度管理时,加载插件即可。而不需要该功能时,卸载插件即可。 KingbaseES中通过4个全局级参数配合插件来实现用户口令复杂度管理。详情参见插件 passwordcheck https://help.kingbase.com.cn/v8/development/sql-plsql/ref-extended-plug-in/passwordcheck.html#passwordcheck。