警告

多节点支持已弃用.

TimescaleDB v2.13 是最后一个包含对 PostgreSQL 版本 13、14 和 15 的多节点支持的版本。

当您设置好实例后,您需要配置它们以接受从访问节点到数据节点的连接。您为此选择的身份验证机制可以与外部客户端连接到访问节点时使用的机制不同。

如何设置多节点集群取决于您选择的身份验证机制。选项包括:

  • 信任身份验证。这是最简单的方法,但也是最不安全的方法。如果您正在尝试多节点,这是一个很好的入门方法,但不建议用于生产集群。
  • 密码身份验证。每个用户角色都需要一个内部密码,用于在访问节点和数据节点之间建立连接。此方法比证书身份验证更容易设置,但仅提供基本级别的保护。
  • 证书身份验证。每个用户角色都需要来自证书颁发机构的证书,才能在访问节点和数据节点之间建立连接。此方法比密码身份验证更复杂,但更安全且更易于自动化。
重要

超越简单的信任方法来创建安全系统可能很复杂,但根据您的环境适当保护数据库非常重要。我们不推荐任何一种安全模型,但鼓励您进行风险评估并实施最适合您环境的安全模型。

信任所有传入连接是启动并运行多节点环境的最快方法,但这不是一种安全的操作方法。仅将其用于开发概念验证,请勿在生产安装中使用此方法。

警告

信任身份验证方法允许不安全地访问所有节点。请勿在生产环境中使用此方法。这不是一种安全的操作方法。

  1. 使用 psql 连接到访问节点,并找到 pg_hba.conf 文件

    SHOW hba_file;
  2. 在您喜欢的文本编辑器中打开 pg_hba.conf 文件,并添加此行。在本示例中,访问节点的 IP 地址为 192.0.2.20,掩码长度为 32。您可以添加以下两行之一

    # Using local loopback TCP/IP connections
    # TYPE DATABASE USER ADDRESS METHOD
    host all all 192.0.2.20/32 trust
    # The same as the previous line, but using a separate netmask column
    # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
    host all all 192.0.2.20 255.255.255.255 trust
  3. 在命令提示符下,重新加载服务器配置

    pg_ctl reload

    在某些操作系统上,您可能需要改用 pg_ctlcluster 命令。

  4. 如果您尚未这样做,请将数据节点添加到访问节点。有关说明,请参阅多节点设置部分。

  5. 在访问节点上,创建信任角色。在本示例中,我们将角色命名为 testrole

    CREATE ROLE testrole;

    可选:如果外部客户端需要以 testrole 身份连接到访问节点,请在创建角色时添加 LOGIN 选项。如果您想要求外部客户端输入密码,还可以添加 PASSWORD 选项。

  6. 允许信任角色访问数据节点的外服务器对象。请确保包含所有数据节点名称

    GRANT USAGE ON FOREIGN SERVER <data node name>, <data node name>, ... TO testrole;
  7. 在访问节点上,使用 distributed_exec 命令将角色添加到所有数据节点

    CALL distributed_exec($$ CREATE ROLE testrole LOGIN $$);
重要

确保在数据节点上创建具有 LOGIN 权限的角色,即使您不在访问节点上使用此权限也是如此。对于所有其他权限,请确保它们在访问节点和数据节点上相同。

密码身份验证要求每个用户角色在访问节点和数据节点之间建立连接之前都知道密码。此内部密码仅由访问节点使用,并且不需要与客户端用于连接到访问节点的密码相同。外部用户根本不需要共享内部密码,它可以由数据库管理员设置和管理。

访问节点存储内部密码,以便它可以验证数据节点是否提供了正确的密码。我们建议您将密码存储在访问节点上的本地密码文件中,本节将向您展示如何设置。但是,如果它在您的环境中效果更好,您可以使用 用户映射 来存储密码。这比本地密码文件稍微不安全,因为它需要为集群中的每个数据节点进行一次映射。

本节介绍如何使用 SCRAM SHA-256 密码身份验证设置密码身份验证。有关其他密码身份验证方法,请参阅 PostgreSQL 身份验证文档

