]> git.proxmox.com Git - pve-docs.git/blame_incremental - pveum.adoc
fix #3598: include chrony in time synchronisation section
[pve-docs.git] / pveum.adoc
... / ...
CommitLineData
1[[chapter_user_management]]
2ifdef::manvolnum[]
3pveum(1)
4========
5:pve-toplevel:
6
7NAME
8----
9
10pveum - Proxmox VE User Manager
11
12
13SYNOPSIS
14--------
15
16include::pveum.1-synopsis.adoc[]
17
18
19DESCRIPTION
20-----------
21endif::manvolnum[]
22ifndef::manvolnum[]
23User Management
24===============
25:pve-toplevel:
26endif::manvolnum[]
27
28// Copied from pve wiki: Revision as of 16:10, 27 October 2015
29
30Proxmox VE supports multiple authentication sources, e.g. Linux PAM,
31an integrated Proxmox VE authentication server, LDAP, Microsoft Active
32Directory and OpenId Connect.
33
34By using the role based user- and permission management for all
35objects (VMs, storages, nodes, etc.) granular access can be defined.
36
37
38[[pveum_users]]
39Users
40-----
41
42{pve} stores user attributes in `/etc/pve/user.cfg`.
43Passwords are not stored here, users are instead associated with
44<<pveum_authentication_realms,authentication realms>> described below.
45Therefore a user is internally often identified by its name and
46realm in the form `<userid>@<realm>`.
47
48Each user entry in this file contains the following information:
49
50* First name
51* Last name
52* E-mail address
53* Group memberships
54* An optional Expiration date
55* A comment or note about this user
56* Whether this user is enabled or disabled
57* Optional two-factor authentication keys
58
59CAUTION: When you disabled or delete a user, or the expiry date got set and is
60in the past, this user will not be able to log in to new sessions or start new
61tasks. All tasks which already have been started by this user (for example
62terminal sessions) will **not** be terminated automatically by any such event.
63
64
65System administrator
66~~~~~~~~~~~~~~~~~~~~
67
68The system's root user can always log in via the Linux PAM realm and is an
69unconfined administrator. This user cannot be deleted, but attributes can
70still be changed and system mails will be sent to the email address
71assigned to this user.
72
73
74[[pveum_groups]]
75Groups
76------
77
78Each user can be member of several groups. Groups are the preferred
79way to organize access permissions. You should always grant permission
80to groups instead of using individual users. That way you will get a
81much shorter access control list which is easier to handle.
82
83[[pveum_tokens]]
84API Tokens
85----------
86
87API tokens allow stateless access to most parts of the REST API by another
88system, software or API client. Tokens can be generated for individual users
89and can be given separate permissions and expiration dates to limit the scope
90and duration of the access. Should the API token get compromised it can be
91revoked without disabling the user itself.
92
93API tokens come in two basic types:
94
95* separated privileges: the token needs to be given explicit access with ACLs,
96 its effective permissions are calculated by intersecting user and token
97 permissions.
98* full privileges: the token permissions are identical to that of the
99 associated user.
100
101CAUTION: The token value is only displayed/returned once when the token is
102generated. It cannot be retrieved again over the API at a later time!
103
104To use an API token, set the HTTP header 'Authorization' to the displayed value
105of the form `PVEAPIToken=USER@REALM!TOKENID=UUID` when making API requests, or
106refer to your API client documentation.
107
108[[pveum_resource_pools]]
109Resource Pools
110--------------
111
112[thumbnail="screenshot/gui-datacenter-pool-window.png"]
113
114A resource pool is a set of virtual machines, containers, and storage
115devices. It is useful for permission handling in cases where certain users
116should have controlled access to a specific set of resources, as it allows for a
117single permission to be applied to a set of elements, rather than having to
118manage this on a per resource basis. Resource pools are often used in tandem
119with groups so that the members of a group have permissions on a set of machines
120and storage.
121
122[[pveum_authentication_realms]]
123Authentication Realms
124---------------------
125
126As {pve} users are just counterparts for users existing on some external
127realm, the realms have to be configured in `/etc/pve/domains.cfg`.
128The following realms (authentication methods) are available:
129
130Linux PAM standard authentication::
131In this case a system user has to exist (e.g. created via the `adduser`
132command) on all nodes the user is allowed to login, and the user
133authenticates with their usual system password.
134+
135[source,bash]
136----
137useradd heinz
138passwd heinz
139groupadd watchman
140usermod -a -G watchman heinz
141----
142
143Proxmox VE authentication server::
144This is a unix like password store (`/etc/pve/priv/shadow.cfg`).
145Password are encrypted using the SHA-256 hash method.
146This is the most convenient method for small (or even medium)
147installations where users do not need access to anything outside of
148{pve}. In this case users are fully managed by {pve} and are able to
149change their own passwords via the GUI.
150
151LDAP::
152It is possible to authenticate users via an LDAP server (e.g.
153openldap). The server and an optional fallback server can be
154configured and the connection can be encrypted via SSL.
155+
156Users are searched under a 'Base Domain Name' (`base_dn`), with the
157user name found in the attribute specified in the 'User Attribute Name'
158(`user_attr`) field.
159+
160For instance, if a user is represented via the
161following ldif dataset:
162+
163----
164# user1 of People at ldap-test.com
165dn: uid=user1,ou=People,dc=ldap-test,dc=com
166objectClass: top
167objectClass: person
168objectClass: organizationalPerson
169objectClass: inetOrgPerson
170uid: user1
171cn: Test User 1
172sn: Testers
173description: This is the first test user.
174----
175+
176The 'Base Domain Name' would be `ou=People,dc=ldap-test,dc=com` and the user
177attribute would be `uid`.
178+
179If {pve} needs to authenticate (bind) to the LDAP server before being
180able to query and authenticate users, a bind domain name can be
181configured via the `bind_dn` property in `/etc/pve/domains.cfg`. Its
182password then has to be stored in `/etc/pve/priv/ldap/<realmname>.pw`
183(e.g. `/etc/pve/priv/ldap/my-ldap.pw`). This file should contain a
184single line containing the raw password.
185+
186To verify certificates, you need to to set `capath`. You can set it either
187directly to the CA certificate of your LDAP server, or to the system path
188containing all trusted CA certificates (`/etc/ssl/certs`).
189Additionally, you need to set the `verify` option, which can also be done over
190the web interface.
191
192Microsoft Active Directory::
193
194A server and authentication domain need to be specified. Like with LDAP, an
195optional fallback server, port, and SSL encryption can be configured.
196
197OpenId Connect::
198
199OpenID Connect allows clients to verify the identity of the user based
200on the authentication performed by an external authorization
201server.
202
203
204[[pveum_openid]]
205OpenId Connect
206~~~~~~~~~~~~~~
207
208The main OpenID Connect configuration options are:
209
210* `issuer-url`: This is the Url to the authorization server. Proxmox
211uses the OpenID Connect Discovery protocol to automatiocally configure
212further details.
213+
214While it is possible to use unencrypted `http://` Urls, we strongly recommend to
215use encrypted `https://` connections.
216
217* `client-id`: OpenID Client ID.
218
219* `client-key`: Optional OpenID Client Key.
220
221* `autocreate`: Automatically create users if they do not exist. While
222authentication is done at the OpenID server, all users still need an
223entry in the {pve} user configuration. You can either add them
224manually, or use the `autocreate` option to automatically add new
225users.
226
227* `username-claim`: OpenID claim used to generate the unique username
228 (`subject`, `username` or `email`).
229
230Username mapping
231^^^^^^^^^^^^^^^^
232
233The Openid Connect specification defines a single unique attribute
234('claim' in OpenId terms) named `subject`. By default, we use the
235value of this attribute to generate {pve} usernames, by simple adding
236`@` and the realm name: `${subject}@${realm}`.
237
238Unfortunately, most OpenID server use random strings for `subject`, like
239`DGH76OKH34BNG3245SB`, so a typical username would look like
240`DGH76OKH34BNG3245SB@yourrealm`. While unique, it is really hard for
241humans to remember such random strings, making it quite impossible to
242associate real users with that.
243
244The `username-claim` setting allows you to use other attributes for
245the username mapping. Setting it to `username` is preferred, if the
246OpenId Connect server provides that attribute and guarantee its
247uniqueness.
248
249Another option is to use `email`, which also yields to human readable
250usernames. Again, only use this setting if the server guarantees the
251uniqueness of this attribute.
252
253Examples
254^^^^^^^^
255
256Here is an example to create an OpenId realm using Google. You need to
257replace `--client-id` and `--client-key` with the values
258from your Google OpenId settings.
259
260----
261pveum realm add myrealm1 --type openid --issuer-url https://accounts.google.com --client-id XXXX --client-key YYYY --username-claim email
262----
263
264Above setup uses `--username-claim email`, so the usernames at the
265{pve} side looks like `example.user@google.com@myrealm1`.
266
267KeyCloak (https://www.keycloak.org/) is a popular Open Source Identity
268and Access Management supporting OpenId Connect. In the following
269example, you need to replace the `--issuer-url` and `--client-id` with
270your setting:
271
272----
273pveum realm add myrealm2 --type openid --issuer-url https://your.server:8080/auth/realms/your-realm --client-id XXX --username-claim username
274----
275
276Using `--username-claim username` yields to simple usernames on the
277{pve} side, like `example.user@myrealm2`.
278
279WARNING: You need to make sure that the user is not allowed to edit
280the username setting himself (on the Keycloak server).
281
282
283[[pveum_ldap_sync]]
284Syncing LDAP-based realms
285~~~~~~~~~~~~~~~~~~~~~~~~~
286
287[thumbnail="screenshot/gui-datacenter-realm-add-ldap.png"]
288
289It is possible to sync users and groups for LDAP based realms. You can use the
290CLI command
291
292----
293 pveum realm sync <realm>
294----
295or in the `Authentication` panel of the GUI. Users and groups are synced to the
296cluster-wide user configuration file `/etc/pve/user.cfg`.
297
298Requirements and limitations
299^^^^^^^^^^^^^^^^^^^^^^^^^^^^
300
301The `bind_dn` is used to query the users and groups. This account needs access
302to all desired entries.
303
304The fields which represent the names of the users and groups can be configured
305via the `user_attr` and `group_name_attr` respectively. Only entries which
306adhere to the usual character limitations of the user.cfg are synced.
307
308Groups are synced with `-$realm` attached to the name, to avoid naming
309conflicts. Please make sure that a sync does not overwrite manually created
310groups.
311
312[[pveum_ldap_sync_options]]
313Options
314^^^^^^^
315
316[thumbnail="screenshot/gui-datacenter-realm-add-ldap-sync-options.png"]
317
318The main options for syncing are:
319
320* `dry-run`: No data is written to the config. This is useful if you want to
321 see which users and groups would get synced to the user.cfg. This is set
322 when you click `Preview` in the GUI.
323
324* `enable-new`: If set, the newly synced users are enabled and can login.
325 The default is `true`.
326
327* `full`: If set, the sync uses the LDAP Directory as a source of truth,
328 overwriting information set manually in the user.cfg and deletes users
329 and groups which are not present in the LDAP directory. If not set,
330 only new data is written to the config, and no stale users are deleted.
331
332* `purge`: If set, sync removes all corresponding ACLs when removing users
333 and groups. This is only useful with the option `full`.
334
335* `scope`: The scope of what to sync. It can be either `users`, `groups` or
336 `both`.
337
338These options are either set as parameters or as defaults, via the
339realm option `sync-defaults-options`.
340
341[[pveum_tfa_auth]]
342Two-factor authentication
343-------------------------
344
345There are two ways to use two-factor authentication:
346
347It can be required by the authentication realm, either via 'TOTP'
348(Time-based One-Time Password) or 'YubiKey OTP'. In this case a newly
349created user needs their keys added immediately as there is no way to
350log in without the second factor. In the case of 'TOTP', users can
351also change the 'TOTP' later on, provided they can log in first.
352
353Alternatively, users can choose to opt in to two-factor authentication
354via 'TOTP' later on, even if the realm does not enforce it. As another
355option, if the server has an 'AppId' configured, a user can opt into
356'U2F' authentication, provided the realm does not enforce any other
357second factor.
358
359Realm enforced two-factor authentication
360~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
361
362This can be done by selecting one of the available methods via the
363'TFA' dropdown box when adding or editing an Authentication Realm.
364When a realm has TFA enabled it becomes a requirement and only users
365with configured TFA will be able to login.
366
367Currently there are two methods available:
368
369Time-based OATH (TOTP):: This uses the standard HMAC-SHA1 algorithm
370where the current time is hashed with the user's configured key. The
371time step and password length parameters are configured.
372+
373A user can have multiple keys configured (separated by spaces), and the keys
374can be specified in Base32 (RFC3548) or hexadecimal notation.
375+
376{pve} provides a key generation tool (`oathkeygen`) which prints out a random
377key in Base32 notation which can be used directly with various OTP tools, such
378as the `oathtool` command line tool, or on Android Google Authenticator,
379FreeOTP, andOTP or similar applications.
380
381YubiKey OTP::
382For authenticating via a YubiKey a Yubico API ID, API KEY and validation
383server URL must be configured, and users must have a YubiKey available. In
384order to get the key ID from a YubiKey, you can trigger the YubiKey once
385after connecting it to USB and copy the first 12 characters of the typed
386password into the user's 'Key IDs' field.
387
388+
389Please refer to the https://developers.yubico.com/OTP/[YubiKey OTP]
390documentation for how to use the
391https://www.yubico.com/products/services-software/yubicloud/[YubiCloud] or
392https://developers.yubico.com/Software_Projects/Yubico_OTP/YubiCloud_Validation_Servers/[host
393your own verification server].
394
395[[pveum_user_configured_totp]]
396User configured TOTP authentication
397~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
398
399Users can choose to enable 'TOTP' as a second factor on login via the 'TFA'
400button in the user list (unless the realm enforces 'YubiKey OTP').
401
402[thumbnail="screenshot/gui-datacenter-users-tfa.png"]
403
404After opening the 'TFA' window, the user is presented with a dialog to setup
405'TOTP' authentication. The 'Secret' field contains the key, which can simply be
406generated randomly via the 'Randomize' button. An optional 'Issuer Name' can be
407added to provide information to the 'TOTP' app what the key belongs to.
408Most 'TOTP' apps will show the issuer name together with the corresponding
409'OTP' values. The user name is also included in the QR code for the 'TOTP' app.
410
411After generating a key, a QR code will be displayed which can be used with most
412OTP apps such as FreeOTP. Now the user needs to verify both the current user
413password (unless logged in as 'root'), as well as the ability to correctly use
414the 'TOTP' key by typing the current 'OTP' value into the 'Verification Code'
415field before pressing the 'Apply' button.
416
417[[pveum_configure_u2f]]
418Server side U2F configuration
419~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
420
421To allow users to use 'U2F' authentication, it may be necessary to use a valid
422domain with a valid https certificate, otherwise some browsers may print
423a warning or reject U2F usage altogether. Initially an 'AppId'
424footnote:[AppId https://developers.yubico.com/U2F/App_ID.html]
425needs to be configured.
426
427NOTE: Changing the 'AppId' will render all existing 'U2F' registrations
428unusable!
429
430This is done via `/etc/pve/datacenter.cfg`, for instance:
431
432----
433u2f: appid=https://mypve.example.com:8006
434----
435
436For a single node, the 'AppId' can simply be the web UI address exactly as it
437is used in the browser, including the 'https://' and the port as shown above.
438Please note that some browsers may be more strict than others when matching
439'AppIds'.
440
441When using multiple nodes, it is best to have a separate `https` server
442providing an `appid.json`
443footnote:[Multi-facet apps: https://developers.yubico.com/U2F/App_ID.html]
444file, as it seems to be compatible with most
445browsers. If all nodes use subdomains of the same top level domain, it may be
446enough to use the TLD as 'AppId', but note that some browsers may not accept
447this.
448
449NOTE: A bad 'AppId' will usually produce an error, but we have encountered
450situation where this does not happen, particularly when using a top level domain
451'AppId' for a node accessed via a subdomain in Chromium. For this reason it is
452recommended to test the configuration with multiple browsers, as changing the
453'AppId' later will render existing 'U2F' registrations unusable.
454
455[[pveum_user_configured_u2f]]
456Activating U2F as a user
457~~~~~~~~~~~~~~~~~~~~~~~~
458
459To enable 'U2F' authentication, open the 'TFA' window's 'U2F' tab, type in the
460current password (unless logged in as root), and press the 'Register' button.
461If the server is setup correctly and the browser accepted the server's provided
462'AppId', a message will appear prompting the user to press the button on the
463'U2F' device (if it is a 'YubiKey' the button light should be toggling off and
464on steadily around twice per second).
465
466Firefox users may need to enable 'security.webauth.u2f' via 'about:config'
467before they can use a 'U2F' token.
468
469[[pveum_permission_management]]
470Permission Management
471---------------------
472
473In order for a user to perform an action (such as listing, modifying or
474deleting a parts of a VM configuration), the user needs to have the
475appropriate permissions.
476
477{pve} uses a role and path based permission management system. An entry in
478the permissions table allows a user, group or token to take on a specific role
479when accessing an 'object' or 'path'. This means an such an access rule can
480be represented as a triple of '(path, user, role)', '(path, group,
481role)' or '(path, token, role)', with the role containing a set of allowed
482actions, and the path representing the target of these actions.
483
484
485[[pveum_roles]]
486Roles
487~~~~~
488
489A role is simply a list of privileges. Proxmox VE comes with a number
490of predefined roles which satisfies most needs.
491
492* `Administrator`: has all privileges
493* `NoAccess`: has no privileges (used to forbid access)
494* `PVEAdmin`: can do most things, but miss rights to modify system settings (`Sys.PowerMgmt`, `Sys.Modify`, `Realm.Allocate`).
495* `PVEAuditor`: read only access
496* `PVEDatastoreAdmin`: create and allocate backup space and templates
497* `PVEDatastoreUser`: allocate backup space and view storage
498* `PVEPoolAdmin`: allocate pools
499* `PVESysAdmin`: User ACLs, audit, system console and system logs
500* `PVETemplateUser`: view and clone templates
501* `PVEUserAdmin`: user administration
502* `PVEVMAdmin`: fully administer VMs
503* `PVEVMUser`: view, backup, config CD-ROM, VM console, VM power management
504
505You can see the whole set of predefined roles on the GUI.
506
507Adding new roles can be done via both GUI and the command line.
508
509[thumbnail="screenshot/gui-datacenter-role-add.png"]
510For the GUI just navigate to 'Permissions -> User' Tab from 'Datacenter' and
511click on the 'Create' button, there you can set a name and select all desired
512roles from the 'Privileges' dropdown box.
513
514To add a role through the command line you can use the 'pveum' CLI tool, like
515this:
516[source,bash]
517----
518pveum roleadd PVE_Power-only -privs "VM.PowerMgmt VM.Console"
519pveum roleadd Sys_Power-only -privs "Sys.PowerMgmt Sys.Console"
520----
521
522
523Privileges
524~~~~~~~~~~
525
526A privilege is the right to perform a specific action. To simplify
527management, lists of privileges are grouped into roles, which can then
528be used in the permission table. Note that privileges cannot directly be
529assigned to users and paths without being part of a role.
530
531We currently use the following privileges:
532
533Node / System related privileges::
534
535* `Permissions.Modify`: modify access permissions
536* `Sys.PowerMgmt`: Node power management (start, stop, reset, shutdown, ...)
537* `Sys.Console`: console access to Node
538* `Sys.Syslog`: view Syslog
539* `Sys.Audit`: view node status/config, Corosync cluster config and HA config
540* `Sys.Modify`: create/remove/modify node network parameters
541* `Group.Allocate`: create/remove/modify groups
542* `Pool.Allocate`: create/remove/modify a pool
543* `Pool.Audit`: view a pool
544* `Realm.Allocate`: create/remove/modify authentication realms
545* `Realm.AllocateUser`: assign user to a realm
546* `User.Modify`: create/remove/modify user access and details.
547
548Virtual machine related privileges::
549
550* `VM.Allocate`: create/remove new VM to server inventory
551* `VM.Migrate`: migrate VM to alternate server on cluster
552* `VM.PowerMgmt`: power management (start, stop, reset, shutdown, ...)
553* `VM.Console`: console access to VM
554* `VM.Monitor`: access to VM monitor (kvm)
555* `VM.Backup`: backup/restore VMs
556* `VM.Audit`: view VM config
557* `VM.Clone`: clone/copy a VM
558* `VM.Config.Disk`: add/modify/delete Disks
559* `VM.Config.CDROM`: eject/change CD-ROM
560* `VM.Config.CPU`: modify CPU settings
561* `VM.Config.Memory`: modify Memory settings
562* `VM.Config.Network`: add/modify/delete Network devices
563* `VM.Config.HWType`: modify emulated HW type
564* `VM.Config.Options`: modify any other VM configuration
565* `VM.Snapshot`: create/remove VM snapshots
566
567Storage related privileges::
568
569* `Datastore.Allocate`: create/remove/modify a data store, delete volumes
570* `Datastore.AllocateSpace`: allocate space on a datastore
571* `Datastore.AllocateTemplate`: allocate/upload templates and iso images
572* `Datastore.Audit`: view/browse a datastore
573
574
575Objects and Paths
576~~~~~~~~~~~~~~~~~
577
578Access permissions are assigned to objects, such as a virtual machines,
579storages or pools of resources.
580We use file system like paths to address these objects. These paths form a
581natural tree, and permissions of higher levels (shorter path) can
582optionally be propagated down within this hierarchy.
583
584[[pveum_templated_paths]]
585Paths can be templated. When an API call requires permissions on a
586templated path, the path may contain references to parameters of the API
587call. These references are specified in curly braces. Some parameters are
588implicitly taken from the API call's URI. For instance the permission path
589`/nodes/{node}` when calling '/nodes/mynode/status' requires permissions on
590`/nodes/mynode`, while the path `{path}` in a PUT request to `/access/acl`
591refers to the method's `path` parameter.
592
593Some examples are:
594
595* `/nodes/{node}`: Access to {pve} server machines
596* `/vms`: Covers all VMs
597* `/vms/{vmid}`: Access to specific VMs
598* `/storage/{storeid}`: Access to a storages
599* `/pool/{poolname}`: Access to VMs part of a <<pveum_pools,pool>>
600* `/access/groups`: Group administration
601* `/access/realms/{realmid}`: Administrative access to realms
602
603
604Inheritance
605^^^^^^^^^^^
606
607As mentioned earlier, object paths form a file system like tree, and
608permissions can be inherited down that tree (the propagate flag is set
609by default). We use the following inheritance rules:
610
611* Permissions for individual users always replace group permissions.
612* Permissions for groups apply when the user is member of that group.
613* Permissions replace the ones inherited from an upper level.
614
615Additionally, privilege separated tokens can never have a permission on any
616given path that their associated user does not have.
617
618[[pveum_pools]]
619Pools
620~~~~~
621
622Pools can be used to group a set of virtual machines and data
623stores. You can then simply set permissions on pools (`/pool/{poolid}`),
624which are inherited to all pool members. This is a great way simplify
625access control.
626
627
628What permission do I need?
629~~~~~~~~~~~~~~~~~~~~~~~~~~
630
631The required API permissions are documented for each individual
632method, and can be found at https://pve.proxmox.com/pve-docs/api-viewer/
633
634The permissions are specified as a list which can be interpreted as a
635tree of logic and access-check functions:
636
637`["and", <subtests>...]` and `["or", <subtests>...]`::
638Each(`and`) or any(`or`) further element in the current list has to be true.
639
640`["perm", <path>, [ <privileges>... ], <options>...]`::
641The `path` is a templated parameter (see
642<<pveum_templated_paths,Objects and Paths>>). All (or, if the `any`
643option is used, any) of the listed
644privileges must be allowed on the specified path. If a `require-param`
645option is specified, then its specified parameter is required even if the
646API call's schema otherwise lists it as being optional.
647
648`["userid-group", [ <privileges>... ], <options>...]`::
649The caller must have any of the listed privileges on `/access/groups`. In
650addition there are two possible checks depending on whether the
651`groups_param` option is set:
652+
653* `groups_param` is set: The API call has a non-optional `groups` parameter
654and the caller must have any of the listed privileges on all of the listed
655groups.
656* `groups_param` is not set: The user passed via the `userid` parameter
657must exist and be part of a group on which the caller has any of the listed
658privileges (via the `/access/groups/<group>` path).
659
660`["userid-param", "self"]`::
661The value provided for the API call's `userid` parameter must refer to the
662user performing the action. (Usually in conjunction with `or`, to allow
663users to perform an action on themselves even if they don't have elevated
664privileges.)
665
666`["userid-param", "Realm.AllocateUser"]`::
667The user needs `Realm.AllocateUser` access to `/access/realm/<realm>`, with
668`<realm>` referring to the realm of the user passed via the `userid`
669parameter. Note that the user does not need to exist in order to be
670associated with a realm, since user IDs are passed in the form of
671`<username>@<realm>`.
672
673`["perm-modify", <path>]`::
674The `path` is a templated parameter (see
675<<pveum_templated_paths,Objects and Paths>>). The user needs either the
676`Permissions.Modify` privilege, or,
677depending on the path, the following privileges as a possible substitute:
678+
679* `/storage/...`: additionally requires 'Datastore.Allocate`
680* `/vms/...`: additionally requires 'VM.Allocate`
681* `/pool/...`: additionally requires 'Pool.Allocate`
682+
683If the path is empty, `Permission.Modify` on `/access` is required.
684
685Command Line Tool
686-----------------
687
688Most users will simply use the GUI to manage users. But there is also
689a fully featured command line tool called `pveum` (short for ``**P**roxmox
690**VE** **U**ser **M**anager''). Please note that all Proxmox VE command
691line tools are wrappers around the API, so you can also access those
692functions through the REST API.
693
694Here are some simple usage examples. To show help type:
695
696[source,bash]
697 pveum
698
699or (to show detailed help about a specific command)
700
701[source,bash]
702 pveum help user add
703
704Create a new user:
705
706[source,bash]
707 pveum user add testuser@pve -comment "Just a test"
708
709Set or Change the password (not all realms support that):
710
711[source,bash]
712 pveum passwd testuser@pve
713
714Disable a user:
715
716[source,bash]
717 pveum user modify testuser@pve -enable 0
718
719Create a new group:
720
721[source,bash]
722 pveum group add testgroup
723
724Create a new role:
725
726[source,bash]
727 pveum role add PVE_Power-only -privs "VM.PowerMgmt VM.Console"
728
729
730Real World Examples
731-------------------
732
733
734Administrator Group
735~~~~~~~~~~~~~~~~~~~
736
737One of the most wanted features was the ability to define a group of
738users with full administrator rights (without using the root account).
739
740Define the group:
741
742[source,bash]
743 pveum group add admin -comment "System Administrators"
744
745Then add the permission:
746
747[source,bash]
748 pveum acl modify / -group admin -role Administrator
749
750You can finally add users to the new 'admin' group:
751
752[source,bash]
753 pveum user modify testuser@pve -group admin
754
755
756Auditors
757~~~~~~~~
758
759You can give read only access to users by assigning the `PVEAuditor`
760role to users or groups.
761
762Example1: Allow user `joe@pve` to see everything
763
764[source,bash]
765 pveum acl modify / -user joe@pve -role PVEAuditor
766
767Example1: Allow user `joe@pve` to see all virtual machines
768
769[source,bash]
770 pveum acl modify /vms -user joe@pve -role PVEAuditor
771
772
773Delegate User Management
774~~~~~~~~~~~~~~~~~~~~~~~~
775
776If you want to delegate user management to user `joe@pve` you can do
777that with:
778
779[source,bash]
780 pveum acl modify /access -user joe@pve -role PVEUserAdmin
781
782User `joe@pve` can now add and remove users, change passwords and
783other user attributes. This is a very powerful role, and you most
784likely want to limit that to selected realms and groups. The following
785example allows `joe@pve` to modify users within realm `pve` if they
786are members of group `customers`:
787
788[source,bash]
789 pveum acl modify /access/realm/pve -user joe@pve -role PVEUserAdmin
790 pveum acl modify /access/groups/customers -user joe@pve -role PVEUserAdmin
791
792NOTE: The user is able to add other users, but only if they are
793members of group `customers` and within realm `pve`.
794
795Limited API token for monitoring
796~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
797
798Given a user `joe@pve` with the PVEVMAdmin role on all VMs:
799
800[source,bash]
801 pveum acl modify /vms -user joe@pve -role PVEVMAdmin
802
803Add a new API token with separate privileges, which is only allowed to view VM
804information (e.g., for monitoring purposes):
805
806[source,bash]
807 pveum user token add joe@pve monitoring -privsep 1
808 pveum acl modify /vms -token 'joe@pve!monitoring' -role PVEAuditor
809
810Verify the permissions of the user and token:
811
812[source,bash]
813 pveum user permissions joe@pve
814 pveum user token permissions joe@pve monitoring
815
816Resource Pools
817~~~~~~~~~~~~~~
818
819An enterprise is usually structured into several smaller departments, and it is
820common that you want to assign resources and delegate management tasks to each
821of these. Let's assume that you want to set up a pool for a software development
822department. First, create a group
823
824[source,bash]
825 pveum group add developers -comment "Our software developers"
826
827Now we create a new user which is a member of that group
828
829[source,bash]
830 pveum user add developer1@pve -group developers -password
831
832NOTE: The -password parameter will prompt you for a password
833
834Then we create a resource pool for our development department to use
835
836[source,bash]
837 pveum pool add dev-pool --comment "IT development pool"
838
839Finally, we can assign permissions to that pool
840
841[source,bash]
842 pveum acl modify /pool/dev-pool/ -group developers -role PVEAdmin
843
844Our software developers can now administrate the resources assigned to
845that pool.
846
847
848ifdef::manvolnum[]
849include::pve-copyright.adoc[]
850endif::manvolnum[]
851