对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

自管理MongoDB的外部配置值

MongoDB 支持在配置文件中使用扩展指令来加载外部来源的值。扩展指令可以加载特定配置文件选项的值,也可以加载整个配置文件。扩展指令有助于掩盖安全证书和密码等机密信息。

storage: dbPath: "/var/lib/mongo"systemLog: destination: file path: "/var/log/mongodb/mongod.log"net: bindIp: __exec: "python /home/user/getIPAddresses.py" type: "string" trim: "whitespace" digest: 85fed8997aac3f558e779625f2e51b4d142dff11184308dc6aca06cff26ee9ad digest_key: 68656c6c30303030307365637265746d796f6c64667269656e64 tls: mode: requireTLS certificateKeyFile: "/etc/tls/mongod.pem" certificateKeyFilePassword: __rest: "https://myrestserver.example.net/api/config/myCertKeyFilePassword" type: "string" digest: b08519162ba332985ac18204851949611ef73835ec99067b85723e10113f5c26 digest_key: 6d795365637265744b65795374756666
  • 如果配置文件包含 __rest 扩展,则在 Linux/macOS 上,对配置文件的读取访问权限必须仅限于运行 mongod / mongos 进程的用户。

  • 如果配置文件包含 __exec 扩展,则在 Linux/macOS 上,对配置文件的写入访问权限必须仅限于运行 mongod / mongos 进程的用户。

要使用扩展指令,必须指定 --configExpand 命令行选项以及所用扩展指令的完整列表:

mongod --config "/path/to/config/mongod.conf" --configExpand "rest,exec"

如果省略 --configExpand 选项或未在配置文件中指定扩展指令的完整列表,则 mongod/mongos 将返回错误并终止执行。您只能在命令行上指定 --configExpand 选项。

__rest 扩展指令从 REST 端点加载配置文件值。__rest 支持加载配置文件中的特定值或加载整个配置文件。

以下配置文件使用__rest扩展指令从外部REST端点加载设置net.tls.certificateKeyFilePassword值:

storage: dbPath: "/var/lib/mongo"systemLog: destination: file path: "/var/log/mongodb/mongod.log"net: bindIp: 192.51.100.24,127.0.0.1 tls: mode: requireTLS certificateKeyFile: "/etc/tls/mongod.pem" certificateKeyFilePassword: __rest: "https://myrestserver.example.net/api/config/myCertKeyFilePassword" type: "string"
文件权限

如果配置文件包含 __rest 扩展,则在 Linux/macOS 上,对配置文件的读取访问权限必须仅限于运行 mongod / mongos 进程的用户。

扩展解析

要解析 __rest 块,请使用 --configExpand "rest" 选项开始 mongod/mongos。

mongod / mongos针对指定URL发出GET请求。 如果成功, mongod / mongos会将certificateKeyFilePassword的值替换为返回的值。 如果URL解析失败或REST端点返回无效值,则mongod / mongos会引发错误并终止。

重要

指定的 REST 端点返回的值不能包含任何其他扩展指令。mongod/mongos 不会对返回的数据进行额外处理,如果返回的数据包含额外的扩展指令,则将以错误代码终止执行。

__exec扩展指令从 Shell 或终端命令中加载配置文件值。__exec 支持加载配置文件中的特定值或加载整个配置文件。

下面的配置文件示例使用 __exec 扩展指令从 shell 或终端命令的输出中加载设置 net.tls.certificateKeyFilePassword 值:

storage: dbPath: "/var/lib/mongo"systemLog: destination: file path: "/var/log/mongodb/mongod.log"net: bindIp: 192.51.100.24,127.0.0.1 tls: mode: requireTLS certificateKeyFile: "/etc/tls/mongod.pem" certificateKeyFilePassword: __exec: "python /home/myUserName/getPEMPassword.py" type: "string"
文件权限

如果配置文件包含 __exec 扩展,则在 Linux/macOS 上,对配置文件的写入访问权限必须仅限于运行 mongod / mongos 进程的用户。

扩展解析

要解析 __exec 块,请使用 --configExpand "exec" 选项开始 mongod/mongos。

mongod/mongos 尝试执行指定的操作。如果命令成功执行,mongod/mongos 会用返回值替换 certificateKeyFilePassword 的值。如果命令失败或返回配置文件设置的无效值,则mongod/mongos 将引发错误并终止。

重要

