【问题标题】:derby db upgrade file permission issuederby db升级文件权限问题
【发布时间】:2019-06-11 03:41:20
【问题描述】:

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

我现在想升级到版本 10.14.2.0

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

详情: 我去我的 Windows 桌面下载了 10.13.1.1 和 10.14.2.0 版本。

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

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

从我当前的版本(13)开始,我启动网络服务器,然后使用 ij 连接到数据库。这很好用,我可以看到表格。这证明我的备份没问题。

connect 'jdbc:derby://localhost:1527/c:\Temp\13\database;create=false';

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

connect 'jdbc:derby://localhost:1527/c:\Temp\14\database;create=false';

我收到文件权限错误:

ERROR XJ001: DERBY SQL 错误: ERRORCODE: 0, SQLSTATE: XJ001, SQLERRMC: java.security.AccessControlException 拒绝访问(“java.io.FilePermission”“C:\Temp\updating_derby\threatadvisor”“读取”) XJ001.U

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

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

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

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

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

我进入并确保“数据库”文件夹中的文件夹和文件的实际操作系统权限不仅仅是只读的。没有。但它仍然出错。

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

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

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

2019 年 6 月 11 日星期二 12:04:15 AEST:Apache Derby 网络服务器 - 10.14.2.0 - (1828579) 已启动并准备好接受端口 1527 上的连接 Tue Jun 11 12:04:28 AEST 2019 Thread[DRDAConnThread_2,5,main] 清理动作开始 java.security.AccessControlException: 访问被拒绝 ("java.io.FilePermission" "C:\Temp\14\database" "read") 在 java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) 在 java.security.AccessController.checkPermission(AccessController.java:884) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在 java.lang.SecurityManager.checkRead(SecurityManager.java:888) 在 java.io.File.exists(File.java:814) 在 java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:434) 在 java.io.File.getCanonicalPath(File.java:618) 在 org.apache.derby.impl.io.DirStorageFactory.doInit(未知来源) 在 org.apache.derby.impl.io.BaseStorageFactory.init(未知来源) 在 org.apache.derby.impl.io.DirStorageFactory.init(未知来源) 在 org.apache.derby.impl.services.monitor.StorageFactoryService.privGetStorageFactoryInstance(未知来源) 在 org.apache.derby.impl.services.monitor.StorageFactoryService.access$400(未知来源) 在 org.apache.derby.impl.services.monitor.StorageFactoryService$12.run(未知来源) 在 org.apache.derby.impl.services.monitor.StorageFactoryService$12.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 org.apache.derby.impl.services.monitor.StorageFactoryService.getCanonicalServiceName(未知来源) 在 org.apache.derby.impl.services.monitor.BaseMonitor.findProviderAndStartService(未知来源) 在 org.apache.derby.impl.services.monitor.BaseMonitor.startPersistentService(未知来源) 在 org.apache.derby.iapi.services.monitor.Monitor.startPersistentService(未知来源) 在 org.apache.derby.impl.jdbc.EmbedConnection$4.run(未知来源) 在 org.apache.derby.impl.jdbc.EmbedConnection$4.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 org.apache.derby.impl.jdbc.EmbedConnection.startPersistentService(未知来源) 在 org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(未知来源) 在 org.apache.derby.impl.jdbc.EmbedConnection.(未知来源) 在 org.apache.derby.jdbc.InternalDriver$1.run(未知来源) 在 org.apache.derby.jdbc.InternalDriver$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(未知来源) 在 org.apache.derby.jdbc.InternalDriver.connect(未知来源) 在 org.apache.derby.jdbc.InternalDriver.connect(未知来源) 在 org.apache.derby.jdbc.EmbeddedDriver.connect(未知来源) 在 org.apache.derby.impl.drda.Database.makeConnection(未知来源) 在 org.apache.derby.impl.drda.DRDAConnThread.getConnFromDatabaseName(未知来源) 在 org.apache.derby.impl.drda.DRDAConnThread.verifyUserIdPassword(未知来源) 在 org.apache.derby.impl.drda.DRDAConnThread.parseSECCHK(未知来源) 在 org.apache.derby.impl.drda.DRDAConnThread.parseDRDAConnection(未知来源) 在 org.apache.derby.impl.drda.DRDAConnThread.processCommands(未知来源) 在 org.apache.derby.impl.drda.DRDAConnThread.run(未知来源) 清理动作完成

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

java -classpath "C:\Temp\14\lib\derby.jar;C:\Temp\14\lib\derbynet.jar;C:\Temp\14\lib\derbyclient.jar;C:\Temp\14\lib\derbytools.jar;C:\Temp\14\lib\derbyoptionaltools.jar" -Djava.security.manager -Djava.security.policy=C:\Temp\14\server.policy org.apache.derby.drda.NetworkServerControl start

我们得到以下错误:

java.security.AccessControlException: 拒绝访问 org.apache.derby.security.SystemPermission( "engine", "usederbyinternals" ) 在 java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) 在 java.security.AccessController.checkPermission(AccessController.java:884) 在 org.apache.derby.iapi.security.SecurityUtil.checkDerbyInternalsPrivilege(未知来源) 在 org.apache.derby.iapi.services.monitor.Monitor.getMonitorLite(未知来源) 在 org.apache.derby.iapi.services.property.PropertyUtil$2.run(未知来源) 在 org.apache.derby.iapi.services.property.PropertyUtil$2.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 org.apache.derby.iapi.services.property.PropertyUtil.getMonitorLite(未知来源) 在 org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(未知来源) 在 org.apache.derby.iapi.services.property.PropertyUtil.getSystemProperty(未知来源) 在 org.apache.derby.impl.drda.NetworkServerControlImpl.init(未知来源) 在 org.apache.derby.impl.drda.NetworkServerControlImpl.(未知来源) 在 org.apache.derby.drda.NetworkServerControl.main(未知来源)

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

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

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

【问题讨论】:

  • 请仔细阅读 Derby 10.14 文档的这一部分:db.apache.org/derby/docs/10.14/security/csecjavasecurity.html 您需要向 Derby Network Server 指定允许读取和写入硬盘上的哪些区域。
  • 感谢@BryanPendleton,我们现在正在研究这个。不幸的是,我们似乎无法迈出第一步!我将在上面的问题中进行编辑,以获取有关它为什么不起作用的完整详细信息。
  • 其实貌似有同事突破了。这就是我们在策略中引用 jar 的方式。明天早上我看到他们的解决方案时会准确地写出这个问题。

标签: derby


【解决方案1】:

感谢@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:...."

【讨论】:

    【解决方案2】:

    这个问题的另一个解决方案是使用这个代码:

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

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

    以编程方式获取策略集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-19
      • 2020-11-27
      • 2011-10-13
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多