德比数据库升级文件权限问题



我当前正在运行从版本 10.13.1.1 创建的 derby 数据库实例 我通过运行在redhat服务器上的网络模式(startNetworkServer)进行连接。

我现在想升级到版本 10.14.2.0

但是,当尝试连接到升级的数据库时,我收到拒绝访问"java.io.FilePermission"错误。

详: 我去将版本 10.13.1.1 和 10.14.2.0 下载到我的 Windows 桌面上。

使用以下命令创建数据库的备份:SYSCS_UTIL。SYSCS_BACKUP_DATABASE

我将此备份复制到10.13和10.14文件夹。

从当前版本(13)开始,我启动网络服务器,然后使用ij连接到数据库。这工作正常,我可以看到表格。这验证了我的备份是否正常。

connect 'jdbc:derby://localhost:1527/c:Temp13database;create=false';

然后我启动我的 14 版本网络服务器,然后转到 14 的 ij。当我尝试连接到备份时:

connect 'jdbc:derby://localhost:1527/c:Temp14database;create=false';

我收到文件权限错误:

错误 XJ001: DERBY SQL 错误: 错误代码: 0, SQLSTATE: XJ001, SQLERRMC: java.security.AccessControlException 访问被拒绝("java.io.FilePermission" "C:\Temp\updating_derby\threatadvisor" "read") XJ001.U

公平地说,我认为这是因为我正在尝试连接到旧版本,而没有运行 upgrade=true 参数。当我删除创建参数并添加升级参数时,它仍然失败并出现相同的问题。

好的,所以也许我无法通过网络服务器升级数据库,我必须直接连接到数据库。在我的应用中,我使用以下连接字符串:

jdbc:derby:C:/Temp/14/database;upgrade=true;

该应用程序在类路径上有版本 14 jar,因此应使用它并进行升级。它确实如此,应用程序正常启动,我看到所有数据。我怎么知道它升级了?因为我尝试使用 14 网络服务器和 ij 连接到这个 13 数据库,但它失败了(由于版本原因,正如预期的那样)。

所以我做对了?不,我再次尝试使用 ij 通过网络服务器连接到这个现已升级的数据库,我再次遇到 java.io.FilePermission 问题。

我进去确保"数据库"文件夹中的文件夹和文件的实际操作系统权限不仅仅是只读的。都不是。然而,它仍然错误。

我什至尝试在 redhat 盒子(在不同的端口上)上运行 14 网络服务器,并尝试通过 ij 连接到此数据库,即使在那里我也遇到了文件权限问题。

我真的不知道下一步该怎么做。请帮忙!

仅供参考,德比.log文件中的完整问题:

