为 sysdba 用户更改默认密码后,Firebird 不会忘记默认密码
Firebird does not forget default password after changing it for sysdba user
我无法让 Firebird 忘记默认用户的旧密码。我已经在我的本地计算机上安装了 Firebird 版本 3.0.4。我试图通过 gsec 工具将默认密码 masterkey 更改为另一个。首先,我使用命令登录到此工具:
gsec -user sysdba -password masterkey -database "C:\Program Files\Firebird\Firebird_3_0\security3.fdb"
然后使用命令修改我设置了下一个密码:
modify sysdba -pw qwerty12
问题是现在我可以使用两个密码登录到 sysdba 帐户,旧的 masterkey 密码和新的 qwerty12 密码。如何让 Firebird 忘记旧的默认密码?
问题不在于 Firebird 记住默认密码,问题在于 Firebird 存储每个身份验证插件的密码,并且 SYSDBA 恰好存在于两个(或可能更多)身份验证插件。
要解决此问题,您必须删除其中一个身份验证插件的 SYSDBA 帐户,或更改其密码。不幸的是,删除 SYSDBA 帐户对于 Legacy_Auth 插件来说相当困难(您需要手动将其从安全数据库中删除,请参阅本答案的末尾)。
假设安装了标准的 Firebird(具有身份验证插件 Srp 和 Legacy_Auth),您需要执行以下操作来更改密码(注意:我假设有问题的帐户是 Legacy_Auth, 不是 Srp):
在 firebird.conf
中,设置 UserManager
确保列出两个用户管理器:
UserManager = Srp, Legacy_UserManager
重启 Firebird
更改两个插件的密码
alter user SYSDBA password '<new password>' using plugin Srp;
alter user SYSDBA password '<new password>' using plugin Legacy_UserManager;
请记住:旧版身份验证插件会将密码截断为 8 个字符。
如果您想完全阻止使用 Legacy_Auth 插件进行身份验证,请编辑 firebird.conf
并从 AuthServer
设置中删除 Legacy_Auth
(同时检查 databases.conf
如果数据库有自定义配置)。
我已经在 firebird-devel 邮件列表中询问了关于无法删除 Legacy_Auth SYSDBA 帐户的问题。我得到的答案是,从历史上看,在旧的 Firebird 版本中删除 SYSDBA 帐户是不可能的,因此 Legacy_UserManager 插件明确不允许删除 SYSDBA(而 Srp 允许)。解决方法是直接连接安全数据库,手动删除PLG$USERS
table中的用户(其中包含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账号,只需要执行(admin):
drop user SYSDBA using plugin Srp;
我无法让 Firebird 忘记默认用户的旧密码。我已经在我的本地计算机上安装了 Firebird 版本 3.0.4。我试图通过 gsec 工具将默认密码 masterkey 更改为另一个。首先,我使用命令登录到此工具:
gsec -user sysdba -password masterkey -database "C:\Program Files\Firebird\Firebird_3_0\security3.fdb"
然后使用命令修改我设置了下一个密码:
modify sysdba -pw qwerty12
问题是现在我可以使用两个密码登录到 sysdba 帐户,旧的 masterkey 密码和新的 qwerty12 密码。如何让 Firebird 忘记旧的默认密码?
问题不在于 Firebird 记住默认密码,问题在于 Firebird 存储每个身份验证插件的密码,并且 SYSDBA 恰好存在于两个(或可能更多)身份验证插件。
要解决此问题,您必须删除其中一个身份验证插件的 SYSDBA 帐户,或更改其密码。不幸的是,删除 SYSDBA 帐户对于 Legacy_Auth 插件来说相当困难(您需要手动将其从安全数据库中删除,请参阅本答案的末尾)。
假设安装了标准的 Firebird(具有身份验证插件 Srp 和 Legacy_Auth),您需要执行以下操作来更改密码(注意:我假设有问题的帐户是 Legacy_Auth, 不是 Srp):
在
firebird.conf
中,设置UserManager
确保列出两个用户管理器:UserManager = Srp, Legacy_UserManager
重启 Firebird
更改两个插件的密码
alter user SYSDBA password '<new password>' using plugin Srp; alter user SYSDBA password '<new password>' using plugin Legacy_UserManager;
请记住:旧版身份验证插件会将密码截断为 8 个字符。
如果您想完全阻止使用 Legacy_Auth 插件进行身份验证,请编辑 firebird.conf
并从 AuthServer
设置中删除 Legacy_Auth
(同时检查 databases.conf
如果数据库有自定义配置)。
我已经在 firebird-devel 邮件列表中询问了关于无法删除 Legacy_Auth SYSDBA 帐户的问题。我得到的答案是,从历史上看,在旧的 Firebird 版本中删除 SYSDBA 帐户是不可能的,因此 Legacy_UserManager 插件明确不允许删除 SYSDBA(而 Srp 允许)。解决方法是直接连接安全数据库,手动删除PLG$USERS
table中的用户(其中包含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账号,只需要执行(admin):
drop user SYSDBA using plugin Srp;