Externally Sourced Configuration File Values
On this page
- Use the
__restExpansion Directive - Use the
__execExpansion Directive - Expansion Directives Reference
- Output the Configuration File with Resolved Expansion Directive Values
New in version 4.2.
MongoDB supports using expansion directives in configuration files to load externally sourced values. Expansion directives can load values for specific configuration file options or load the entire configuration file. Expansion directives help obscure confidential information like security certificates and passwords.
copycopied
storage:dbPath: "/var/lib/mongo"systemLog:destination: filepath: "/var/log/mongodb/mongod.log"net:bindIp:__exec: "python /home/user/getIPAddresses.py"type: "string"trim: "whitespace"digest: 85fed8997aac3f558e779625f2e51b4d142dff11184308dc6aca06cff26ee9addigest_key: 68656c6c30303030307365637265746d796f6c64667269656e64tls:mode: requireTLScertificateKeyFile: "/etc/tls/mongod.pem"certificateKeyFilePassword:__rest: "https://myrestserver.example.net/api/config/myCertKeyFilePassword"type: "string"digest: b08519162ba332985ac18204851949611ef73835ec99067b85723e10113f5c26digest_key: 6d795365637265744b65795374756666
- If the configuration file includes the
__restexpansion, on Linux/macOS, the read access to the configuration file must be limited to the user running themongod/mongosprocess only. - If the configuration file includes the
__execexpansion, on Linux/macOS, the write access to the configuration file must be limited to the user running themongod/mongosprocess only.
To use expansion directives, you must specify the --configExpand command-line option with the complete list of expansion directives used:
copycopied
mongod --config "/path/to/config/mongod.conf" --configExpand "rest,exec"
If you omit the --configExpand option or if you do not specify the complete list of expansion directives used in the configuration file, the mongod/mongos returns an error and terminates. You can only specify the --configExpand option on the command line.
Use the __rest Expansion Directive
The __rest expansion directive loads configuration file values from a REST endpoint. __rest supports loading specific values in the configuration file or loading the entire configuration file.
- Specific Value
- Full Configuration File
The following configuration file uses the __rest expansion directive to load the setting net.tls.certificateKeyFilePassword value from an external REST endpoint:
copycopied
storage:dbPath: "/var/lib/mongo"systemLog:destination: filepath: "/var/log/mongodb/mongod.log"net:bindIp: 192.51.100.24,127.0.0.1tls:mode: requireTLScertificateKeyFile: "/etc/tls/mongod.pem"certificateKeyFilePassword:__rest: "https://myrestserver.example.net/api/config/myCertKeyFilePassword"type: "string"
File Permission
If the configuration file includes the
__restexpansion, on Linux/macOS, the read access to the configuration file must be limited to the user running themongod/mongosprocess only.Expansion Parsing
To parse the
__restblocks, start themongod/mongoswith the--configExpand "rest"option.Themongod/mongosissues aGETrequest against specified URL. If successful, themongod/mongosreplaces the value ofcertificateKeyFilePasswordwith the returned value. If the URL fails to resolve or if theRESTendpoint returns an invalid value, themongod/mongosthrows an error and terminates.
IMPORTANT
The value returned by the specified REST endpoint cannot include any additional expansion directives. The mongod/mongos does not perform additional processing on the returned data and will terminate with an error code if the returned data includes additional expansion directives.
Use the __exec Expansion Directive
The __exec expansion directive loads configuration file values from a shell or terminal command. __exec supports loading specific values in the configuration file or loading the entire configuration file.
- Specific Value
- Full Configuration File
The following example configuration file uses the __exec expansion directive to to load the setting net.tls.certificateKeyFilePassword value from the output of a shell or terminal command:
copycopied
storage:dbPath: "/var/lib/mongo"systemLog:destination: filepath: "/var/log/mongodb/mongod.log"net:bindIp: 192.51.100.24,127.0.0.1TLS:mode: requireTLScertificateKeyFile: "/etc/tls/mongod.pem"certificateKeyFilePassword:__exec: "python /home/myUserName/getPEMPassword.py"type: "string"
File Permission
If the configuration file includes the
__execexpansion, on Linux/macOS, the write access to the configuration file must be limited to the user running themongod/mongosprocess only.Expansion Parsing
To parse the
__execblocks, start themongod/mongoswith the--configExpand "exec"option.Themongod/mongosattempts to execute the specified operation. If the command executes successfully, themongod/mongosreplaces the value ofcertificateKeyFilePasswordwith the returned value. If the command fails or returns an invalid value for the configuration file setting, themongod/mongosthrows an error and terminates.
IMPORTANT
The data returned by executing the specified __exec string cannot include any additional expansion directives. The mongod/mongos does not perform additional processing on the returned data and will terminate with an error code if the returned data includes additional expansion directives.
Expansion Directives Reference
__restThe
__restexpansion directive loads configuration file values from aRESTendpoint.__restsupports loading specific values in the configuration file or loading the entire configuration file. Themongod/mongosthen starts using the externally sourced values as part of its configuration.The__restexpansion directive has the following syntax:To specify aRESTendpoint for a specific configuration file setting or settings:copycopied<some configuration file setting>: __rest: "<string>" type: "string" trim: "none|whitespace" digest: "<string>" digest_key: "<string>"To specify aRESTendpoint for the entire configuration file:copycopied__rest: "<string>" type: "yaml" trim: "none|whitespace"If specifying the entire configuration file viaRESTendpoint, the expansion directive and its options must be the only values specified in the configuration file.__resttakes the following fields:FieldTypeDescription__reststringRequired The URL against which themongod/mongosissues aGETrequest to retrieve the externally sourced value.For non-localhostRESTendpoints (e.g. aRESTendpoint hosted on a remote server),__restrequires encrypted (https://) URLs where both the host machine and the remote server support TLS 1.1 or later.If theRESTendpoint specified in the URL requires authentication, encode credentials into the URL with the standard RFC 3986 User Information format.For localhostRESTendpoints (e.g. aRESTendpoint listening on the host machine),__restallows unencrypted (http://) URLs.IMPORTANTThe value returned by the specifiedRESTendpoint cannot include any additional expansion directives. Themongod/mongosdoes not perform additional processing on the returned data and will terminate with an error code if the returned data includes additional expansion directives.typestringOptional Controls how__restparses the returned value from the specified URL.Possible values are:string(Default)Directs__restto parse the returned data as a literal string. If specifyingstring, the entire__restblock and supporting options must be nested under the field for which you are loading externally sourced values.yamlDirects__restto parse the returned data as ayamlformatted file. If specifyingyaml, the__restblock must be the only content in the configuration file. Themongod/mongosreplaces the configuration file contents with theyamlretrieved from the REST resource.trimstringOptional Specifywhitespaceto direct__restto trim any leading or trailing whitespace, specifically occurrences of" ","\r","\n","\t","\v", and"\f". Defaults tonone, or no trimming.digeststringOptional. The SHA-256 digest of the expansion result.If specified, you must also specify the digest_key.digest_keystringOptional. The hexadecimal string representation of the secret used to calculate the SHA-256 digest.If specified, you must also specify the digest.NOTEIf the configuration file includes the__restexpansion, on Linux/macOS, the read access to the configuration file must be limited to the user running themongod/mongosprocess only.To enable parsing of the__restexpansion directive, start themongod/mongoswith the--configExpand "rest"option.For examples, see Use the __rest Expansion Directive.__execThe
__execexpansion directive loads configuration file values from the output of a shell or terminal command.__execsupports loading specific values in the configuration file or loading the entire configuration file. Themongod/mongosthen starts using the externally sourced values as part of its configuration.The__execexpansion directive has the following syntax:To specify a shell or terminal command for a specific configuration file setting or settings:copycopied<some configuration file setting>: __exec: "<string>" type: "string" trim: "none|whitespace"To specify a a shell or terminal command for the entire configuration file:copycopied__exec: "<string>" type: "yaml" trim: "none|whitespace"If specifying the entire configuration file via a terminal or shell command, the expansion directive and its options must be the only values specified in the configuration file.__exectakes the following fields:FieldTypeDescription__execstringRequired The string which themongod/mongosexecutes on the terminal or shell to retrieve the externally sourced value.On Linux and OSX hosts, execution is handled via POSIXpopen(). On Windows hosts, execution is handled via the process control API.__execopens a read-only pipe as the same user that started themongodormongos.IMPORTANTThe data returned by executing the specified command cannot include any additional expansion directives. Themongod/mongosdoes not perform additional processing on the returned data and will terminate with an error code if the returned data includes additional expansion directives.typestringOptional Controls how__execparses the value returned by the executed command.Possible values are:string(Default )Directs__execto parse the returned data as a literal string. If specifyingstring, the entire__execblock and supporting options must be nested under the field for which you are loading externally sourced values.yamlDirects__execto parse the returned data as ayamlformatted file. If specifyingyaml, the__execblock must be the only content in the configuration file. Themongod/mongosreplaces the configuration file contents with theyamlretrieved from the executed command.trimstringOptional Specifywhitespaceto direct__execto trim any leading or trailing whitespace, specifically occurrences of" ","\r","\n","\t","\v", and"\f". Defaults tonone, or no trimming.digeststringOptional. The SHA-256 digest of the expansion result.If specified, you must also specify the digest_keydigest_keystringOptional. The hexadecimal string representation of the secret used to calculate the SHA-256 digest.If specified, you must also specify the digestNOTEIf the configuration file includes the__execexpansion, on Linux/macOS, the write access to the configuration file must be limited to the user running themongod/mongosprocess only.To enable parsing of the__execexpansion directives, start themongod/mongoswith the--configExpand "exec"option.For examples, see Use the __exec Expansion Directive.
Output the Configuration File with Resolved Expansion Directive Values
You can test the final output of a configuration file that specifies one or more expansion directives by starting the mongod/mongos with the --outputConfig option. A mongod/mongos started with --outputConfig outputs the resolved YAML configuration document to stdout and halts. If any expansion directive specified in the configuration file returns additional expansion directives, the mongod/mongos throws an error and terminates.
WARNING
The --outputConfig option returns the resolved values for any field using an expansion directive. This includes any private or sensitive information previously obscured by using an external source for the configuration option.
For example, the following configuration file mongod.conf contains a __rest expansion directive:
copycopied
storage:dbPath: "/var/lib/mongo"systemLog:destination: filepath: "/var/log/mongodb/mongod.log"net:port:__rest: "https://mongoconf.example.net:8080/record/1"type: string
The string recorded at the specified URL is 20128
If the configuration file includes the __rest expansion, on Linux/macOS, the read access to the configuration file must be limited to the user running the mongod/mongos process only.
Start the mongod with the --configExpand "rest" and --outputConfig options:
copycopied
mongod -f mongod.conf --configExpand rest --outputConfig
The mongod outputs the following to stdout before terminating:
copycopied
config: mongod.confstorage:dbPath: "/var/lib/mongo"systemLog:destination: filepath: "/var/log/mongodb/mongod.log"net:port: 20128outputConfig: true
