数据安全已成为企业生命线。作为国产数据库的金科金仓(KingbaseES)提供了一系列强大的安全机制来保障数据资产。其中,密码有效期管理是防止因长期未更换密码而导致的安全隐患的重要手段。
今天,我们将深入探讨 KingbaseES v9 中用于实现这一功能的核心插件——identity_pwdexp.
什么是 identity_pwdexp?
identity_pwdexp 是 KingbaseES 的一个扩展插件,专门用于设置和管理数据库用户的口令(密码)有效期。
在很多安全合规标准(如等保2.0)中,明确要求系统必须强制用户定期更换密码。如果密码长期不变,一旦泄露,攻击者就能长期潜伏在系统中。identity_pwdexp 插件通过以下机制解决这个问题:
- 设定有效期:管理员可以设置密码的有效天数。
- 登录检查:当用户尝试登录时,插件会检查密码是否过期。
- 强制修改:如果密码已过期,系统将限制用户登录,并强制要求其输入新密码才能继续操作。
- 过期提示:支持在密码即将过期前的一定天数内给予用户提示。
与硬编码在核心代码中的功能不同,identity_pwdexp 以插件形式存在,这意味着你可以根据实际业务场景灵活加载或卸载,无需该功能时卸载即可,保持了系统的轻量化。
如何启用和配置 identity_pwdexp?
启用该插件主要分为三个步骤:修改配置文件、重启数据库、创建扩展和参数调优。
第一步:修改配置文件 (kingbase.conf)
cd /opt/Kingbase/ES/V9/data/$ ps -ef|grep kingbase
kingbase 1096 1 0 Mar05 ? 00:00:22 /opt/Kingbase/ES/V9/KESRealPro/V009R001C010/Server/bin/kingbase -D /opt/Kingbase/ES/V9/data
$ cd /opt/Kingbase/ES/V9/KESRealPro/V009R001C010/Server/bin/
./ksql -d kingbase -U system
License Type: 企业版.
Type "help" for help.
kingbase=# show shared_preload_libraries ;
shared_preload_libraries
---------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
synonym, plsql, force_view, kdb_flashback,plugin_debugger, plsql_plugin_debugger, plsql_plprofiler, kdb_ora_expr, sepapower, dblink, sys_kwr, sys_spaceq
uota, sys_stat_statements, backtrace, kdb_utils_function, auto_bmr, sys_squeeze, src_restrict, ktrack, kdb_database_link
(1 row)
cd /opt/Kingbase/ES/V9/data/
vi kingbase.conf
# 在 kingbase.conf 中添加或修改
shared_preload_libraries = 'identity_pwdexp'
第二步:重启数据库服务
[kingbase@anbob-75 bin]$ ./sys_ctl stop
sys_ctl: no database directory specified and environment variable KINGBASE_DATA unset
Try "sys_ctl --help" for more information.
[kingbase@anbob-75 bin]$ export KINGBASE_DATA=/opt/Kingbase/ES/V9/data
[kingbase@anbob-75 bin]$ ./sys_ctl stop
waiting for server to shut down.... done
server stopped
$ /opt/Kingbase/ES/V9/Server/bin/sys_ctl -D /opt/Kingbase/ES/V9/data -l logfile start
waiting for server to start.... done
server started
kingbase=# show shared_preload_libraries ;
shared_preload_libra
ries
---------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
synonym, plsql, force_view, kdb_flashback,plugin_debugger, plsql_plugin_debugger, plsql_plprofiler, kdb_ora_expr, sepapower, dblink, sys_kwr, sys_spaceq
uota, sys_stat_statements, backtrace, kdb_utils_function, auto_bmr, sys_squeeze, src_restrict, ktrack, kdb_database_link, identity_pwdexp
(1 row)
第三步:创建扩展
kingbase=# CREATE EXTENSION identity_pwdexp;
kingbase=# SELECT * FROM sys_extension WHERE extname = 'identity_pwdexp';
oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+-----------------+----------+--------------+----------------+------------+-----------+--------------
16416 | identity_pwdexp | 10 | 2200 | f | 1.0 | |
(1 row)
第四步:配置关键参数
[kingbase@anbob-75 bin]$ ./ksql -d kingbase -U system
License Type: 企业版.
Type "help" for help.
kingbase=# show identity_pwdexp.password_change_interval;
ERROR: must be sso to examine "identity_pwdexp.password_change_interval"
kingbase=# \c db1 sso
You are now connected to database "db1" as userName "sso".
db1=> show identity_pwdexp.password_change_interval;
identity_pwdexp.password_change_interval
------------------------------------------
30
(1 row)
[kingbase@anbob-75 bin]$ ./ksql -d kingbase -U sso -c "show all;"|grep pwdexp
identity_pwdexp.enable_common_user_autoset_interval | on | enable common user to autoset interval
identity_pwdexp.max_password_change_interval | 30 | The max value of password change interval(in days)
identity_pwdexp.password_change_interval | 5 | Password change interval(in days)
db1=> alter system set identity_pwdexp.password_change_interval = 5;
ALTER SYSTEM
db1=> alter system set identity_pwdexp.password_change_interval = 60;
ERROR: 60 is outside the valid range for parameter "identity_pwdexp.password_change_interval" (0 .. 30)
db1=> alter system set identity_pwdexp.password_change_interval = 5;
ALTER SYSTEM
db1=> show identity_pwdexp.password_change_interval;
identity_pwdexp.password_change_interval
------------------------------------------
30
(1 row)
db1=>
db1=> select sys_reload_conf();
sys_reload_conf
-----------------
t
(1 row)
db1=> show identity_pwdexp.password_change_interval;
identity_pwdexp.password_change_interval
------------------------------------------
5
(1 row)
通过 drop extension 来卸载插件:
drop extension identity_pwdexp;
配置完成后,当用户登录时:
- 正常情况:密码在有效期内,用户正常登录。
- 即将过期:如果距离密码过期少于
password_warn_days设定的天数,用户登录时会收到警告信息,提示其在多少天后密码将过期,建议尽快修改。- 示例输出:
WARNING: Your password will expire in 3 days.
- 示例输出:
- 已过期:如果密码已超过有效期且超过了宽限期,用户登录将被拒绝,并收到错误提示,要求联系管理员或使用特定流程修改密码。在某些配置下,系统可能会直接进入“修改密码”流程,只有成功修改新密码后才能登录。
最佳实践建议
- 豁免特权账户:对于某些系统内置的、用于自动化脚本的特权账户,可能需要设置永不过期的密码。可以通过特定参数或用户属性进行豁免(具体需参考最新文档,通常可通过设置
valid_until为无限远未来来实现,或者插件提供白名单机制)。 - 定期审计:定期检查
sys_users系统视图,监控哪些用户的密码即将过期或已过期,确保没有账户被意外锁定。
— over —