server: add Datastore.Allocate privilege

Previously only Datastore.Modify was required for creating a new
datastore.

But, that endpoint allows one to pass an arbitrary path, of which all
parent directories will be created, this can allow any user with the
"Datastore Admin" role on "/datastores" to do some damage to the
system. Further, it is effectively a side channel for revealing the
systems directory structure through educated guessing and error
handling.

Add a new privilege "Datastore.Allocate" which, for now, is used
specifically for the create datastore API endpoint.

Add it only to the "Admin" role.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2020-10-06 12:08:54 +02:00 committed by Dietmar Maurer
parent fddc8aa410
commit 41bfd24919
2 changed files with 3 additions and 2 deletions

View File

@ -11,7 +11,7 @@ use crate::api2::types::*;
use crate::backup::*; use crate::backup::*;
use crate::config::cached_user_info::CachedUserInfo; use crate::config::cached_user_info::CachedUserInfo;
use crate::config::datastore::{self, DataStoreConfig, DIR_NAME_SCHEMA}; use crate::config::datastore::{self, DataStoreConfig, DIR_NAME_SCHEMA};
use crate::config::acl::{PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_MODIFY}; use crate::config::acl::{PRIV_DATASTORE_ALLOCATE, PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_MODIFY};
#[api( #[api(
input: { input: {
@ -106,7 +106,7 @@ pub fn list_datastores(
}, },
}, },
access: { access: {
permission: &Permission::Privilege(&["datastore"], PRIV_DATASTORE_MODIFY, false), permission: &Permission::Privilege(&["datastore"], PRIV_DATASTORE_ALLOCATE, false),
}, },
)] )]
/// Create new datastore config. /// Create new datastore config.

View File

@ -27,6 +27,7 @@ constnamedbitmap! {
PRIV_SYS_POWER_MANAGEMENT("Sys.PowerManagement"); PRIV_SYS_POWER_MANAGEMENT("Sys.PowerManagement");
PRIV_DATASTORE_AUDIT("Datastore.Audit"); PRIV_DATASTORE_AUDIT("Datastore.Audit");
PRIV_DATASTORE_ALLOCATE("Datastore.Allocate");
PRIV_DATASTORE_MODIFY("Datastore.Modify"); PRIV_DATASTORE_MODIFY("Datastore.Modify");
PRIV_DATASTORE_READ("Datastore.Read"); PRIV_DATASTORE_READ("Datastore.Read");