all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH manager 0/3] rework node console permission checks
@ 2023-06-14 10:42 Fabian Grünbichler
  2023-06-14 10:42 ` [pve-devel] [PATCH manager 1/3] node console: restrict all non-login commands to root@pam Fabian Grünbichler
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Fabian Grünbichler @ 2023-06-14 10:42 UTC (permalink / raw)
  To: pve-devel

the last patch is RFC since we likely want to add another change to improve the
UX, but there are several options which are all a bit meh.

Fabian Grünbichler (3):
  node console: restrict all non-login commands to root@pam
  node console: allow usage for non-pam realms
  node console: lift root@pam restriction for commands

 PVE/API2/Nodes.pm           | 26 ++++----------------------
 www/manager6/Utils.js       |  5 +++--
 www/manager6/node/Config.js |  2 +-
 3 files changed, 8 insertions(+), 25 deletions(-)

-- 
2.39.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH manager 1/3] node console: restrict all non-login commands to root@pam
  2023-06-14 10:42 [pve-devel] [PATCH manager 0/3] rework node console permission checks Fabian Grünbichler
@ 2023-06-14 10:42 ` Fabian Grünbichler
  2023-11-06 14:38   ` [pve-devel] applied: " Thomas Lamprecht
  2023-06-14 10:42 ` [pve-devel] [PATCH manager 2/3] node console: allow usage for non-pam realms Fabian Grünbichler
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Fabian Grünbichler @ 2023-06-14 10:42 UTC (permalink / raw)
  To: pve-devel

and not just upgrade.

