配置远程数据库别名

远程数据库别名可用于提供与一个或多个图的连接,这些图位于一个或多个远程独立服务器或集群上。

尽管远程数据库别名不存储任何数据,但它们使用户或应用程序能够像在本地 DBMS 服务器上一样对远程数据库执行查询。所有配置都可以通过运行系统上的管理命令完成。任何更改都会在集群的所有实例之间自动同步。

以下步骤描述了为本地和远程 DBMS 定义远程数据库别名所需的设置。如果数据库名称或独立服务器和集群实例的位置发生任何更改,这些步骤也很有用。此外,您还可以在此处找到有关最佳实践以及配置更改的额外指导信息。

设置示例

在此示例中,Alice 是一名管理员,Carol 是一名需要访问由 Bob 管理的数据库的用户

remote alias overview
图 1. 所需远程数据库别名设置概述

远程别名定义

  • 使用远程 DBMS B 的哪个用户。

  • 远程数据库的位置。

  • 如何使用驱动程序设置连接到远程数据库。

远程数据库别名仅对具有适当权限的用户可访问。在上面的示例中,Bob 是负责决定远程别名可以写入和/或读取哪些数据库(Db1Db2)的管理员。同时,Alice 是分配谁有权访问 Bob 设置的权限的管理员。在此示例中,Alice 会将该访问权限分配给 Carol

有关更多信息,请参阅DBMS 权限

Alice 将此权限分配给 Carol 的用户配置文件后,Carol 可以使用她自己的常规凭据访问 DBMS 中的远程数据库 Db1。此配置还将允许 Carol 访问 DBMS B 中的 Db2。如果管理员决定不应该如此,则 Bob 必须定义相应的权限(有关更多信息,请参阅认证与授权)。

配置远程 DBMS (Bob)

在建议的示例中,有两名管理员:AliceBobBob 是负责远程 DBMS 设置的管理员,其中包括以下步骤

  1. 创建要与 Alice 共享的用户配置文件。目前,仅支持基于用户和密码的认证(例如,原生认证)。

  2. 定义用户的权限。如果您不希望此用户访问 Db2,则在此处进行设置。

  3. 将凭据安全地传输给 Alice,建立与数据库 Db1 的链接。建议创建一个自定义角色来跟踪通过远程连接共享的所有用户,以便他们保持可跟踪性。

CREATE USER alice SET PASSWORD 'secretpassword'
CREATE ROLE remote
GRANT ACCESS ON DATABASE neo4j TO remote
GRANT MATCH {*} ON GRAPH neo4j TO remote
GRANT ROLE remote TO alice

在这种情况下,Bob 必须进行 SSL 框架的必要设置,并根据需要检查数据库是否接受非本地连接。

# accept non-local connections
server.default_listen_address=0.0.0.0

# configure ssl for bolt
dbms.ssl.policy.bolt.enabled=true
dbms.ssl.policy.bolt.base_directory=certificates/bolt
dbms.ssl.policy.bolt.private_key=private.key
dbms.ssl.policy.bolt.public_certificate=public.crt
dbms.ssl.policy.bolt.client_auth=NONE

# enforcing ssl connection
server.bolt.tls_level=REQUIRED

配置带有远程数据库别名的 DBMS (Alice)

作为 Alice,您需要生成一个加密密钥。在这种情况下,DBMS B 用户的凭据将被可逆加密并存储在 DBMS A 的系统数据库中。

由于使用的算法是 AES/GCM,因此需要提供一个 AES 加密密钥。它应具有 256 位的长度,并存储在受密码保护的 pkcs12 格式密钥库中。

该密钥可以通过在您的终端中使用以下 keytool 命令生成,该命令包含在 Java Platform, Standard Edition

keytool -genseckey -keyalg aes -keysize 256 -storetype pkcs12 -keystore [keystore-name] -alias [key-name] -storepass [keystore-password]

建议在运行 Neo4j 的相同 Java 版本上生成密钥库,因为支持的加密算法可能有所不同。有关 Neo4j 所需 Java 版本的详细信息,请参阅系统要求 → Java

以下配置对于创建远程数据库别名是必需的

配置 描述

dbms.security.keystore.path

密钥库文件的绝对路径,包括文件名。

dbms.security.keystore.password

密钥库文件的密码。使用命令展开设置密码。

dbms.security.key.name

密钥名称

为防止未经授权的访问,密钥库文件必须存储在受信任的位置。这是保护将存储在系统数据库中的加密密码的主要方式。除了管理员和 neo4j(密钥库文件必须对他们可读)之外,任何用户都不应访问它。

在集群中,Alice 需要在所有实例上共享相同的密钥库文件。

例如,在使用建议的 keytool 命令时,这些是配置的有效补充

dbms.security.keystore.path=/home/secure-folder/keystore-name.pkcs12
dbms.security.keystore.password=$(conf/password.sh)
dbms.security.key.name=key-name

其中 password.sh 可能如下所示

#!/bin/bash
echo "$KEYSTORE_PASSWORD_ENVIRONMENT_VARIABLE"

此外,不要忘记更改配置文件的权限,并使用命令展开标志启动 Neo4j

chmod 640 conf/neo4j.conf
bin/neo4j start --expand-commands

管理远程数据库别名

您可以使用别名命令来管理远程数据库别名。在这种情况下,强烈建议使用安全连接连接到远程数据库别名。

请注意,仅支持客户端 SSL。默认情况下,远程别名需要一个安全的 URI 方案,例如 neo4j+s。这可以通过将驱动程序设置 ssl_enforced 设置为 false 来禁用。

例如,可以使用以下命令创建远程数据库别名

CREATE ALIAS `remote-neo4j` FOR DATABASE `neo4j` AT "neo4j+s://location:7687" USER alice PASSWORD 'secretpassword'

为此,需要数据库管理别名管理权限。创建别名的权限可以像这样授予

GRANT CREATE ALIAS ON DBMS TO administrator

以下是授予使用远程数据库别名的ACCESS 权限的方法

GRANT ACCESS ON DATABASE `remote-neo4j` TO role

如果事务修改了别名(例如,更改了 DBMS B 上的目标数据库),则同时针对该别名执行的其他事务可能会被中止并回滚以确保安全。这可以防止诸如事务针对同一别名的多个目标数据库执行等问题。

更改加密密钥

如果密钥库中的加密密钥发生更改,则现有远程数据库别名的加密凭据需要更新,因为它们将不再可读。

如果在读取密钥库文件时出现故障,请检查 debug.log 以找出问题的来源参数。如果创建后无法连接到远程别名,请通过在 https://browser.neo4j.io/ 或您的本地浏览器连接到远程数据库来验证其设置。

连接到远程数据库别名

用户可以像连接到数据库一样连接到远程数据库别名。这包括

  • 直接连接到远程数据库别名。

  • Cypher USE 子句使用户能够查询他们未直接连接的远程数据库别名

USE `remote-neo4j` MATCH (n) RETURN *
  • 将远程数据库别名连接为默认数据库。这需要由管理员 A 设置。有关更多信息,请参阅用户管理

ALTER USER alice SET HOME DATABASE `remote-neo4j`

远程别名事务在 DBMS ASHOW TRANSACTIONS 中将不可见。但是,当使用同一用户连接时,可以在远程数据库上访问和终止它们。

© . All rights reserved.