在开始之前,请检查您是否可以使用 postgres 用户名登录到访问节点。

  1. 在访问节点上,打开 postgresql.conf 配置文件,并添加或编辑此行

    password_encryption = 'scram-sha-256' # md5 or scram-sha-256
  2. 对每个数据节点重复此操作。

  3. 在每个数据节点上,在 psql 提示符下,找到 pg_hba.conf 配置文件

    SHOW hba_file
  4. 在每个数据节点上,打开 pg_hba.conf 配置文件,并添加或编辑此行以启用对访问节点的加密身份验证

    # IPv4 local connections:
    # TYPE DATABASE USER ADDRESS METHOD
    host all all 192.0.2.20 scram-sha-256 #where '192.0.2.20' is the access node IP
  5. 在访问节点上,打开或创建位于 data/passfile 的密码文件。此文件存储访问节点连接到数据节点上的每个角色的密码。如果您需要更改密码文件的位置,请调整 postgresql.conf 配置文件中的 timescaledb.passfile 设置。

  6. 在访问节点上,打开 passfile 文件,并为每个用户添加类似这样的行,从 postgres 用户开始

    *:*:*:postgres:xyzzy #assuming 'xyzzy' is the password for the 'postgres' user
  7. 在访问节点上,在命令提示符下,更改 passfile 文件的权限

    chmod 0600 passfile
  8. 在访问节点以及每个数据节点上,重新加载服务器配置以应用更改

    pg_ctl reload
  9. 如果您尚未这样做,请将数据节点添加到访问节点。有关说明,请参阅多节点设置部分。

  10. 在访问节点上,在 psql 提示符下,创建其他角色,并授予他们访问数据节点的外服务器对象的权限

    CREATE ROLE testrole PASSWORD 'clientpass' LOGIN;
    GRANT USAGE ON FOREIGN SERVER <data node name>, <data node name>, ... TO testrole;

    clientpass 密码供外部客户端以用户 testrole 身份连接到访问节点时使用。如果访问节点配置为接受其他身份验证方法,或者该角色不是登录角色,则您可能不需要执行此步骤。

  11. 在访问节点上,使用 distributed_exec 将新角色添加到每个数据节点。请确保添加 PASSWORD 参数以指定在使用角色 testrole 连接到数据节点时使用的不同密码

    CALL distributed_exec($$ CREATE ROLE testrole PASSWORD 'internalpass' LOGIN $$);
  12. 在访问节点上,通过添加此行,将新角色添加到您之前创建的 passfile

    *:*:*:testrole:internalpass #assuming 'internalpass' is the password used to connect to data nodes
重要

在您设置密码身份验证之前创建的任何用户密码都需要重新创建,以便它们使用新的加密方法。

此方法比密码身份验证设置起来稍微复杂一些,但它更安全、更易于自动化,并且可以根据您的安全环境进行自定义。

要使用证书,访问节点和每个数据节点都需要三个文件

  • 根 CA 证书,名为 root.crt。此证书充当系统中信任的根源。它用于验证其他证书。
  • 节点证书,名为 server.crt。此证书为节点提供系统中受信任的身份。
  • 节点证书密钥,名为 server.key。这提供了节点证书的所有权证明。请确保将此文件保存在生成它的节点上。

您可以从商业证书颁发机构 (CA) 购买证书,也可以生成自己的自签名 CA。本节介绍如何使用您的访问节点证书为数据节点创建和签名新的用户证书。

密钥和证书在数据节点和访问节点上具有不同的用途。对于访问节点,签名证书用于验证用户证书以进行访问。对于数据节点,签名证书对访问节点进行节点身份验证。

  1. 在访问节点上,在命令提示符下,生成一个名为 auth.key 的私钥

    openssl genpkey -algorithm rsa -out auth.key
  2. 为证书颁发机构 (CA) 生成一个自签名根证书,名为 root.cert

    openssl req -new -key auth.key -days 3650 -out root.crt -x509
  3. 完成脚本提出的问题以创建您的根证书。键入您的回复,按 enter 接受括号中显示的默认值,或键入 . 将字段留空。例如

    Country Name (2 letter code) [AU]:US
    State or Province Name (full name) [Some-State]:New York
    Locality Name (eg, city) []:New York
    Organization Name (eg, company) [Internet Widgets Pty Ltd]:Example Company Pty Ltd
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:http://cert.example.com/
    Email Address []:

当您在访问节点上创建根证书后,您可以为每个数据节点生成证书和密钥。为此,您需要为每个数据节点创建一个证书签名请求 (CSR)。

密钥的默认名称为 server.key,证书的默认名称为 server.crt。它们一起存储在数据节点实例上的 data 目录中。

