[pve-devel] [PATCH container v7 1/1] check_ct_modify_config_perm: check 'admin' tags privileges

Dominik Csapak d.csapak at proxmox.com
Tue Jun 21 11:19:58 CEST 2022


normal tags require 'VM.Config.Options' on the CT, admin tags require
'Sys.Modify' on '/'

a user can set/delete/reorder tags, as long as no admin tags get
added/removed

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 src/PVE/LXC.pm        | 31 +++++++++++++++++++++++++++++++
 src/PVE/LXC/Config.pm |  3 ++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
index fe63087..ce2f8ff 100644
--- a/src/PVE/LXC.pm
+++ b/src/PVE/LXC.pm
@@ -1333,6 +1333,37 @@ sub check_ct_modify_config_perm {
 	} elsif ($opt eq 'hookscript') {
 	    # For now this is restricted to root at pam
 	    raise_perm_exc("changing the hookscript is only allowed for root\@pam");
+	} elsif ($opt eq 'tags') {
+	    my $old_tags = {};
+	    my $new_tags = {};
+	    my $check_admin = 0;
+	    my $check_user = 0;
+
+	    map { $old_tags->{$_} = 1 } PVE::Tools::split_list($oldconf->{$opt});
+	    map { $new_tags->{$_} = 1 } PVE::Tools::split_list($newconf->{$opt});
+
+	    my $check_tags = sub {
+		my ($a, $b) = @_;
+		foreach my $tag (keys %$a) {
+		    next if $b->{$tag};
+		    if (PVE::JSONSchema::is_admin_pve_tag($tag)) {
+			$check_admin = 1;
+		    } else {
+			$check_user = 1;
+		    }
+		}
+	    };
+
+	    $check_tags->($old_tags, $new_tags);
+	    $check_tags->($new_tags, $old_tags);
+
+	    if ($check_admin) {
+		$rpcenv->check($authuser, "/", ['Sys.Modify']);
+	    }
+
+	    if ($check_user) {
+		$rpcenv->check_vm_perm($authuser, $vmid, $pool, ['VM.Config.Options']);
+	    }
 	} else {
 	    $rpcenv->check_vm_perm($authuser, $vmid, $pool, ['VM.Config.Options']);
 	}
diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm
index b4b0261..2362d74 100644
--- a/src/PVE/LXC/Config.pm
+++ b/src/PVE/LXC/Config.pm
@@ -597,7 +597,8 @@ my $confdesc = {
     },
     tags => {
 	type => 'string', format => 'pve-tag-list',
-	description => 'Tags of the Container. This is only meta information.',
+	description => 'Tags of the Container. This is only meta information. Prefixing a tag with'.
+	    "'+' marks it as an admin tag and can only be set with 'Sys.Modify' on '/'.",
 	optional => 1,
     },
     debug => {
-- 
2.30.2






More information about the pve-devel mailing list