配置远程数据库别名

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

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

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

设置示例

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

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

远程别名定义

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

  • 远程数据库位于何处。

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

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

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

Carol 可以使用她自己的常规凭据在 Alice 将此权限分配到她的用户配置文件后,访问 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 平台标准版

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 命令时,这些将是 config 的有效添加

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'

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

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 设置。有关 l用户管理 的更多信息。

ALTER USER alice SET HOME DATABASE `remote-neo4j`

远程别名事务不会在 **DBMS A** 上的 SHOW TRANSACTIONS 中显示。但是,当使用相同的用户连接时,可以访问并终止它们在远程数据库上的操作。