Apache Derby数据库JVM安全策略

2022-04-08 00:00:00 文件 服务器 配置 脚本 网络

抽象

我已经发布了许多有关Derby的博客:

  • Derby数据库备份
  • 同一主机上的多个Derby网络服务器
  • Apache Derby数据库用户和权限
  • 与Maven和内存中Derby数据库的集成测试

这本不打算是一个系列。 但是多年来,我越来越多地使用Derby。 我开始使用Derby作为微服务体系结构的数据库。 这些是个人使用的应用程序,因此Derby绰绰有余。 即使这些是个人使用的应用程序,我也需要具有有限用户权限的 多台服务器 ,当然还有数据库备份和还原 。 终要求是安全性。 我使用derby usr帐户在Ubuntu Linux VM上运行Derby数据库。 尽管derby usr帐户对VM的权限有限,但是任何额外的安全层都是好的。 因此,本博客的目的是演示如何使用Java安全策略运行Derby,以限制JVM的权限并增强运行时安全性。

免责声明

这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但终自己做出决定,风险自负。

要求

我使用以下主要技术完成了本文的所有工作。 您可能可以使用不同的技术或版本来做相同的事情,但不能保证。

  • Apache Derby 10.14.2.0
  • Java zulu11.39.15-ca-jdk11.0.7-linux_x64

我将不涉及下载和安装这些技术的过程。 我将其留给您练习。

注意从版本10.15开始,Derby项目已更新为使用Java 9模块系统。 结果,JAR文件已经发生了很大变化。 下面的security.policy不太可能与10.15+版本一起使用。 截至本博客的发布日期,我还没有尝试过。

Linux bash脚本

为了管理Derby使其与Java安全策略一起运行,您需要3个脚本。 个脚本将设置设置环境变量以配置Derby。 第二个脚本将启动Derby网络服务器,并传递正确的命令行参数。 第三台将停止Derby网络服务器。

清单1.1向您展示了这些脚本中的个。 它导出具有特定配置值的许多系统环境变量,这些配置值专门用于在您的环境中运行Derby。

清单1.1 – setenv.sh

 #!/bin/bash  export DERBY_HOME=/home/derby/opt/derby  export PATH= "$DERBY_HOME/bin:$PATH"  echo "DERBY_HOME=$DERBY_HOME"  export JAVA_HOME=/home/derby/opt/java  echo "JAVA_HOME=$JAVA_HOME"  export NS_HOME=/var/local/derby/ 1527  mkdir -p $NS_HOME  echo "NS_HOME=$NS_HOME"  export NS_PORT= 1527  echo "NS_PORT=$NS_PORT"  export NS_HOST= 0.0 . 0.0  echo "NS_HOST=$NS_HOST"  export DERBY_OPTS= ""  export DERBY_OPTS= "$DERBY_OPTS -Dderby.drda.host=$NS_HOST"  export DERBY_OPTS= "$DERBY_OPTS -Dderby.drda.portNumber=$NS_PORT"  export DERBY_OPTS= "$DERBY_OPTS -Dderby.system.home=$NS_HOME"  # Security Policy  export DERBY_OPTS= "$DERBY_OPTS -Dderby.stream.error.logSeverityLevel=0"  export DERBY_OPTS= "$DERBY_OPTS -Dderby.security.port=$NS_PORT"  export DERBY_OPTS= "$DERBY_OPTS -Dderby.install.url=file:$DERBY_HOME/lib/"  export DERBY_OPTS= "$DERBY_OPTS -Djava.security.manager"  export DERBY_OPTS= "$DERBY_OPTS -Djava.security.policy=$NS_HOME/security.policy" 

DERBY_HOME不言自明。 这是解压缩(安装)Derby的地方。 将Derby的bin目录添加到PATH 。

JAVA_HOME是不言自明的。 这是解压缩(安装)Java的地方。 将Java的bin目录添加到PATH 。

NS_HOME“N etwork 小号 erver家”。 这是Derby网络服务器将用于存储其配置和数据库的目录。 每当在此Derby网络服务器上创建新数据库时,都会在NS_HOME下为新数据库创建一个新的子目录。 这允许在同一主机上运行的多个Derby网络服务器将其数据分开。

NS_PORT“N etwork 小号 erver端口”。 这是Derby网络服务器用来侦听连接的端口。 这允许多个Derby网络服务器在同一主机上运行。