通过执行指定的 __exec 字符串返回的数据不能包含任何其他扩展指令。mongod/mongos 不会对返回的数据进行额外处理,如果返回的数据包含额外的扩展指令,则将以错误代码终止执行。

__rest

__rest 扩展指令从 REST 端点加载配置文件值。__rest 支持加载配置文件中的特定值或加载整个配置文件。然后 mongod/mongos 开始使用外部来源的值作为其配置的一部分。

__rest扩展指令的语法如下:

  • 要为一项或多项特定的配置文件设置指定 REST 端点,请执行以下操作:

    <some configuration file setting>: __rest: "<string>" type: "string" trim: "none|whitespace" digest: "<string>" digest_key: "<string>"
  • 要为整个配置文件指定 REST 端点,请执行以下操作:

    __rest: "<string>"type: "yaml"trim: "none|whitespace"

    如果通过 REST 终端指定整个配置文件,扩展指令及其选项必须是配置文件中指定的唯一值。

__rest 采用以下字段:

字段
类型
说明

字符串

必需 mongod / mongos 用来发出 GET 请求以获取外部来源值所依据的 URL。

对于非本地主机 REST 端点(如托管在远程服务器上的 REST 端点),__rest 需要加密 (https://) URL,前提是主机和远程服务器都支持 TLS1.1 或更高版本。

如果 URL 中指定的 REST 终结点需要身份验证,则使用标准 RFC 3986 用户信息格式将凭证编码到 URL 中。

对于本地主机 REST 端点(例如在主机上监听的 REST 端点),__rest 允许未加密的 (http://) URL。

重要提示:指定的 REST端点返回的值不能包含任何其他扩展指令。mongod/mongos 不对返回的数据执行额外处理;如果返回的数据包含额外的扩展指令,则 / 将以错误代码终止。

type

字符串

可选控制 __rest 如何解析指定 URL 的返回值。

可能的值为:

  • string (默认值)

    指示 __rest 将返回的数据解析为字面字符串。如果指定 string,则整个 __rest 块和支持选项必须嵌套在您要加载外部来源值的字段下。

  • yaml

    指示 __rest 将返回的数据解析为 yaml 格式的文件。如果指定 yaml,则 __rest 块必须是配置文件中的唯一内容。mongod/mongos 将配置文件内容替换为从 REST 资源检索到的 yaml。

trim

字符串

可选指定 whitespace 可指示 __rest 修剪任何前导或尾随空格,特别是 " "、"\r"、"\n"、"\t"、"\v" 和 "\f" 出现时。默认为 none,或不修剪。

字符串

可选.扩展结果的 HMAC-SHA256 输出,计算为 HMAC-SHA256(digest_key, message),其中 message 是要检索的配置设置的值。

如果指定,还必须指定 digest_key。

字符串

可选.用于计算扩展结果的 HMAC-SHA256 摘要的 32-字节密钥的 64-字符十六进制字符串表示形式。

如果指定,还必须指定摘要。

例如,假设 certificateKeyFilePassword 是 "superSecret123"。要使用 REST 请求或 exec 服务调用来检索此密码,必须生成摘要密钥,并使用它来计算密码的摘要。

在终端中运行以下代码以生成 32 字节摘要密钥:

openssl rand -hex 32

生成摘要密钥后,您可以使用它来计算密码的摘要:

echo -ne "superSecret123" | openssl dgst -sha256 -mac hmac -macopt hexkey:f38d0d5adfcf1a0575f9fa9051c70a2f88b1bb7562513c9efd7686e9c21ad304

注意

  • 如果配置文件包含 __rest 扩展,则在 Linux/macOS 上,对配置文件的读取访问权限必须仅限于运行 mongod / mongos 进程的用户。

  • 要启用对__rest 扩展指令的解析,请使用 --configExpand "rest" 选项启动 mongod/mongos。

有关示例,请参阅使用 __rest 扩展指令。

__exec

__exec 扩展指令从 shell 或终端命令的输出中加载配置文件值。__exec 支持加载配置文件中的特定值或加载整个配置文件。然后,mongod/mongos 开始使用外部来源的值作为其配置的一部分。

__exec扩展指令的语法如下:

  • 要为一项或多项特定的配置文件设置指定 shell 或终端命令,请执行以下操作:

    <some configuration file setting>: __exec: "<string>" type: "string" trim: "none|whitespace"
  • 为整个配置文件指定 shell 或终端命令:

    __exec: "<string>"type: "yaml"trim: "none|whitespace"

    如果通过终端或 shell 命令指定整个配置文件,扩展指令及其选项必须是配置文件中指定的唯一值。

__exec 采用以下字段:

字段
类型
说明

__exec

字符串

必需 mongod/mongos 在终端或 Shell 上执行的字符串,以检索外部来源的值。

在 Linux 和 OSX 主机上,执行通过 POSIX popen() 处理的。在 Windows 主机上,执行是通过进程控制 API 处理的。__exec 以启动 mongod 或mongos 的同一用户身份打开只读管道。

重要提示:执行指定命令返回的数据不能包含任何附加扩展指令。mongod/mongos 不会对返回的数据执行额外处理;如果返回的数据包含额外的扩展指令,则 / 将以错误代码终止。

type

字符串

(可选)控制 __exec 如何解析已执行命令返回的值。

可能的值为:

  • string (默认值)

    指示 __exec 将返回的数据解析为字面字符串。如果指定 string,则整个 __exec 块和支持选项必须嵌套在您要加载外部来源值的字段下。

  • yaml

    指示 __exec 将返回的数据解析为 yaml 格式的文件。如果指定 yaml,则 __exec 块必须是配置文件中的唯一内容。mongod/mongos 将配置文件内容替换为从执行的命令中检索到的yaml。

trim

字符串

可选指定 whitespace 可指示 __exec 修剪任何前导或尾随空格,特别是 " "、"\r"、"\n"、"\t"、"\v" 和 "\f" 出现时。默认为 none,或不修剪。

字符串

可选.扩展结果的 HMAC-SHA256 输出,计算为 HMAC-SHA256(digest_key, message),其中 message 是要检索的配置设置的值。

如果指定,则还必须指定 digest_key

字符串

可选.用于计算扩展结果的 HMAC-SHA256 摘要的 32-字节密钥的 64-字符十六进制字符串表示形式。

如果指定,则还必须指定 digest

例如,假设 certificateKeyFilePassword 是 "superSecret123"。要使用 REST 请求或 exec 服务调用来检索此密码,必须生成摘要密钥,并使用它来计算密码的摘要。

在终端中运行以下代码以生成 32 字节摘要密钥:

openssl rand -hex 32

生成摘要密钥后,您可以使用它来计算密码的摘要:

echo -ne "superSecret123" | openssl dgst -sha256 -mac hmac -macopt hexkey:f38d0d5adfcf1a0575f9fa9051c70a2f88b1bb7562513c9efd7686e9c21ad304

注意

  • 如果配置文件包含 __exec 扩展,则在 Linux/macOS 上,对配置文件的写入访问权限必须仅限于运行 mongod / mongos 进程的用户。

  • 要启用对 __exec 扩展指令的解析,请使用 --configExpand "exec" 选项启动 mongod/mongos。

有关示例,请参阅使用 __exec 扩展指令。

您可以通过使用 --outputConfig 选项启动 mongod/mongos 来测试指定了一个或多个扩展指令的配置文件的最终输出。以 --outputConfig 启动的 mongod/mongos 会将已解析的 YAML 配置文档输出到 stdout 并停止。如果配置文件中指定的任何扩展指令返回额外的扩展指令,则 mongod/mongos 将引发错误并终止执行。

警告

--outputConfig 选项使用扩展指令返回任何字段的解析值。这包括所有之前因配置选项的外部来源而隐藏的私有或敏感信息。

例如,以下配置文件 mongod.conf 包含一个 __rest 扩展指令:

storage: dbPath: "/var/lib/mongo"systemLog: destination: file path: "/var/log/mongodb/mongod.log"net: port: __rest: "https://mongoconf.example.net:8080/record/1" type: string

在指定 URL 记录的字符串是 20128

如果配置文件包含 __rest 扩展,则在 Linux/macOS 上,对配置文件的读取访问权限必须仅限于运行 mongod / mongos 进程的用户。

使用 --configExpand "rest" 和 --outputConfig 选项启动 mongod:

mongod -f mongod.conf --configExpand rest --outputConfig

mongod 在终止之前会向 stdout 输出以下内容:

config: mongod.confstorage: dbPath: "/var/lib/mongo"systemLog: destination: file path: "/var/log/mongodb/mongod.log"net: port: 20128outputConfig: true