firebird - Firebird 为 sysdba 用户更改默认密码后不会忘记默认密码
问题描述
我无法让 Firebird 忘记默认用户的旧密码。我在本地计算机上安装了 Firebird 3.0.4 版。我试图通过 gsec 工具将默认密码主密钥更改为另一个。首先,我使用以下命令登录该工具:
gsec -user sysdba -password masterkey -database "C:\Program Files\Firebird\Firebird_3_0\security3.fdb"
然后使用命令 modify 我设置了下一个密码:
modify sysdba -pw qwerty12
问题是现在我可以使用两个密码登录 sysdba 帐户,旧的 masterkey 密码和新的 qwerty12 密码。如何让 Firebird 忘记旧的默认密码?
解决方案
问题不在于 Firebird 记住了默认密码,问题在于 Firebird 为每个身份验证插件存储了一个密码,而 SYSDBA 恰好存在两个(或可能更多)身份验证插件。
要解决此问题,您必须删除其中一个身份验证插件的 SYSDBA 帐户,或更改其密码。不幸的是,对于 Legacy_Auth 插件,删除 SYSDBA 帐户相当困难(您需要从安全数据库中手动删除它,请参阅此答案的末尾)。
假设标准 Firebird 安装(具有身份验证插件 Srp 和 Legacy_Auth),您需要执行以下操作来更改密码(注意:我假设有问题的帐户是 Legacy_Auth 的帐户,而不是 Srp):
在
firebird.conf
,设置UserManager
确保列出两个用户管理员:UserManager = Srp, Legacy_UserManager
重启火鸟
更改两个插件的密码
alter user SYSDBA password '<new password>' using plugin Srp; alter user SYSDBA password '<new password>' using plugin Legacy_UserManager;
请记住:旧版身份验证插件会将密码截断为 8 个字符。
如果您想完全阻止使用 Legacy_Auth 插件进行身份验证,请编辑firebird.conf
并Legacy_Auth
从AuthServer
设置中删除(还要检查databases.conf
数据库是否具有自定义配置)。
我在 firebird-devel 邮件列表上询问了一个关于无法删除 Legacy_Auth SYSDBA 帐户的问题。我得到的答案是,从历史上看,在旧版 Firebird 中无法删除 SYSDBA 帐户,因此 Legacy_UserManager 插件明确禁止删除 SYSDBA(而 Srp 允许这样做)。解决方法是直接连接到安全数据库,并从PLG$USERS
表中手动删除用户(其中包含 Legacy_Auth 用户,Srp 用户在PLG$SRP
):
delete from plg$users where plg$user_name = 'SYSDBA';
您可以使用连接到安全数据库isql -user sysdba -password <yourpassword> security.db
(假设security.db
别名在 中定义databases.conf
,否则使用您的完整路径security3.fdb
)。
一个稍微模糊的替代方法是定义一个映射,使用 Legacy_Auth 将身份验证映射为 SYSDBA 到不同的(非特权)用户(例如 GUEST):
create global mapping NO_LEGACY_SYSDBA
using plugin Legacy_Auth
from user sysdba to user guest;
要删除 Srp 插件的 SYSDBA 帐户,您只需执行(以管理员身份):
drop user SYSDBA using plugin Srp;
推荐阅读
- robotframework - 机器人框架 - 具有多个名称的关键字
- mysql - 两个数据库字段是否都在使用中?
- python - 使用python从JSON dict中提取多个元素
- typescript - Firestore 多次定时批量提交挂起而没有任何响应
- javascript - JS:对如何让函数返回它的参数连接感到困惑
- javascript - AngularJS控制器没有被执行
- java - 尝试打开 Excel 工作簿时出现错误时,Try/Catch 不会激活
- python - 时间戳不会从字符串转换为浮点数
- java - 如何以编程方式关闭 Android 中的共享系统对话框?
- sql - DB2 SQL - 内部联接获取最后一行