知识库

如何在 Docker 容器内运行 Neo4j 时设置 SSL 通信

Neo4j 3.2 添加了统一的 SSL 框架,以为 Bolt、HTTPS 和集群内部加密设置安全连接。有关该框架的详细信息,请参阅:/docs/operations-manual/current/security/ssl-framework/

在 Docker 容器中运行 Neo4j 时设置安全的 Bolt 与 HTTPS 通信需要一些特定的步骤和配置设置。

以下步骤假设已按照上述文档链接中的流程操作。此外,公钥证书和私钥已经创建。

下面列出的步骤仅供示例。在部署前必须确保它们适用于您的环境。

Neo4j 3.5 和 Neo4j 4.x 的配置步骤不同,下面都列出。

Neo4j 4.x

1. 创建 Neo4j 范围目录结构

Neo4j 4.x 要求目录采用特定结构。以下是 httpsbolt 范围的示例。

ssl/
├── bolt
│   ├── revoked
│   └── trusted
└── https
    ├── revoked
    └── trusted

$HOME/neo4j 中创建上述目录结构。也可以使用任意您选择的目录,但请相应调整下面的路径。

2. 复制 SSL 证书并设置正确的权限

需要将公钥证书和私钥文件的副本放入每个范围的目录中。公钥还需复制到相应范围的 trusted 目录中。

复制完成后,$HOME/neo4j/ssl 中的目录和文件布局应如下所示。

$HOME/neo4j/ssl/
├── bolt
│   ├── private.key
│   ├── public.crt
│   ├── revoked
│   └── trusted
│       └── public.crt
└── https
    ├── private.key
    ├── public.crt
    ├── revoked
    └── trusted
        └── public.crt

容器将以用户 neo4j 运行 Neo4j。其 uid 与 gid 为 7474。使用以下命令调整 ssl 目录的权限。

sudo chgrp -R 7474 $HOME/neo4j/ssl && \
sudo chmod -R g+rx $HOME/neo4j/ssl

3. 配置 Neo4j

为在 Docker 容器中运行的 Neo4j 配置有两种方法:使用 Docker 主机卷外部化 neo4j.conf,或配置 Docker 环境变量。只能选择其中一种(不可同时使用)。

外部化 neo4j.conf

可以使用 Docker 主机卷挂载 neo4j.conf 文件。方法是将其挂载到容器的 /conf 目录中。

$HOME/neo4j 下创建 conf 目录和 neo4j.conf 文件。

mkdir $HOME/neo4j/conf && \
touch $HOME/neo4j/conf/neo4j.conf

neo4j.conf 中插入以下配置,确保将 host.domain.com 替换为服务器/应用所需的 DNS 名称。

dbms.default_advertised_address=host.domain.com

# Bolt SSL configuration
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
dbms.connector.bolt.tls_level=REQUIRED

# Https SSL configuration
dbms.connector.https.enabled=true
dbms.ssl.policy.https.enabled=true
dbms.ssl.policy.https.base_directory=certificates/https
dbms.ssl.policy.https.private_key=private.key
dbms.ssl.policy.https.public_certificate=public.crt
dbms.ssl.policy.https.client_auth=NONE

上述将在部署时通过 --volume=$HOME/neo4j/conf:/conf 挂载。

Docker 环境变量

以下 Docker 环境变量可替代上述 Docker 主机卷配置。部署时请指定这些变量,并将 host.domain.com 替换为服务器/应用所需的 DNS 名称。

--env NEO4J_dbms_default__advertised__address=host.domain.com \
--env NEO4J_dbms_ssl_policy_bolt_enabled=true \
--env NEO4J_dbms_ssl_policy_bolt_base__directory=certificates/bolt \
--env NEO4J_dbms_ssl_policy_bolt_private__key=private.key \
--env NEO4J_dbms_ssl_policy_bolt_public__certificate=public.crt \
--env NEO4J_dbms_ssl_policy_bolt_client__auth=NONE \
--env NEO4J_dbms_connector_bolt_tls__level=REQUIRED \
--env NEO4J_dbms_connector_https_enabled=true \
--env NEO4J_dbms_ssl_policy_https_enabled=true \
--env NEO4J_dbms_ssl_policy_https_base__directory=certificates/https \
--env NEO4J_dbms_ssl_policy_https_private__key=private.key \
--env NEO4J_dbms_ssl_policy_https_public__certificate=public.crt \
--env NEO4J_dbms_ssl_policy_https_client__auth=NONE \

4. 运行 Neo4j

使用 neo4j.conf 的主机卷,以下命令将部署 Neo4j 4.3.2。

docker run --name=neo4j-4.3.2 \
--publish=7474:7474 --publish=7687:7687 --publish=7473:7473 \
--volume=$HOME/neo4j/ssl:/ssl \
--volume=$HOME/neo4j/conf:/conf \
--env NEO4J_dbms_memory_pagecache_size=512m \
--env=NEO4J_ACCEPT_LICENSE_AGREEMENT=yes \
neo4j:4.3.2-enterprise

Neo4j 3.5

添加用于存放证书的 Docker Volume

Neo4j Docker 镜像提供了 /ssl 卷,可在主机上挂载目录用于存放证书。

--volume=$HOME/neo4j/ssl:/ssl

在上述示例中,本地文件夹 ($HOME/neo4j/ssl) 将用于存放证书和密钥。

在 Neo4j 中设置配置以使用上述 /ssl

Neo4j Docker 容器支持使用 /conf 卷,以便在 Neo4j.conf 文件中配置设置。

--volume=$HOME/neo4j/conf:/conf

使用上述设置,可修改 Neo4j.conf 中的配置,并将该文件放入 $HOME/neo4j/conf 目录。

或者,也可以使用环境变量来设置配置,详见此处。

要配置安全的 Bolt 与 HTTPS 通信,需要以下配置参数。

  • bolt.ssl_policy=client_policy

  • https.ssl_policy=client_policy

  • dbms.ssl.policy.client_policy.base_directory=/ssl/client_policy

  • dbms.ssl.policy.client_policy.client_auth=NONE

这里需要特别说明的是,base_directory 设置以 /ssl 开头——这将映射到挂载的卷,并在 $HOME/neo4j/ssl 文件夹中查找 client_policy 目录。

将证书/密钥复制到主机文件夹

有了上述设置,主机上需要以下文件夹结构和文件。

$HOME/neo4j/ssl/client_policy/
$HOME/neo4j/ssl/client_policy/private.key
$HOME/neo4j/ssl/client_policy/public.crt
$HOME/neo4j/ssl/client_policy/trusted/
$HOME/neo4j/ssl/client_policy/revoked/

如果密钥/证书文件的名称不同于默认名称,需要相应的设置如下。

dbms.ssl.policy.client_policy.private_key=/ssl/client_policy/neo4j_prod.key
dbms.ssl.policy.client_policy.public_certificate=/ssl/client_policy/neo4j_prod.crt

Docker 运行示例命令

以下是使用上述设置启动 Docker 容器的示例命令。

$ docker run --publish=7473:7473 --publish=7687:7687 --volume=$HOME/neo4j/ssl:/ssl  --volume=$HOME/neo4j/conf:/conf --env=NEO4J_ACCEPT_LICENSE_AGREEMENT=yes neo4j:3.4-enterprise
© . This site is unofficial and not affiliated with Neo4j, Inc.