CSR 的默认名称为 server.csr,您需要使用在访问节点上创建的根证书对其进行签名。

  1. 在访问节点上,生成一个名为 server.csr 的证书签名请求 (CSR),并创建一个名为 server.key 的新密钥

    openssl req -out server.csr -new -newkey rsa:2048 -nodes \
    -keyout server.key
  2. 使用您之前创建的根证书 CA(名为 auth.key)对 CSR 进行签名

    openssl ca -extensions v3_intermediate_ca -days 3650 -notext \
    -md sha256 -in server.csr -out server.crt
  3. server.crtserver.key 文件从访问节点移动到每个数据节点的 data 目录中。根据您的网络设置,您可能需要使用便携式介质。

  4. 将根证书文件 root.crt 从访问节点复制到每个数据节点的 data 目录中。根据您的网络设置,您可能需要使用便携式介质。

当您创建了证书和密钥,并将所有文件移动到数据节点上的正确位置后,您可以配置数据节点以使用 SSL 身份验证。

  1. 在每个数据节点上,打开 postgresql.conf 配置文件,并添加或编辑 SSL 设置以启用证书身份验证

    ssl = on
    ssl_ca_file = 'root.crt'
    ssl_cert_file = 'server.crt'
    ssl_key_file = 'server.key'
  2. 如果您希望访问节点使用证书身份验证进行登录,请在访问节点上也进行这些更改。

  3. 在每个数据节点上,打开 pg_hba.conf 配置文件,并添加或编辑此行以允许任何 SSL 用户使用客户端证书身份验证登录

    # TYPE DATABASE USER ADDRESS METHOD OPTIONS
    hostssl all all all cert clientcert=1
注意

如果您使用证书和密钥的默认名称,则无需显式设置它们。默认情况下,配置会查找 server.crtserver.key。如果您使用不同的证书和密钥名称,请确保在 postgresql.conf 配置文件中指定正确的名称。

当您的数据节点配置为使用 SSL 证书身份验证时,您需要为访问节点创建签名证书和密钥。这允许访问节点登录到数据节点。

  1. 在访问节点上,以 postgres 用户身份,使用 md5sum 计算证书文件的基本名称,生成主题标识符,并为密钥和证书文件创建名称

    pguser=postgres
    base=`echo -n $pguser | md5sum | cut -c1-32`
    subj="/C=US/ST=New York/L=New York/O=Timescale/OU=Engineering/CN=$pguser"
    key_file="timescaledb/certs/$base.key"
    crt_file="timescaledb/certs/$base.crt"
  2. 生成新的随机用户密钥

    openssl genpkey -algorithm RSA -out "$key_file"
  3. 生成证书签名请求 (CSR)。此文件是临时的,存储在 data 目录中,稍后将被删除

    openssl req -new -sha256 -key $key_file -out "$base.csr" -subj "$subj"
  4. 使用访问节点密钥对 CSR 进行签名

    openssl ca -batch -keyfile server.key -extensions v3_intermediate_ca \
    -days 3650 -notext -md sha256 -in "$base.csr" -out "$crt_file"
    rm $base.csr
  5. 将节点证书附加到用户证书。这完成了证书验证链,并确保所有证书在数据节点上都可用,直至存储在 root.crt 中的受信任证书

    cat >>$crt_file <server.crt
注意

默认情况下,用户密钥文件和证书存储在访问节点上的 data 目录下的 timescaledb/certs 中。您可以使用 timescaledb.ssl_dir 配置变量更改此位置。

您的数据节点现在已设置为接受证书身份验证,数据节点和访问节点都具有密钥,并且 postgres 用户具有证书。如果您尚未这样做,请将数据节点添加到访问节点。有关说明,请参阅多节点设置部分。最后一步是添加其他用户角色。

  1. 在访问节点上,在 psql 提示符下,创建新用户并授予权限

    CREATE ROLE testrole;
    GRANT USAGE ON FOREIGN SERVER <data node name>, <data node name>, ... TO testrole;

    如果您需要外部客户端以 testrole 身份连接到访问节点,请确保您还添加了 LOGIN 选项。您还可以通过添加 PASSWORD 选项来启用密码身份验证。

  2. 在访问节点上,使用 distributed_exec 命令将角色添加到所有数据节点

    CALL distributed_exec($$ CREATE ROLE testrole LOGIN $$);

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页