周二 6 月 11 日 12:04:15 AEST 2019:Apache Derby 网络服务器 - 10.14.2.0 - (1828579) 已启动并准备好接受端口 1527 上的连接 周二 6月 11 12:04:28 AEST 2019 线程[DRDAConnThread_2,5,主] 清理操作开始 java.security.AccessControlException: access deny ("java.io.FilePermission" "C:\Temp\14\database" "read") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkRead(SecurityManager.java:888) at java.io.File.exists(File.java:814) at java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:434) at java.io.File.getCanonicalPath(File.java:618) at org.apache.derby.impl.io.DirStorageFactory.doInit(未知来源) at org.apache.derby.impl.io.BaseStorageFactory.init(未知来源) at org.apache.derby.impl.io.DirStorageFactory.init(未知来源) at org.apache.derby.impl.services.monitor.StorageFactoryService.privGetStorageFactoryInstance(未知来源) at org.apache.derby.impl.services.monitor.StorageFactoryService.access$400(未知来源) at org.apache.derby.impl.services.monitor.StorageFactoryService$12.run(未知来源) at org.apache.derby.impl.services.monitor.StorageFactoryService$12.run(未知来源) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.impl.services.monitor.StorageFactoryService.getCanonicalServiceName(未知来源) at org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(未知来源) at org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(未知来源) at org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(未知来源) at org.apache.derby.impl.jdbc.EmbedConnection$4.run(未知来源) at org.apache.derby.impl.jdbc.EmbedConnection$4.run(未知来源) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.impl.jdbc.EmbedConnection.startPersistentService(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.(来源不明) at org.apache.derby.jdbc.InternalDriver$1.run(未知来源)at org.apache.derby.jdbc.InternalDriver$1.run(未知来源) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(未知来源) at org.apache.derby.jdbc.InternalDriver.connect(未知来源) at org.apache.derby.jdbc.InternalDriver.connect(未知来源) at org.apache.derby.jdbc.EmbeddedDriver.connect(未知来源) at org.apache.derby.impl.drda.Database.makeConnection(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.getConnFromDatabaseName(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.verifyUserIdPassword(未知来源) at org.apache.derby.impl.drda.DRDAConnThread.parseSECCHK(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.parseDRDAConnection(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.processCommand(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.run(未知来源) 清理操作已完成

编辑 1现在尝试按照本指南设置 security.policy 文件。但是,在基于 demo 目录中的模板创建新的策略文件后,我们甚至无法让 derby 来获取我们的文件。 当我们尝试运行时:

java -classpath "C:Temp14libderby.jar;C:Temp14libderbynet.jar;C:Temp14libderbyclient.jar;C:Temp14libderbytools.jar;C:Temp14libderbyoptionaltools.jar" -Djava.security.manager -Djava.security.policy=C:Temp14server.policy org.apache.derby.drda.NetworkServerControl start

我们收到以下错误:

java.security.AccessControlException: access deny org.apache.derby.security.SystemPermission( "engine", "usederbyinternals" ) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at org.apache.derby.iapi.security.SecurityUtil.checkDerbyInternalsPrivilege(Unknown Source) at org.apache.derby.iapi.services.monitor.Monitor.getMonitorLite(未知来源) at org.apache.derby.iapi.services.property.PropertyUtil$2.run(未知来源) at org.apache.derby.iapi.services.property.PropertyUtil$2.run(未知来源) at java.security.AccessController.doPrivileged(Native Method) at org.apache.derby.iapi.services.property.PropertyUtil.getMonitorLite(未知来源) at org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(未知来源) at org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(未知来源) at org.apache.derby.impl.drda.NetworkServerControlImpl.init(Unknown Source) at org.apache.derby.impl.drda.NetworkServerControlImpl.(来源不明) at org.apache.derby.drda.NetworkServerControl.main(未知来源)

我知道这一行在策略文件中(并且未注释):

permission org.apache.derby.security.SystemPermission "engine", "usederbyinternals";

但是,我认为它甚至没有拿起我们的策略文件,就像我们将引用更改为不存在的策略文件一样,我们仍然会收到相同的错误。

感谢@BryanPendleton为我指出正确的方向。对于最初的问题,确实是因为我们需要server.policy文件。他的链接很有帮助: db.apache.org/derby/docs/10.14/security/csecjavasecurity.html

我们遇到的第二个问题已通过使用位于此处的 server.policy 文件模板解决: https://builds.apache.org/job/Derby-docs/lastSuccessfulBuild/artifact/trunk/out/security/rsecbasicserver.html

而不是下载中提供的那个(德比下载中的那个没有提到那么多罐子)。更重要的是,我们引用罐子的方式必须进行调整。你会看到所有的例子都是针对Unix格式的,而我们是在一个测试Windows PC上开发的。因此,而不是类似 (unix) 的东西:

grant codeBase "file:///home/someone/derby/lib/derby.jar"

我们需要做:

grant codeBase "file:///C:/Temp/14/lib/derby.jar"

请注意"file"后面的附加"/" - 我们假设它只是"file://C:....">

这个问题还有另一种解决方案,那就是使用此代码:

https://github.com/apache/hive/blob/master/core/src/test/java/org/apache/hive/hcatalog/DerbyPolicy.java

并使用它: Policy.setPolicy(new DerbyPolicy());

以编程方式获取策略集。