Hi,

what you do in bigger deployments with a few hundred fd. You want change a few 
hundred different password or do you have the same password on all fd?

When your proposed password rotation does not work on a client what would be 
your solution?Backup fail?

Also to make a dependancy of your Backup system to any 3rd part software is 
really a bad idea. In case of a disaster restore and your vault is gone what 
you will do?

Regards
Reiner

> On Mittwoch, Juni 25, 2025 at 9:06 PM, Clinton Bunch 
> <lists+bac...@clintonbunch.name (mailto:lists+bac...@clintonbunch.name)> 
> wrote:
>
> Hello Bacula Developers and Community,
>
>
> I'd like to initiate a discussion around enhancing how Bacula manages 
> sensitive information like passwords and potentially TLS key passphrases, 
> moving them out of the main configuration files. This aims to improve 
> security, simplify secret rotation, and make Bacula configurations more 
> friendly for version control and modern deployment practices (e.g., with 
> Ansible, Puppet, systemd). Importantly, these proposed enhancements would be 
> entirely optional, ensuring no breakage for existing configurations.
>
>
> Currently, passwords are often embedded directly in bacula-*.conf files. This 
> has several drawbacks:
>
>
> Exposes secrets if the main config files are inadvertently shared or checked 
> into version control without protection.
>
>
>
> Makes secret rotation more error-prone as it requires editing the main config.
>
>
>
> Complicates management with configuration automation tools that might handle 
> secrets separately.
>
>
>
>
> I propose a few layered approaches to address this, ranging from simpler to 
> more comprehensive:
>
>
>
>
>
> 1. The file: Directive
>
>
>
>
>
> Many users might want to separate files for secrets and pointing to them with 
> restrictive permissions, which is good practice. A Password = 
> "file:/path/to/secret" (file:/path/to/secret) directive that simply reads the 
> first line of a file (stripping any trailing newline) would be a foundational 
> improvement.
>
>
> Advantages:
>
>
> Allows separation of secrets from main configuration.
>
>
>
> Easier secret rotation (update file, reload Bacula).
>
>
>
> Configuration files become safer for version control (secret files are 
> gitignored/managed separately).
>
>
>
> Aligns well with configuration management tools (e.g., Ansible can deploy the 
> main config and then deploy the secret file with strict permissions and 
> content from a vault).
>
>
>
>
>
>
> 2. The dynfile: Directive (Dynamic/Deferred File Loading)
>
>
> Building on file:, the dynfile: prefix would address scenarios where the 
> secret file is provisioned at service startup and might not exist when a 
> configuration check (bacula-* -t) is run. This is particularly relevant for 
> integration with systemd-credentials.
>
>
> Syntax: Password = "dynfile:/path/to/runtime_secret_file"
>
>
>
> Key Behavior:
>
>
> During a configuration test (bacula-* -t), if a dynfile: path does not exist, 
> Bacula should issue a warning or informational message but not fail the 
> configuration check. The validity of the rest of the configuration can still 
> be assessed.
>
>
>
> At actual runtime, if the dynfile: path doesn't exist when the secret is 
> needed, it would be a fatal error.
>
>
>
>
>
> Advantages:
>
>
> All benefits of file:.
>
>
>
> Crucially enables seamless integration with tools like systemd-credentials 
> (e.g., LoadCredential=), which make secrets available only after the service 
> unit starts processing but before the main daemon fully initializes.
>
>
>
> Useful for any custom startup script that generates/places a temporary secret 
> file.
>
>
>
>
>
>
> 3. The syscred: Directive (Direct systemd-credentials Integration)
>
>
> For a more streamlined systemd integration, a dedicated prefix could simplify 
> configuration since the path used by systemd for $CREDENTIALS_DIRECTORY is 
> not guaranteed to remain the same between systems or systemd versions. While 
> there might be a natural reluctance to add code specific to one OS's init 
> system/credential manager, the prevalence of systemd on Linux platforms and 
> the relative ease of implementing this specific integration could offer a 
> significant "bang for the buck" for a large portion of the user base.
>
>
> Syntax: Password = "syscred:credential_name" (e.g., 
> syscred:bacula_db_password)
>
>
>
> Behavior:
>
>
> Bacula reads the $CREDENTIALS_DIRECTORY environment variable (set by systemd).
>
>
>
> It constructs the full path: $CREDENTIALS_DIRECTORY/credential_name.
>
>
>
> It attempts to read the secret from this path.
>
>
>
> It inherits the "don't fail early" logic from dynfile: for configuration 
> checks (if $CREDENTIALS_DIRECTORY isn't set or the path doesn't yet exist 
> during -t).
>
>
>
>
>
> Advantages:
>
>
> Simplifies configuration for users on systemd: they only need the credential 
> name, not the full runtime path.
>
>
>
> More robust as it adapts to the actual path provided by systemd via 
> $CREDENTIALS_DIRECTORY.
>
>
>
> Represents a relatively "simple win" for a large and growing portion of the 
> Linux user base, offering a clean, secure, and modern way to handle secrets.
>
>
>
> Implementation could leverage the underlying logic developed for dynfile:, 
> making it a comparatively straightforward addition.
>
>
>
>
>
>
> Applicability to TLS Keys/Passphrases:
>
>
>
> These file:, dynfile:, and syscred: mechanisms could also be extended to 
> directives like a new TLS Key Passphrase if Bacula were to support encrypted 
> TLS private keys (leveraging the linked OpenSSL library which can handle 
> decryption given a passphrase). This would be a significant security 
> hardening step for TLS keys. TLS Key = 
> "dynfile:/path/to/key_provided_by_systemd" is also an option if systemd 
> provides the decrypted key directly.
>
>
> 4. The credstore:name:secret_identifier Directive (External Credential Store 
> Helper)
>
>
> For maximum flexibility and integration with various secret managers (Vault, 
> AWS Secrets Manager, Azure Key Vault, etc.) and platforms:
>
>
> Syntax:
>
>
>
> >
> > In resource: Password = "credstore:myvault:database/production/db_password"
> >
> >
> >
> > New Stanza:
> >
> > Credstore { Name = "myvault" Exec = "/usr/local/bin/bacula-secret-helper 
> > --store vault --secret %s" # Or: Exec = "/usr/local/bin/fetch-from-aws 
> > --secret %s" Timeout = 5 # Optional timeout for the helper }
> >
> >
> >
> >
> >
> >
> >
>
>
>
>
>
>
> Behavior:
>
>
> Bacula forks and executes the specified Exec command, substituting %s (or 
> other placeholders) with the secret_identifier.
>
>
>
> The helper script/program is responsible for fetching the secret from the 
> external store and printing it to its standard output.
>
>
>
> Bacula reads the secret from the helper's stdout.
>
>
>
>
>
> Advantages:
>
>
> Extremely flexible: supports any secret manager via custom helper scripts.
>
>
>
> Platform-agnostic core mechanism (exec).
>
>
>
> Aligns with how many other enterprise tools manage externalized secrets.
>
>
>
>
>
> Considerations:
>
>
> Significantly more involved to implement in Bacula (process management, IPC, 
> timeout handling, error checking from helper, argument substitution).
>
>
>
> Potential performance implications if secrets are fetched very frequently 
> (though caching within Bacula could mitigate this).
>
>
>
> Careful design needed for config check mode (e.g., should helpers be 
> executed?).
>
>
>
>
>
>
>
>
>
> Discussion Points:
>
>
> Is there general interest in these types of enhancements, understanding they 
> would be optional additions?
>
>
>
>
>
>
>
> Would the proposed file: directive be a welcome foundational feature?
>
>
>
> Following that, would dynfile: (with its specific config-check behavior) be a 
> good next step?
>
>
>
> Given its potential ease of implementation and wide user base on systemd, is 
> syscred: a desirable simplification, despite being OS-specific?
>
>
>
> Is the more comprehensive credstore:exec: model something the community sees 
> a long-term need for, despite the implementation effort?
>
>
>
> Are there other approaches or considerations I might have missed?
>
>
>
>
> I believe even the simpler dynfile: and syscred: options would offer 
> substantial benefits to many Bacula users by improving security and 
> manageability without impacting existing setups. The credstore: approach 
> provides a path for even more advanced integrations.
>
>
> Looking forward to your thoughts and feedback.
>
>
> Thanks,
>
>
> Clinton Bunch
>
>
> _______________________________________________
> Bacula-devel mailing list
> Bacula-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/bacula-devel

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Bacula-devel mailing list
Bacula-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-devel

Reply via email to