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
要使用扩展指令,必须指定 --configExpand 命令行选项以及所用扩展指令的完整列表:
mongod --config "/path/to/config/mongod.conf" --configExpand "rest,exec"
如果省略--configExpand 选项,或者未指定配置文件中使用的扩展指令的完整列表,则 mongod将返回错误并终止。只能在命令行上指定--configExpand 选项。
使用 __rest 扩展指令
__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扩展指令从外部REST端点加载配置文件。 扩展指令及其选项必须是配置文件中指定的唯一值。
__rest: "https://myrestserver.example.net/api/config/fullConfig" type: "yaml"
重要
指定的REST 端点返回的值不能包含任何其他扩展指令。 不对返回的数据执行额外处理;如果返回的数据包含额外的扩展指令,则mongod 将以错误代码终止。
使用 __exec 扩展指令
__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扩展指令从shell或终端命令的输出中加载配置文件。 __exec扩展指令及其选项必须是配置文件中指定的唯一值。
__exec: "python /home/myUserName/getFullConfig.py" type: "yaml"
重要
执行指定的__exec 字符串返回的数据不能包含任何其他扩展指令。 不对返回的数据执行额外处理;如果返回的数据包含额外的扩展指令,则mongod 将以错误代码终止。
扩展指令参考
__rest__rest扩展指令从REST端点加载配置文件值。__rest支持加载配置文件中的特定值或加载整个配置文件。然后,mongod开始使用外部来源的值作为其配置的一部分。__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采用以下字段:字段类型说明字符串
必需 针对其发出 请求以检索外部来源的值的URL
mongod。GET对于非本地主机
REST端点(如托管在远程服务器上的REST端点),__rest需要加密 (https://) URL,前提是主机和远程服务器都支持 TLS1.1 或更高版本。如果 URL 中指定的
REST终结点需要身份验证,则使用标准 RFC 3986 用户信息格式将凭证编码到 URL 中。对于本地主机
REST端点(例如在主机上监听的REST端点),__rest允许未加密的 (http://) URL。重要提示:指定的
REST端点返回的值不能包含任何其他扩展指令。 不对返回的数据执行额外处理;如果返回的数据包含额外的扩展指令,则mongod将以错误代码终止。type字符串
trim字符串
可选指定
whitespace可指示__rest修剪任何前导或尾随空格,特别是" "、"\r"、"\n"、"\t"、"\v"和"\f"出现时。默认为none,或不修剪。字符串
可选。扩展结果的 HMAC-SHA256
HMAC-SHA256(digest_key, message)输出,计算公式为 ,其中message是要检索的配置设置的值。如果指定,还必须指定 digest_key。
字符串
可选。64 32字节密钥的256 个字符的十六进制字符串表示形式,用于计算扩展结果的 HMAC-SHA 摘要。
如果指定,还必须指定摘要。
示例,假设
certificateKeyFilePassword是“superSecret123”。要使用 REST请求或 exec 服务调用检索此密码,您必须生成摘要密钥并使用它来计算密码的摘要。在终端中运行以下代码以生成 32 字节的摘要密钥:
openssl rand -hex 32 f38d0d5adfcf1a0575f9fa9051c70a2f88b1bb7562513c9efd7686e9c21ad304 生成摘要密钥后,可以使用它来计算密码的摘要:
echo -ne "superSecret123" | openssl dgst -sha256 -mac hmac -macopt hexkey:f38d0d5adfcf1a0575f9fa9051c70a2f88b1bb7562513c9efd7686e9c21ad304 8ca2f57caef0bb23b76e45b3fd1e899b7e306b8ba93f406a56d8969846ca9122 注意
要启用对
__rest扩展指令的解析,请使用 选项启动mongod--configExpand "rest"。
有关示例,请参阅使用
__rest扩展指令。
__exec__exec扩展指令从Shell或终端命令的输出中加载配置文件值。__exec支持加载配置文件中的特定值或加载整个配置文件。然后,mongod开始使用外部来源的值作为其配置的一部分。__exec扩展指令的语法如下:要为一项或多项特定的配置文件设置指定 shell 或终端命令,请执行以下操作:
<some configuration file setting>: __exec: "<string>" type: "string" trim: "none|whitespace" 为整个配置文件指定 shell 或终端命令:
__exec: "<string>" type: "yaml" trim: "none|whitespace" 如果通过终端或 shell 命令指定整个配置文件,扩展指令及其选项必须是配置文件中指定的唯一值。
__exec采用以下字段:字段类型说明__exec字符串
type字符串
trim字符串
可选指定
whitespace可指示__exec修剪任何前导或尾随空格,特别是" "、"\r"、"\n"、"\t"、"\v"和"\f"出现时。默认为none,或不修剪。字符串
可选。扩展结果的 HMAC-SHA256
HMAC-SHA256(digest_key, message)输出,计算公式为 ,其中message是要检索的配置设置的值。如果指定,则还必须指定 digest_key
字符串
可选。64 32字节密钥的256 个字符的十六进制字符串表示形式,用于计算扩展结果的 HMAC-SHA 摘要。
如果指定,则还必须指定 digest
示例,假设
certificateKeyFilePassword是“superSecret123”。要使用 REST请求或 exec 服务调用检索此密码,您必须生成摘要密钥并使用它来计算密码的摘要。在终端中运行以下代码以生成 32 字节的摘要密钥:
openssl rand -hex 32 f38d0d5adfcf1a0575f9fa9051c70a2f88b1bb7562513c9efd7686e9c21ad304 生成摘要密钥后,可以使用它来计算密码的摘要:
echo -ne "superSecret123" | openssl dgst -sha256 -mac hmac -macopt hexkey:f38d0d5adfcf1a0575f9fa9051c70a2f88b1bb7562513c9efd7686e9c21ad304 8ca2f57caef0bb23b76e45b3fd1e899b7e306b8ba93f406a56d8969846ca9122 注意
要启用对
__exec扩展指令的解析,请使用 选项启动mongod--configExpand "exec"。
有关示例,请参阅使用
__exec扩展指令。
输出具有已解析扩展指令值的配置文件
您可以通过使用mongod --outputConfigmongod--outputConfig选项启动stdout 来测试指定一个或多个扩展指令的配置文件的最终输出。使用 启动的 将解析的 YAMLmongod 配置文档输出到 并停止。如果配置文件中指定的任何扩展指令返回其他扩展指令,则 会引发错误并终止。
警告
--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.conf storage: dbPath: "/var/lib/mongo" systemLog: destination: file path: "/var/log/mongodb/mongod.log" net: port: 20128 outputConfig: true