note that the only other non-login command (ceph_install) is restricted to
root@pam in the web UI anyway, and that the termproxy endpoint is lacking this
check and thus always falls back to a login prompt for non-login commands
requested by non-root users.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
---
 PVE/API2/Nodes.pm | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 9269694d6..81c7f3788 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -949,7 +949,7 @@ __PACKAGE__->register_method ({
 	    node => get_standard_option('pve-node'),
 	    cmd => {
 		type => 'string',
-		description => "Run specific command or default to login.",
+		description => "Run specific command or default to login (requires 'root\@pam')",
 		enum => [keys %$shell_cmd_map],
 		optional => 1,
 		default => 'login',
@@ -1000,7 +1000,7 @@ __PACKAGE__->register_method ({
 
 	raise_perm_exc("realm != pam") if $realm ne 'pam';
 
-	if (defined($param->{cmd}) && $param->{cmd} eq 'upgrade' && $user ne 'root@pam') {
+	if (defined($param->{cmd}) && $param->{cmd} ne 'login' && $user ne 'root@pam') {
 	    raise_perm_exc('user != root@pam');
 	}
 
@@ -1089,7 +1089,7 @@ __PACKAGE__->register_method ({
 	    node => get_standard_option('pve-node'),
 	    cmd => {
 		type => 'string',
-		description => "Run specific command or default to login.",
+		description => "Run specific command or default to login (requires 'root\@pam')",
 		enum => [keys %$shell_cmd_map],
 		optional => 1,
 		default => 'login',
@@ -1223,7 +1223,7 @@ __PACKAGE__->register_method ({
 	    proxy => get_standard_option('spice-proxy', { optional => 1 }),
 	    cmd => {
 		type => 'string',
-		description => "Run specific command or default to login.",
+		description => "Run specific command or default to login (requires 'root\@pam')",
 		enum => [keys %$shell_cmd_map],
 		optional => 1,
 		default => 'login',
@@ -1248,7 +1248,7 @@ __PACKAGE__->register_method ({
 
 	raise_perm_exc("realm != pam") if $realm ne 'pam';
 
-	if (defined($param->{cmd}) && $param->{cmd} eq 'upgrade' && $user ne 'root@pam') {
+	if (defined($param->{cmd}) && $param->{cmd} ne 'login' && $user ne 'root@pam') {
 	    raise_perm_exc('user != root@pam');
 	}
 
-- 
2.39.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH manager 2/3] node console: allow usage for non-pam realms
  2023-06-14 10:42 [pve-devel] [PATCH manager 0/3] rework node console permission checks Fabian Grünbichler
  2023-06-14 10:42 ` [pve-devel] [PATCH manager 1/3] node console: restrict all non-login commands to root@pam Fabian Grünbichler
@ 2023-06-14 10:42 ` Fabian Grünbichler
  2023-11-06 14:38   ` [pve-devel] applied: " Thomas Lamprecht
  2023-06-14 10:42 ` [pve-devel] [RFC manager 3/3] node console: lift root@pam restriction for commands Fabian Grünbichler
  2023-11-06  7:36 ` [pve-devel] [PATCH manager 0/3] rework node console permission checks Fabian Grünbichler
  3 siblings, 1 reply; 8+ messages in thread
From: Fabian Grünbichler @ 2023-06-14 10:42 UTC (permalink / raw)
  To: pve-devel

non-login commands are still restricted to root@pam if they where before.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
---
 PVE/API2/Nodes.pm | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 81c7f3788..649735115 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -939,7 +939,6 @@ __PACKAGE__->register_method ({
     method => 'POST',
     protected => 1,
     permissions => {
-	description => "Restricted to users on realm 'pam'",
 	check => ['perm', '/nodes/{node}', [ 'Sys.Console' ]],
     },
     description => "Creates a VNC Shell proxy.",
@@ -998,7 +997,6 @@ __PACKAGE__->register_method ({
 	my $rpcenv = PVE::RPCEnvironment::get();
 	my ($user, undef, $realm) = PVE::AccessControl::verify_username($rpcenv->get_user());
 
-	raise_perm_exc("realm != pam") if $realm ne 'pam';
 
 	if (defined($param->{cmd}) && $param->{cmd} ne 'login' && $user ne 'root@pam') {
 	    raise_perm_exc('user != root@pam');
@@ -1079,7 +1077,6 @@ __PACKAGE__->register_method ({
     method => 'POST',
     protected => 1,
     permissions => {
-	description => "Restricted to users on realm 'pam'",
 	check => ['perm', '/nodes/{node}', [ 'Sys.Console' ]],
     },
     description => "Creates a VNC Shell proxy.",
@@ -1117,7 +1114,6 @@ __PACKAGE__->register_method ({
 
 	my $rpcenv = PVE::RPCEnvironment::get();
 	my ($user, undef, $realm) = PVE::AccessControl::verify_username($rpcenv->get_user());
-	raise_perm_exc("realm $realm != pam") if $realm ne 'pam';
 
 	my $node = $param->{node};
 	my $authpath = "/nodes/$node";
@@ -1160,7 +1156,7 @@ __PACKAGE__->register_method({
     path => 'vncwebsocket',
     method => 'GET',
     permissions => {
-	description => "Restricted to users on realm 'pam'. You also need to pass a valid ticket (vncticket).",
+	description => "You also need to pass a valid ticket (vncticket).",
 	check => ['perm', '/nodes/{node}', [ 'Sys.Console' ]],
     },
     description => "Opens a websocket for VNC traffic.",
@@ -1194,8 +1190,6 @@ __PACKAGE__->register_method({
 
 	my ($user, undef, $realm) = PVE::AccessControl::verify_username($rpcenv->get_user());
 
-	raise_perm_exc("realm != pam") if $realm ne 'pam';
-
 	my $authpath = "/nodes/$param->{node}";
 
 	PVE::AccessControl::verify_vnc_ticket($param->{vncticket}, $user, $authpath);
@@ -1212,7 +1206,6 @@ __PACKAGE__->register_method ({
     protected => 1,
     proxyto => 'node',
     permissions => {
-	description => "Restricted to users on realm 'pam'",
 	check => ['perm', '/nodes/{node}', [ 'Sys.Console' ]],
     },
     description => "Creates a SPICE shell.",
@@ -1246,7 +1239,6 @@ __PACKAGE__->register_method ({
 
 	my ($user, undef, $realm) = PVE::AccessControl::verify_username($authuser);
 
-	raise_perm_exc("realm != pam") if $realm ne 'pam';
 
 	if (defined($param->{cmd}) && $param->{cmd} ne 'login' && $user ne 'root@pam') {
 	    raise_perm_exc('user != root@pam');
-- 
2.39.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [RFC manager 3/3] node console: lift root@pam restriction for commands
  2023-06-14 10:42 [pve-devel] [PATCH manager 0/3] rework node console permission checks Fabian Grünbichler
  2023-06-14 10:42 ` [pve-devel] [PATCH manager 1/3] node console: restrict all non-login commands to root@pam Fabian Grünbichler
  2023-06-14 10:42 ` [pve-devel] [PATCH manager 2/3] node console: allow usage for non-pam realms Fabian Grünbichler
@ 2023-06-14 10:42 ` Fabian Grünbichler
  2023-11-06 14:46   ` Thomas Lamprecht
  2023-11-06  7:36 ` [pve-devel] [PATCH manager 0/3] rework node console permission checks Fabian Grünbichler
  3 siblings, 1 reply; 8+ messages in thread
From: Fabian Grünbichler @ 2023-06-14 10:42 UTC (permalink / raw)
  To: pve-devel

instead, fallback to a plain login shell if the current user is not already
root. both current custom commands are effectively a root shell, so it's not
possible to allow them for regular users.

note that the non-login commands via xtermjs already had the fallback behaviour
(i.e., no check for $param->{cmd}) previous to this commit, it was just not
exposed via our web UI, since the corresponding button/wizard was only enabled
for root@pam.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
---

Notes:
    RFC because for a nice UX we probably want to somehow display or inject the
    command that should be executed once the user is (effectively) root in the
    console, instead of just opening a login prompt without any indication what the
    user should do with it..
    
    some possible options/suggestions offered so far:
    - let the API return the command in case of fallback, let the UI display it
    -- probably would work best if upgrade is converted to an inline xtermjs
       console, since that supports copy+paste
    - pass FAKE_SHELL to login, point it at a shell wrapper that echos a note with
      the command and then executes the real shell
    - pass FAKE_SHELL to login, point it at a wrapper that runs the command (or the
      command with sudo, in case the logged in console user is not root) with the
      user's real shell
    - wrap/reimplement the login binary to support passing a command to the
      shell (meh)
    
    the first one has the smallest chance of weird side-effects, but it also is
    less convenient (especially compared to the last two)

 PVE/API2/Nodes.pm           | 16 +++-------------
 www/manager6/Utils.js       |  5 +++--
 www/manager6/node/Config.js |  2 +-
 3 files changed, 7 insertions(+), 16 deletions(-)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 649735115..2595a0e52 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -948,7 +948,7 @@ __PACKAGE__->register_method ({
 	    node => get_standard_option('pve-node'),
 	    cmd => {
 		type => 'string',
-		description => "Run specific command or default to login (requires 'root\@pam')",
+		description => "Run specific command or default to login (only honored for 'root\@pam')",
 		enum => [keys %$shell_cmd_map],
 		optional => 1,
 		default => 'login',
@@ -997,11 +997,6 @@ __PACKAGE__->register_method ({
 	my $rpcenv = PVE::RPCEnvironment::get();
 	my ($user, undef, $realm) = PVE::AccessControl::verify_username($rpcenv->get_user());
 
-
-	if (defined($param->{cmd}) && $param->{cmd} ne 'login' && $user ne 'root@pam') {
-	    raise_perm_exc('user != root@pam');
-	}
-
 	my $node = $param->{node};
 
 	my $authpath = "/nodes/$node";
@@ -1086,7 +1081,7 @@ __PACKAGE__->register_method ({
 	    node => get_standard_option('pve-node'),
 	    cmd => {
 		type => 'string',
-		description => "Run specific command or default to login (requires 'root\@pam')",
+		description => "Run specific command or default to login (only honored for 'root\@pam')",
 		enum => [keys %$shell_cmd_map],
 		optional => 1,
 		default => 'login',
@@ -1216,7 +1211,7 @@ __PACKAGE__->register_method ({
 	    proxy => get_standard_option('spice-proxy', { optional => 1 }),
 	    cmd => {
 		type => 'string',
-		description => "Run specific command or default to login (requires 'root\@pam')",
+		description => "Run specific command or default to login (only honored for 'root\@pam')",
 		enum => [keys %$shell_cmd_map],
 		optional => 1,
 		default => 'login',
@@ -1239,11 +1234,6 @@ __PACKAGE__->register_method ({
 
 	my ($user, undef, $realm) = PVE::AccessControl::verify_username($authuser);
 
-
-	if (defined($param->{cmd}) && $param->{cmd} ne 'login' && $user ne 'root@pam') {
-	    raise_perm_exc('user != root@pam');
-	}
-
 	my $node = $param->{node};
 	my $proxy = $param->{proxy};
 
diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js
index a150e848f..c95873701 100644
--- a/www/manager6/Utils.js
+++ b/www/manager6/Utils.js
@@ -1701,7 +1701,8 @@ Ext.define('PVE.Utils', {
 
     showCephInstallOrMask: function(container, msg, nodename, callback) {
 	if (msg.match(/not (installed|initialized)/i)) {
-	    if (Proxmox.UserName === 'root@pam') {
+	    var caps = Ext.state.Manager.get('GuiCap');
+	    if (caps.nodes['Sys.Console'] && caps.dc['Sys.Modify']) {
 		container.el.mask();
 		if (!container.down('pveCephInstallWindow')) {
 		    var isInstalled = !!msg.match(/not initialized/i);
@@ -1718,7 +1719,7 @@ Ext.define('PVE.Utils', {
 		}
 	    } else {
 		container.mask(Ext.String.format(gettext('{0} not installed.') +
-		    ' ' + gettext('Log in as root to install.'), 'Ceph'), ['pve-static-mask']);
+		    ' ' + gettext('Requires "Sys.Console" and "Sys.Modify" to install.'), 'Ceph'), ['pve-static-mask']);
 	    }
 	    return true;
 	} else {
diff --git a/www/manager6/node/Config.js b/www/manager6/node/Config.js
index 6ed2172aa..a4d10ce0d 100644
--- a/www/manager6/node/Config.js
+++ b/www/manager6/node/Config.js
@@ -248,7 +248,7 @@ Ext.define('PVE.node.Config', {
 		    itemId: 'apt',
 		    upgradeBtn: {
 			xtype: 'pveConsoleButton',
-			disabled: Proxmox.UserName !== 'root@pam',
+			disabled: !caps.nodes['Sys.Console'],
 			text: gettext('Upgrade'),
 			consoleType: 'upgrade',
 			nodename: nodename,
-- 
2.39.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [pve-devel] [PATCH manager 0/3] rework node console permission checks
  2023-06-14 10:42 [pve-devel] [PATCH manager 0/3] rework node console permission checks Fabian Grünbichler
                   ` (2 preceding siblings ...)
  2023-06-14 10:42 ` [pve-devel] [RFC manager 3/3] node console: lift root@pam restriction for commands Fabian Grünbichler
@ 2023-11-06  7:36 ` Fabian Grünbichler
  3 siblings, 0 replies; 8+ messages in thread
From: Fabian Grünbichler @ 2023-11-06  7:36 UTC (permalink / raw)
  To: Proxmox VE development discussion

On June 14, 2023 12:42 pm, Fabian Grünbichler wrote:
> the last patch is RFC since we likely want to add another change to improve the
> UX, but there are several options which are all a bit meh.

ping - any comments/input?




^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] applied: [PATCH manager 1/3] node console: restrict all non-login commands to root@pam
  2023-06-14 10:42 ` [pve-devel] [PATCH manager 1/3] node console: restrict all non-login commands to root@pam Fabian Grünbichler
@ 2023-11-06 14:38   ` Thomas Lamprecht
  0 siblings, 0 replies; 8+ messages in thread
From: Thomas Lamprecht @ 2023-11-06 14:38 UTC (permalink / raw)
  To: Proxmox VE development discussion, Fabian Grünbichler

Am 14/06/2023 um 12:42 schrieb Fabian Grünbichler:
> and not just upgrade.
> 
> note that the only other non-login command (ceph_install) is restricted to
> root@pam in the web UI anyway, and that the termproxy endpoint is lacking this
> check and thus always falls back to a login prompt for non-login commands
> requested by non-root users.
> 
> Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
> ---
>  PVE/API2/Nodes.pm | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
>

applied, thanks!




^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] applied: [PATCH manager 2/3] node console: allow usage for non-pam realms
  2023-06-14 10:42 ` [pve-devel] [PATCH manager 2/3] node console: allow usage for non-pam realms Fabian Grünbichler
@ 2023-11-06 14:38   ` Thomas Lamprecht
  0 siblings, 0 replies; 8+ messages in thread
From: Thomas Lamprecht @ 2023-11-06 14:38 UTC (permalink / raw)
  To: Proxmox VE development discussion, Fabian Grünbichler

Am 14/06/2023 um 12:42 schrieb Fabian Grünbichler:
> non-login commands are still restricted to root@pam if they where before.
> 
> Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
> ---
>  PVE/API2/Nodes.pm | 10 +---------
>  1 file changed, 1 insertion(+), 9 deletions(-)
> 
>

applied, thanks!




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [pve-devel] [RFC manager 3/3] node console: lift root@pam restriction for commands
  2023-06-14 10:42 ` [pve-devel] [RFC manager 3/3] node console: lift root@pam restriction for commands Fabian Grünbichler
@ 2023-11-06 14:46   ` Thomas Lamprecht
  0 siblings, 0 replies; 8+ messages in thread
From: Thomas Lamprecht @ 2023-11-06 14:46 UTC (permalink / raw)
  To: Proxmox VE development discussion, Fabian Grünbichler

Am 14/06/2023 um 12:42 schrieb Fabian Grünbichler:
> instead, fallback to a plain login shell if the current user is not already
> root. both current custom commands are effectively a root shell, so it's not
> possible to allow them for regular users.
> 
> note that the non-login commands via xtermjs already had the fallback behaviour
> (i.e., no check for $param->{cmd}) previous to this commit, it was just not
> exposed via our web UI, since the corresponding button/wizard was only enabled
> for root@pam.
> 
> Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
> ---
> 
> Notes:
>     RFC because for a nice UX we probably want to somehow display or inject the
>     command that should be executed once the user is (effectively) root in the
>     console, instead of just opening a login prompt without any indication what the
>     user should do with it..
>     
>     some possible options/suggestions offered so far:
>     - let the API return the command in case of fallback, let the UI display it
>     -- probably would work best if upgrade is converted to an inline xtermjs
>        console, since that supports copy+paste
>     - pass FAKE_SHELL to login, point it at a shell wrapper that echos a note with
>       the command and then executes the real shell
>     - pass FAKE_SHELL to login, point it at a wrapper that runs the command (or the
>       command with sudo, in case the logged in console user is not root) with the
>       user's real shell

That one I like best, as IMO user convenience is more important here,
and if they could successfully log in, it should work just like if they
are root@pam from the beginning; avoiding any copy-paste errors, that
could even result in more harm than good,

We do not depend on `sudo` though, so calling that needs to check if
it's installed. Maybe enforcing the root username would make sense, or
at least a short hint in the UI that they need to log in as root to
continue.




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-11-06 14:46 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-14 10:42 [pve-devel] [PATCH manager 0/3] rework node console permission checks Fabian Grünbichler
2023-06-14 10:42 ` [pve-devel] [PATCH manager 1/3] node console: restrict all non-login commands to root@pam Fabian Grünbichler
2023-11-06 14:38   ` [pve-devel] applied: " Thomas Lamprecht
2023-06-14 10:42 ` [pve-devel] [PATCH manager 2/3] node console: allow usage for non-pam realms Fabian Grünbichler
2023-11-06 14:38   ` [pve-devel] applied: " Thomas Lamprecht
2023-06-14 10:42 ` [pve-devel] [RFC manager 3/3] node console: lift root@pam restriction for commands Fabian Grünbichler
2023-11-06 14:46   ` Thomas Lamprecht
2023-11-06  7:36 ` [pve-devel] [PATCH manager 0/3] rework node console permission checks Fabian Grünbichler

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