我无法让Firebird忘记默认用户的旧密码。我已在本地计算机上安装了Firebird 3.0.4版本。我已经尝试通过gsec工具将默认密码主密钥更改为另一个。首先,我用命令登录到这个工具:
gsec -user sysdba -password masterkey -database "C:Program FilesFirebirdFirebird_3_0security3.fdb"
然后通过命令修改,我设置了下一个密码:
modify sysdba -pw qwerty12
问题是,现在我可以同时使用两个密码登录sysdba帐户,即旧的主密钥密码和新的qwerty12密码。如何让火鸟忘记旧的默认密码?
问题不是Firebird记住了默认密码,而是Firebird为每个身份验证插件存储了一个密码,而SYSDBA恰好存在于两个(或更多(身份验证插件中。
要解决此问题,您必须删除其中一个身份验证插件的SYSDBA帐户,或者更改其密码。不幸的是,对于Legacy_Auth插件来说,删除SYSDBA帐户相当困难(您需要从安全数据库中手动删除它,请参阅本答案末尾的内容(。
假设标准的Firebird安装(具有身份验证插件Srp和Legacy_Auth(,您需要执行以下操作来更改密码(注意:我假设有问题的帐户是Legacy_Aauth的帐户,而不是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
表中手动删除用户(其中包含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;