NS_HOST“N etwork 小号 erver主机”。 它设置侦听连接时Derby网络服务器使用的网络接口。 默认情况下,Derby网络服务器仅在127.0.0.1的环回地址上侦听连接。 此默认值表示客户端必须与网络服务器在同一主机上运行-不太有用。 通过将主机设置为0.0.0.0 ,Derby网络服务器将侦听主机上任何网络接口上的连接。 如果您的VM具有多个网络接口,则应将NS_HOST设置为这些接口之一的IP。 设置此值可使客户端成为远程客户端。

DERBY_OPTS是用于将所有配置选项获取到Derby的系统属性。 通过将适当的Derby系统属性及其关联值连接在一起来创建其值。 使用或不使用安全策略来启动Derby都需要前三个属性。

  1. derby.drda.host
  2. derby.drda.portNumber
  3. derby.system.home

配置Derby使其与安全策略一起运行时,需要后5个属性。

  1. derby.stream.error.logSeverityLevel
  2. derby.security.port
  3. derby.install.url
  4. java.security.manager
  5. java.security.policy

其中重要的特性之一是java.security.policy=$NS_HOME/security.policy" 。这个属性指向的值security.policy文件,该文件将配置Java SecurityManager ,你会读到有关创建security.policy文件接下来,您将看一下启动服务器的脚本。

清单1.2显示了这些脚本的第二个。 它会启动Derby网络服务器,并传递正确的命令行参数,因此Derby会以安全策略运行。

清单1.2 – start.sh

 #!/bin/bash  # Directory of the script  SD=$( cd "$( dirname " ${BASH_SOURCE[  ]} " )" && pwd )  # Source in common variables  source $SD/setenv.sh  # Symlink the network server configurations  ln -sf $SD/../conf/security.policy $NS_HOME/security.policy  ln -sf $SD/../conf/derby.properties $NS_HOME/derby.properties  startNetworkServer 

SDS CRIPT d irectory。 该评估确定start.sh脚本的标准文件系统位置,并将其分配给SD 。 当引用其他脚本时,这很有用。

来源不言自明。 它在系统环境变量中来源以配置Derby网络服务器。 有关详细信息,请参见清单1.1。

Symlink配置适用于security.policy文件和derby.properties文件。 符号链接的目的是将这两个文件放入$NS_HOME目录。 Derby在$NS_HOME目录中寻找derby.properties文件,因此它必须存在。 为了保持一致性(不是必需的),您还希望将security.policy文件放在此处。 在清单1.1中, java.security.policy=$NS_HOME/security.policy"属性配置了此位置。对于我的环境,我将$NS_HOME目录与保存管理脚本和其他Derby配置文件的目录分开。我这样做是因为灾难恢复,我认为$NS_HOME目录是$NS_HOME ,这意味着如果由于某种原因它丢失了(删除,磁盘驱动器错误,损坏,构建新的VM等),我必须能够恢复数据库数据,管理脚本( setenv.sh , start.sh , stop.sh )和配置文件( security.policy , derby.properties从我的云备份)。 真正的配置文件的保留之外$NS_HOME目录, start.sh将它们在正确的位置符号链接。

startNetworkServer是Derby提供的脚本( $DERBY_HOME/bin ),用于启动网络服务器。 该DERBY_OPTS变量-在设置setenv.sh -用于配置网络服务器。 默认情况下,Derby使用有限的安全策略运行。 但是,由于配置了安全策略,因此Derby将使用您的配置而不是默认配置。

现在,您具有Derby服务器环境配置和启动脚本。 您还没有能够停止Derby网络服务器的功能。 停止服务器很容易。 您将查看下一个用于停止服务器的脚本。

注意仍然还需要security.policy文件。 我保证,您将在短时间内阅读到有关它的信息!

清单1.3显示了这些脚本的第三个。 它将停止Derby网络服务器。 不太令人兴奋,但是对服务器进行有管理的关闭以防止数据损坏很重要。

清单1.3 – stop.sh

 #!/bin/bash  # Directory of the script  SD=$( cd "$( dirname " ${BASH_SOURCE[  ]} " )" && pwd )  # Source in common variables  source $SD/setenv.sh  stopNetworkServer 

所有这些都是不言自明的。 此脚本不需要进一步的注释。

security.policy文件

Derby随附一个演示安全策略文件。 它位于DERBY_HOME/demo/templates/security.policy 。 使用此文件作为起点,我能够生成满足以下要求的终版本:

  • 网络(远程)访问
  • 本地主机访问
  • 启动
  • 关掉
  • 后备

清单2.1 – security.policy

  1. 相关文章