* [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable
@ 2025-04-02 12:30 Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 2/7] pbs-client: add helper for getting UTF-8 secrets Maximiliano Sandoval
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Maximiliano Sandoval @ 2025-04-02 12:30 UTC (permalink / raw)
To: pbs-devel
Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
Differences from v2:
- Renamed 'System Credentials' section to 'System and Service Credentials':
System credentials are a special kind of credential, a new paragraph was added
to explain how to use system credentials.
- Improve documentation wording.
Differences from v1:
- Use the helper on get_encryption_password
- Send "add helper" commit to the past
pbs-client/src/tools/mod.rs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/pbs-client/src/tools/mod.rs b/pbs-client/src/tools/mod.rs
index 3b19df390..a42fa1149 100644
--- a/pbs-client/src/tools/mod.rs
+++ b/pbs-client/src/tools/mod.rs
@@ -29,6 +29,7 @@ pub mod key_source;
const ENV_VAR_PBS_FINGERPRINT: &str = "PBS_FINGERPRINT";
const ENV_VAR_PBS_PASSWORD: &str = "PBS_PASSWORD";
const ENV_VAR_PBS_ENCRYPTION_PASSWORD: &str = "PBS_ENCRYPTION_PASSWORD";
+const ENV_VAR_PBS_REPOSITORY: &str = "PBS_REPOSITORY";
/// Directory with system [credential]s. See systemd-creds(1).
///
@@ -195,7 +196,7 @@ pub fn get_encryption_password() -> Result<Option<Vec<u8>>, Error> {
}
pub fn get_default_repository() -> Option<String> {
- std::env::var("PBS_REPOSITORY").ok()
+ std::env::var(ENV_VAR_PBS_REPOSITORY).ok()
}
pub fn remove_repository_from_value(param: &mut Value) -> Result<BackupRepository, Error> {
--
2.39.5
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pbs-devel] [PATCH backup v3 2/7] pbs-client: add helper for getting UTF-8 secrets
2025-04-02 12:30 [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Maximiliano Sandoval
@ 2025-04-02 12:30 ` Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 3/7] pbs-client: use helper for getting UTF-8 password Maximiliano Sandoval
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Maximiliano Sandoval @ 2025-04-02 12:30 UTC (permalink / raw)
To: pbs-devel
We are going to add more credentials so it makes sense to have a common
helper to get the secrets.
Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
pbs-client/src/tools/mod.rs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/pbs-client/src/tools/mod.rs b/pbs-client/src/tools/mod.rs
index a42fa1149..efd2e139d 100644
--- a/pbs-client/src/tools/mod.rs
+++ b/pbs-client/src/tools/mod.rs
@@ -153,6 +153,25 @@ fn get_secret_from_env(base_name: &str) -> Result<Option<String>, Error> {
Ok(None)
}
+/// Gets a secret or value from the environment.
+///
+/// Checks for an environment variable named `env_variable`, and if missing, it
+/// checks for a system [credential] named `credential_name`. Assumes the secret
+/// is UTF-8 encoded.
+///
+/// [credential]: https://systemd.io/CREDENTIALS/
+fn get_secret_impl(env_variable: &str, credential_name: &str) -> Result<Option<String>, Error> {
+ if let Some(password) = get_secret_from_env(env_variable)? {
+ Ok(Some(password))
+ } else if let Some(password) = get_credential(credential_name)? {
+ String::from_utf8(password)
+ .map(Option::Some)
+ .map_err(|_err| format_err!("credential {credential_name} is not utf8 encoded"))
+ } else {
+ Ok(None)
+ }
+}
+
/// Gets the backup server's password.
///
/// Looks for a password in the `PBS_PASSWORD` environment variable, if there
--
2.39.5
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pbs-devel] [PATCH backup v3 3/7] pbs-client: use helper for getting UTF-8 password
2025-04-02 12:30 [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 2/7] pbs-client: add helper for getting UTF-8 secrets Maximiliano Sandoval
@ 2025-04-02 12:30 ` Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 4/7] pbs-client: make get_encryption_password return a String Maximiliano Sandoval
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Maximiliano Sandoval @ 2025-04-02 12:30 UTC (permalink / raw)
To: pbs-devel
Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
pbs-client/src/tools/mod.rs | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/pbs-client/src/tools/mod.rs b/pbs-client/src/tools/mod.rs
index efd2e139d..81e29ffe9 100644
--- a/pbs-client/src/tools/mod.rs
+++ b/pbs-client/src/tools/mod.rs
@@ -182,15 +182,7 @@ fn get_secret_impl(env_variable: &str, credential_name: &str) -> Result<Option<S
///
/// [credential]: https://systemd.io/CREDENTIALS/
pub fn get_password() -> Result<Option<String>, Error> {
- if let Some(password) = get_secret_from_env(ENV_VAR_PBS_PASSWORD)? {
- Ok(Some(password))
- } else if let Some(password) = get_credential(CRED_PBS_PASSWORD)? {
- String::from_utf8(password)
- .map(Option::Some)
- .map_err(|_err| format_err!("non-utf8 password credential"))
- } else {
- Ok(None)
- }
+ get_secret_impl(ENV_VAR_PBS_PASSWORD, CRED_PBS_PASSWORD)
}
/// Gets an encryption password.
--
2.39.5
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pbs-devel] [PATCH backup v3 4/7] pbs-client: make get_encryption_password return a String
2025-04-02 12:30 [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 2/7] pbs-client: add helper for getting UTF-8 secrets Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 3/7] pbs-client: use helper for getting UTF-8 password Maximiliano Sandoval
@ 2025-04-02 12:30 ` Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 5/7] pbs-client: allow reading default repository from system credential Maximiliano Sandoval
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Maximiliano Sandoval @ 2025-04-02 12:30 UTC (permalink / raw)
To: pbs-devel
As per the note in the documentation [1], passwords are valid UTF-8.
This allows us to se the shared helper.
[1] https://pbs.proxmox.com/docs/backup-client.html#environment-variables
Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
pbs-client/src/tools/key_source.rs | 2 +-
pbs-client/src/tools/mod.rs | 13 +++++--------
2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/pbs-client/src/tools/key_source.rs b/pbs-client/src/tools/key_source.rs
index 94b86e8b6..9d5110e2b 100644
--- a/pbs-client/src/tools/key_source.rs
+++ b/pbs-client/src/tools/key_source.rs
@@ -346,7 +346,7 @@ pub fn get_encryption_key_password() -> Result<Vec<u8>, Error> {
// fixme: implement other input methods
if let Some(password) = super::get_encryption_password()? {
- return Ok(password);
+ return Ok(password.into_bytes());
}
// If we're on a TTY, query the user for a password
diff --git a/pbs-client/src/tools/mod.rs b/pbs-client/src/tools/mod.rs
index 81e29ffe9..c5c0b34ca 100644
--- a/pbs-client/src/tools/mod.rs
+++ b/pbs-client/src/tools/mod.rs
@@ -196,14 +196,11 @@ pub fn get_password() -> Result<Option<String>, Error> {
/// present.
///
/// [credential]: https://systemd.io/CREDENTIALS/
-pub fn get_encryption_password() -> Result<Option<Vec<u8>>, Error> {
- if let Some(password) = get_secret_from_env(ENV_VAR_PBS_ENCRYPTION_PASSWORD)? {
- Ok(Some(password.into_bytes()))
- } else if let Some(password) = get_credential(CRED_PBS_ENCRYPTION_PASSWORD)? {
- Ok(Some(password))
- } else {
- Ok(None)
- }
+pub fn get_encryption_password() -> Result<Option<String>, Error> {
+ get_secret_impl(
+ ENV_VAR_PBS_ENCRYPTION_PASSWORD,
+ CRED_PBS_ENCRYPTION_PASSWORD,
+ )
}
pub fn get_default_repository() -> Option<String> {
--
2.39.5
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pbs-devel] [PATCH backup v3 5/7] pbs-client: allow reading default repository from system credential
2025-04-02 12:30 [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Maximiliano Sandoval
` (2 preceding siblings ...)
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 4/7] pbs-client: make get_encryption_password return a String Maximiliano Sandoval
@ 2025-04-02 12:30 ` Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 6/7] pbs-client: allow reading fingerprint " Maximiliano Sandoval
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Maximiliano Sandoval @ 2025-04-02 12:30 UTC (permalink / raw)
To: pbs-devel
Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
pbs-client/src/tools/mod.rs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/pbs-client/src/tools/mod.rs b/pbs-client/src/tools/mod.rs
index c5c0b34ca..fd08dc68e 100644
--- a/pbs-client/src/tools/mod.rs
+++ b/pbs-client/src/tools/mod.rs
@@ -39,6 +39,8 @@ const ENV_VAR_CREDENTIALS_DIRECTORY: &str = "CREDENTIALS_DIRECTORY";
const CRED_PBS_ENCRYPTION_PASSWORD: &str = "proxmox-backup-client.encryption-password";
/// Credential name of the the password.
const CRED_PBS_PASSWORD: &str = "proxmox-backup-client.password";
+/// Credential name of the the repository.
+const CRED_PBS_REPOSITORY: &str = "proxmox-backup-client.repository";
pub const REPO_URL_SCHEMA: Schema = StringSchema::new("Repository URL.")
.format(&BACKUP_REPO_URL)
@@ -204,7 +206,11 @@ pub fn get_encryption_password() -> Result<Option<String>, Error> {
}
pub fn get_default_repository() -> Option<String> {
- std::env::var(ENV_VAR_PBS_REPOSITORY).ok()
+ get_secret_impl(ENV_VAR_PBS_REPOSITORY, CRED_PBS_REPOSITORY)
+ .inspect_err(|err| {
+ proxmox_log::error!("could not read default repository: {err:#}");
+ })
+ .unwrap_or_default()
}
pub fn remove_repository_from_value(param: &mut Value) -> Result<BackupRepository, Error> {
--
2.39.5
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pbs-devel] [PATCH backup v3 6/7] pbs-client: allow reading fingerprint from system credential
2025-04-02 12:30 [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Maximiliano Sandoval
` (3 preceding siblings ...)
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 5/7] pbs-client: allow reading default repository from system credential Maximiliano Sandoval
@ 2025-04-02 12:30 ` Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 7/7] docs: client: add section about system credentials Maximiliano Sandoval
2025-04-03 16:07 ` [pbs-devel] applied-series: [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Thomas Lamprecht
6 siblings, 0 replies; 8+ messages in thread
From: Maximiliano Sandoval @ 2025-04-02 12:30 UTC (permalink / raw)
To: pbs-devel
Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
pbs-client/src/tools/mod.rs | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/pbs-client/src/tools/mod.rs b/pbs-client/src/tools/mod.rs
index fd08dc68e..f4b655e81 100644
--- a/pbs-client/src/tools/mod.rs
+++ b/pbs-client/src/tools/mod.rs
@@ -41,6 +41,8 @@ const CRED_PBS_ENCRYPTION_PASSWORD: &str = "proxmox-backup-client.encryption-pas
const CRED_PBS_PASSWORD: &str = "proxmox-backup-client.password";
/// Credential name of the the repository.
const CRED_PBS_REPOSITORY: &str = "proxmox-backup-client.repository";
+/// Credential name of the the fingerprint.
+const CRED_PBS_FINGERPRINT: &str = "proxmox-backup-client.fingerprint";
pub const REPO_URL_SCHEMA: Schema = StringSchema::new("Repository URL.")
.format(&BACKUP_REPO_URL)
@@ -213,6 +215,24 @@ pub fn get_default_repository() -> Option<String> {
.unwrap_or_default()
}
+/// Gets the repository fingerprint.
+///
+/// Looks for the fingerprint in the `PBS_FINGERPRINT` environment variable, if
+/// there isn't one it reads the `proxmox-backup-client.fingerprint`
+/// [credential].
+///
+/// Returns `None` if neither the environment variable or the credential are
+/// present.
+///
+/// [credential]: https://systemd.io/CREDENTIALS/
+pub fn get_fingerprint() -> Option<String> {
+ get_secret_impl(ENV_VAR_PBS_FINGERPRINT, CRED_PBS_FINGERPRINT)
+ .inspect_err(|err| {
+ proxmox_log::error!("could not read fingerprint: {err:#}");
+ })
+ .unwrap_or_default()
+}
+
pub fn remove_repository_from_value(param: &mut Value) -> Result<BackupRepository, Error> {
if let Some(url) = param
.as_object_mut()
@@ -270,7 +290,7 @@ fn connect_do(
auth_id: &Authid,
rate_limit: RateLimitConfig,
) -> Result<HttpClient, Error> {
- let fingerprint = std::env::var(ENV_VAR_PBS_FINGERPRINT).ok();
+ let fingerprint = get_fingerprint();
let password = get_password()?;
let options = HttpClientOptions::new_interactive(password, fingerprint).rate_limit(rate_limit);
@@ -280,7 +300,7 @@ fn connect_do(
/// like get, but simply ignore errors and return Null instead
pub async fn try_get(repo: &BackupRepository, url: &str) -> Value {
- let fingerprint = std::env::var(ENV_VAR_PBS_FINGERPRINT).ok();
+ let fingerprint = get_fingerprint();
let password = get_password().unwrap_or(None);
// ticket cache, but no questions asked
--
2.39.5
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pbs-devel] [PATCH backup v3 7/7] docs: client: add section about system credentials
2025-04-02 12:30 [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Maximiliano Sandoval
` (4 preceding siblings ...)
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 6/7] pbs-client: allow reading fingerprint " Maximiliano Sandoval
@ 2025-04-02 12:30 ` Maximiliano Sandoval
2025-04-03 16:07 ` [pbs-devel] applied-series: [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Thomas Lamprecht
6 siblings, 0 replies; 8+ messages in thread
From: Maximiliano Sandoval @ 2025-04-02 12:30 UTC (permalink / raw)
To: pbs-devel
Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
docs/backup-client.rst | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/docs/backup-client.rst b/docs/backup-client.rst
index e11c0142a..bc80525be 100644
--- a/docs/backup-client.rst
+++ b/docs/backup-client.rst
@@ -44,6 +44,9 @@ user\@pbs!token@host:store ``user@pbs!token`` host:8007 store
[ff80::51]:1234:mydatastore ``root@pam`` [ff80::51]:1234 mydatastore
================================ ================== ================== ===========
+
+.. _environment-variables:
+
Environment Variables
---------------------
@@ -89,6 +92,43 @@ Environment Variables
you can add arbitrary comments after the first newline.
+System and Service Credentials
+------------------------------
+
+Some of the :ref:`environment variables <environment-variables>` above can be
+set using `system and service credentials <https://systemd.io/CREDENTIALS/>`_
+instead.
+
+============================ ==============================================
+Environment Variable Credential Name Equivalent
+============================ ==============================================
+``PBS_REPOSITORY`` ``proxmox-backup-client.repository``
+``PBS_PASSWORD`` ``proxmox-backup-client.password``
+``PBS_ENCRYPTION_PASSWORD`` ``proxmox-backup-client.encryption-password``
+``PBS_FINGERPRINT`` ``proxmox-backup-client.fingerprint``
+============================ ==============================================
+
+For example, the repository password can be stored in an encrypted file as
+follows:
+
+.. code-block:: console
+
+ # systemd-ask-password -n | systemd-creds encrypt --name=proxmox-backup-client.password - my-api-token.cred
+
+The credential can then be reused inside of unit files or in a transient scope
+unit as follows:
+
+.. code-block:: console
+
+ # systemd-run --pipe --wait \
+ --property=LoadCredentialEncrypted=proxmox-backup-client.password:/full/path/to/my-api-token.cred \
+ --property=SetCredential=proxmox-backup-client.repository:'my_default_repository' \
+ proxmox-backup-client ...
+
+Additionally, system credentials (e.g. passed down from the hypervisor to a
+virtual machine via SMBIOS type 11) can be loaded on a service via
+`LoadCredential=` as described in the manual page ``systemd.exec(5)``.
+
Output Format
-------------
--
2.39.5
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* [pbs-devel] applied-series: [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable
2025-04-02 12:30 [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Maximiliano Sandoval
` (5 preceding siblings ...)
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 7/7] docs: client: add section about system credentials Maximiliano Sandoval
@ 2025-04-03 16:07 ` Thomas Lamprecht
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Lamprecht @ 2025-04-03 16:07 UTC (permalink / raw)
To: Proxmox Backup Server development discussion, Maximiliano Sandoval
Am 02.04.25 um 14:30 schrieb Maximiliano Sandoval:
> Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
> ---
>
> Differences from v2:
> - Renamed 'System Credentials' section to 'System and Service Credentials':
> System credentials are a special kind of credential, a new paragraph was added
> to explain how to use system credentials.
> - Improve documentation wording.
>
> Differences from v1:
> - Use the helper on get_encryption_password
> - Send "add helper" commit to the past
>
> pbs-client/src/tools/mod.rs | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
>
applied series, thanks!
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-04-03 16:07 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-02 12:30 [pbs-devel] [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 2/7] pbs-client: add helper for getting UTF-8 secrets Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 3/7] pbs-client: use helper for getting UTF-8 password Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 4/7] pbs-client: make get_encryption_password return a String Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 5/7] pbs-client: allow reading default repository from system credential Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 6/7] pbs-client: allow reading fingerprint " Maximiliano Sandoval
2025-04-02 12:30 ` [pbs-devel] [PATCH backup v3 7/7] docs: client: add section about system credentials Maximiliano Sandoval
2025-04-03 16:07 ` [pbs-devel] applied-series: [PATCH backup v3 1/7] pbs-client: use a const for the PBS_REPOSITORY env variable Thomas Lamprecht
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal