Chapter 14 · User Management

第 14 章 用户管理

用户、组、 API Token、资源池 , 多种认证域(PAM / PVE / LDAP / AD / OpenID Connect), LDAP 同步 , 双因素(TOTP / WebAuthn / YubiKey / Recovery Keys / U2F), 基于角色与路径的权限体系 , pveum 命令行与真实示例。

14.用户管理User Management

Proxmox VE 支持多种认证源 :Linux PAM、内置 PVE 认证服务器、 LDAP、 Microsoft Active Directory、 OpenID Connect。通过对所有对象(VM、存储、节点等)基于角色的用户与权限管理 , 可定义细粒度访问。

14.1.用户Users

PVE 把用户属性存于 /etc/pve/user.cfg。密码不存于此 —— 用户与下文的认证域关联。因此用户内部通常以 <userid>@<realm> 形式标识。每条用户记录含:

  • First name、 Last name、 E-mail
  • 所属组
  • 可选过期日期
  • 注释
  • 启用 / 禁用标志
  • 可选的双因素密钥
NOTE

禁用 / 删除用户或过期时 , 该用户不能再建新会话 / 开新任务;但已启动的任务(如终端会话)不会被自动终止。

14.1.1.系统管理员

系统 root 总是可通过 Linux PAM 域登录 , 是 不受约束的管理员, 不可删除但属性可改。系统邮件会发到该用户的 email。

14.2.组Groups

每个用户可加入多个组。组是组织访问权限的首选方式 —— 授权给组而非单个用户 , 访问控制列表会更可维护。

14.3.API TokenAPI Tokens

API Token 让外部系统 / 软件 / API 客户端无状态访问大部分 REST API。可为某用户生成多个 Token , 并设独立权限与过期时间 , 以限制访问范围与时长。 Token 被泄时可撤销 , 而不必禁用所属用户。两种类型:

  • Separated privileges:Token 需经 ACL 显式授权 , 实际权限 = 用户权限 ∩ Token 权限。
  • Full privileges:Token 权限与所属用户一致。
WARN

Token 值 仅在生成时显示 / 返回一次, 之后无法经 API 再获取!

使用时把 HTTP 头 Authorization 设为 PVEAPIToken=USER@REALM!TOKENID=UUID(或参考你的 API 客户端文档)。

14.4.资源池Resource Pools

资源池是一组 VM / 容器 / 存储。便于权限管理 —— 一次授权即可作用于一组资源 , 免去逐项设置。常与组联用 , 让组成员对一组机器与存储拥有权限。

14.5.认证域Authentication Realms

PVE 用户只是外部域中现有用户的对应体 , 域须在 /etc/pve/domains.cfg 配置。可用方式:

Linux PAM
系统级用户认证框架 —— 用 adduser 之类在主机建用户 , 在 PVE 中加对应条目后即可用系统用户名 / 密码登录。
Proxmox VE Authentication Server
Unix 风格密码库 —— 哈希后的密码存于 /etc/pve/priv/shadow.cfg(SHA-256)。小中规模安装最方便 , 用户完全由 PVE 管理 , 也可在 GUI 改自己的密码。
LDAP
OpenLDAP 等目录服务。
Microsoft Active Directory(AD)
Windows 域目录服务 , 支持 LDAP 作认证协议。
OpenID Connect
建在 OAuth 2.0 之上的身份层 —— 由外部授权服务器完成认证后 , 客户端据此核实用户身份。

14.5.1.Linux PAM

PAM 对应主机系统用户 —— 用户在其允许登录的每个节点上都必须存在系统账号。该域默认存在且不可移除。经 GUI / /access/password 改密码只作用于本地节点 , 不跨集群 —— 不同节点用不同密码仍有安全价值。管理员可为此域开启强制双因素 , 或设为默认登录域。

14.5.2.Proxmox VE Authentication Server

Unix 风格密码库。默认存在 , 配置项与 PAM 类似(强制 2FA、默认域)。用户在 PVE 内部创建 / 认证 , 不依赖外部系统 —— 创建时必须设密码。

14.5.3.LDAP

可对接外部 LDAP(如 OpenLDAP)。用户在 Base Domain Name(base_dn)下按 User Attribute Name(user_attr)查找。可配主 / 备服务器与 SSL , 过滤器可进一步缩小范围。例如 LDIF 条目:

# user1 of People at ldap-test.com
dn: uid=user1,ou=People,dc=ldap-test,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: user1
cn: Test User 1
sn: Testers
description: 这是第一个测试用户。

则 Base DN 为 ou=People,dc=ldap-test,dc=com, user attribute 为 uid。

若 PVE 需要先 bind 才能查询 , 用 bind_dn 配置 , 对应密码放在 /etc/pve/priv/realm/<realmname>.pw(如 /etc/pve/priv/realm/my-ldap.pw, 一行明文)。校验证书需设 capath(LDAP 服务器 CA 或 /etc/ssl/certs), 并开启 verify(Web 界面也可)。主要选项:

Realm(realm)
PVE 中此域的标识。
Base Domain Name(base_dn)
查找用户的目录。
User Attribute Name(user_attr)
含登录用户名的 LDAP 属性。
Server(server1)
LDAP 目录所在服务器。
Fallback Server(server2)
可选备用服务器。
Port(port)
LDAP 监听端口。
NOTE

要让某 LDAP 用户能登录 , 须在 PVE 此域中也建对应用户 —— 可用 同步 自动化。

14.5.4.Microsoft Active Directory(AD)

需指定服务器与认证域。 AD 支持的属性与 LDAP 大同小异(备用服务器、端口、 SSL), 可经同步自动把用户加入 PVE。 PVE bind AD 前通常 需要 配 Bind User(bind_dn)—— AD 默认如此。主要设置:

Realm(realm)
PVE 用户的域标识。
Domain(domain)
服务器的 AD 域。
Server(server1)
FQDN 或 IP。
Fallback Server(server2)
可选备用。
Port(port)
监听端口。
NOTE

AD 默认用户名 不区分大小写。让 PVE 也如此 , 在 Web UI 编辑域时关闭默认的 case-sensitive, 或命令行(把 ID 换成域 ID):pveum realm modify ID --case-sensitive 0。

14.5.5.LDAP-based 域的同步

LDAP 与 AD 可自动同步用户 / 组到 PVE , 免去手工添加。在 Web 界面 Authentication 面板的 Add/Edit 或命令行 pveum realm add/modify 配置同步选项 , 然后在 GUI 或命令行触发:

pveum realm sync <realm>

用户与组同步到集群级 /etc/pve/user.cfg。

属性到字段的映射

同步响应若含用户属性 , 会填入 user.cfg 对应字段(如 firstname、 lastname)。若属性名不匹配 PVE 字段 , 可用 sync_attributes 自定义映射。某属性在后续同步中缺失时如何处理 , 由同步选项控制(见下)。

同步配置

Add/Edit 窗口的 Sync Options 页下:

Bind User(bind_dn)
用于查询用户 / 组的 LDAP 账号。设了就走 bind 搜;不设匿名搜。须是完整 LDAP DN , 如 cn=admin,dc=example,dc=com。
Groupname attr.(group_name_attr)
代表用户的组。仅 user.cfg 允许字符的条目才会被同步。组名会附加 -$realm 以防命名冲突 —— 注意别让同步覆盖手建组。
User classes(user_classes)
用户关联的 object class。
Group classes(group_classes)
组关联的 object class。
E-Mail attribute
LDAP 中 email 属性 —— 命令行 --sync_attributes。
User Filter(filter)、 Group Filter(group_filter)
进一步筛选。
NOTE

过滤器可叠加匹配条件以缩小同步范围。 LDAP 过滤语法见 ldap.com。

同步选项

除上节外 , 还有描述同步行为的选项。可作单次参数或经域选项 sync-defaults-options 设默认:

Scope(scope)
同步范围 :users / groups / both。
Enable new(enable-new, 默认 true)
新同步用户启用 , 可登录。
Remove Vanished(remove-vanished)
列表选项 —— 同步响应未返回的条目是否移除:
  • acl:移除未返回用户 / 组的 ACL(常与 entry 同用)。
  • entry:移除未返回的条目(用户 / 组)。
  • properties:移除同步响应中未含属性的对应字段 —— 包含所有字段 , 即便从未经同步设过。 Token 与启用标志会保留。
Preview(dry-run)
不写入配置 —— 用于预览同步结果。
保留字符

某些字符(见 RFC 2253)在 DN 属性值中保留 , 未转义就不能直接使用 —— 需转义的有:

  • 行首 / 行尾空格( )
  • 行首井号(#)
  • 逗号(,)、加号(+)、双引号(")、斜杠(/)、尖括号(<>)、分号(;)、等号(=)

要在 DN 中用这些字符 , 属性值用双引号包起。例如 CN 为 Example, User, bind_dn 写为 CN="Example, User",OU=people,DC=example,DC=com。适用于 base_dn、 bind_dn、 group_dn。

NOTE

含冒号或斜杠的用户名不可同步 —— 这是 PVE 用户名的保留字符。

14.5.6.OpenID Connect

主要配置项:

Issuer URL(issuer-url)
授权服务器 URL。 PVE 用 OIDC Discovery 协议自动获取其他细节。虽可用 http, 强烈建议 https。
Realm(realm)
PVE 用户的域标识。
Client ID(client-id)
OpenID 客户端 ID。
Client Key(client-key)
可选客户端密钥。
Autocreate Users(autocreate)
不存在时自动建用户。虽然认证在 OIDC 服务器完成 , 所有用户仍需在 PVE 有条目 —— 可手动加或用 autocreate 自动加。
Username Claim(username-claim)
用作唯一用户名的 OIDC claim(subject / username / email)。
Autocreate Groups(groups-autocreate)
按 claim 中的所有组创建 , 而不是只用 PVE 已有组(默认行为)。
Groups Claim(groups-claim)
用来从 ID token / userinfo 取组的 OIDC claim。
Overwrite Groups(groups-overwrite)
覆盖而非追加用户已属的组。
用户名映射

OIDC 只有一个唯一属性 subject。默认用它生成 PVE 用户名 :${subject}@${realm}。可惜大多数 OIDC 服务器的 subject 是类似 DGH76OKH34BNG3245SB 的随机串 —— 唯一但难辨认。 username-claim 可换其他属性 —— 首选 username(若服务器保证唯一); email 也可读 , 前提同样是唯一。

组映射

设了 groups-claim 即启用组映射 —— 其值应是字符串列表 , 对应用户在 PVE 中应属的组。为防冲突 , 从 OIDC claim 来的组名会加后缀 -<realm>(例如 realm 为 oidc 时 , my-openid-group → my-openid-group-oidc)。 OIDC 报告但 PVE 中不存在的组默认忽略;若要全部存在 , 开 groups-autocreate。默认组追加到用户已有组上;如要覆盖 , 开 groups-overwrite。若 claim 组名含 PVE 组 ID 非法字符 , 不会被纳入 , 日志会告警。

高级设置
Query userinfo endpoint(query-userinfo)
启用则向 "userinfo" 端点查 claim;某些不支持该端点的 IdP(如 ADFS)需禁用。
示例

用 Google 建 OIDC 域(把 --client-id / --client-key 换成你 Google OIDC 设置的值):

pveum realm add myrealm1 --type openid --issuer-url https://accounts.google.com \
  --client-id XXXX --client-key YYYY --username-claim email

上面用 --username-claim email, 得到形如 example.user@google.com@myrealm1。 Keycloak 示例(替换 --issuer-url 与 --client-id):

pveum realm add myrealm2 --type openid \
  --issuer-url https://your.server:8080/realms/your-realm \
  --client-id XXX --username-claim username

用 --username-claim username 可得到 example.user@myrealm2。

NOTE

须确保用户在 Keycloak 侧 不能自行修改 username。

14.6.双因素认证Two-Factor Authentication

两种用法 :认证域强制(TOTP 或 YubiKey OTP)—— 新建用户必须立刻加密钥 , 否则无法登录; TOTP 还允许登录后改绑。或由用户主动开启(域未强制时)。

14.6.1.可用的第二因子

可配置多个第二因子 , 避免丢手机 / 安全钥匙永久锁死。除域强制的 TOTP / YubiKey 外 , 还支持:

  • User configured TOTP(基于时间的一次性密码):由共享密钥与当前时间派生 , 每 30 秒一变。
  • WebAuthn(Web 认证):通用认证标准 —— 多种安全设备实现 , 如硬件钥匙、电脑 / 手机 TPM。
  • 一次性 Recovery Keys:一次性钥匙列表 —— 打印后锁在保险地方或存电子保险库;每个只能用一次。即便所有其他第二因子都丢失 / 损坏也不会被锁出。
NOTE

WebAuthn 之前可用 U2F —— 已有 U2F 仍可继续用 , 但服务器配好 WebAuthn 后建议切换。

14.6.2.域强制双因素

在添加 / 编辑认证域时从 TFA 下拉选一种。开启后 , 只有已配 TFA 的用户能登录。当前两种:

Time-based OATH(TOTP)

HMAC-SHA1 算法 , 当前时间与用户密钥散列。时间步长与密码长度可配。每用户可配多个密钥(空格分隔), Base32(RFC 3548)或十六进制。 PVE 自带 oathkeygen 生成 Base32 密钥 , 可直接用于 oathtool、 Android 的 Google Authenticator、 FreeOTP、 andOTP 等。

YubiKey OTP

需配 Yubico API ID、 API KEY、验证服务器 URL , 用户须有 YubiKey。 USB 插入后按一下 YubiKey , 复制输出的前 12 位填到用户 Key IDs。可用 YubiCloud 或自建验证服务器 —— 见官方文档。

14.6.3.双因素的限制与锁定

第二因子旨在保护密码泄露的场景 , 但仍可能被暴力破。为此 , 二因子失败次数过多会触发锁定。 TOTP:失败 8 次禁用用户的 TOTP 因子 —— 用 Recovery Key 登录即解锁;如 TOTP 是唯一因子 , 需管理员介入 , 强烈建议立刻要求用户改密码。 FIDO2 / WebAuthn / Recovery Keys:抗暴破性更好 , 上限 100 次;超过则所有第二因子锁定一小时。

管理员可在用户列表 UI 或命令行随时解锁:

pveum user tfa unlock joe@pve

14.6.4.用户配置 TOTP

用户可经用户列表 TFA 按钮开启 TOTP 或 WebAuthn(除非域强制 YubiKey OTP), 并始终可加一次性 Recovery Keys。

打开 TFA 窗口后可设 TOTP :Secret 为密钥 , Randomize 可随机生成;可选 Issuer Name 让 TOTP 应用显示密钥归属;用户名也包含在二维码中。生成后显示二维码 , 可被 FreeOTP 等识别。用户须输入当前密码(除非以 root 登录)与当前 OTP 值到 Verification Code 并按 Apply 验证。

14.6.5.TOTP

服务端无需配置 —— 手机装一个 TOTP 应用(如 FreeOTP), 然后在 PVE Web 界面添加 TOTP 因子即可。

14.6.6.WebAuthn

需两个前提:

  • 可信 HTTPS 证书(如 Let's Encrypt)。未信证书下可能工作 , 但部分浏览器会告警或拒绝。
  • 在 Datacenter → Options → WebAuthn Settings 配好 WebAuthn —— 多数情况可自动填充。

两者都满足后 , 在 Datacenter → Permissions → Two Factor 添加 WebAuthn 配置即可。

14.6.7.Recovery Keys

Recovery key 无需准备 —— 在 Datacenter → Permissions → Two Factor 直接创建一组即可。

NOTE

每个用户同时 只能存在一组 一次性 recovery keys。

14.6.8.服务端 WebAuthn 配置

要允许使用 WebAuthn, 须用有效域名 + 有效 SSL 证书 , 否则部分浏览器会告警甚至拒绝。

WARN

修改 WebAuthn 配置可能让已注册的 WebAuthn 全部失效!

配置经 /etc/pve/datacenter.cfg, 例如:

webauthn: rp=mypve.example.com,origin=https://mypve.example.com:8006,id=mypve.example.com

14.6.9.服务端 U2F 配置

NOTE

推荐改用 WebAuthn。

允许 U2F 亦需有效域名 + 有效 SSL, 先配 AppId。

WARN

修改 AppId 会让已有 U2F 注册 全部失效!

经 /etc/pve/datacenter.cfg:

u2f: appid=https://mypve.example.com:8006

单节点时 AppId 可直接是浏览器用的完整地址(含 https:// 与端口)。不同浏览器对 AppId 的匹配严格程度不同。多节点时最好另起一个 https 服务器提供 appid.json —— 兼容多数浏览器。若各节点同属一个顶级域子域 , 用 TLD 作 AppId 可能够用 , 但部分浏览器不接受。

NOTE

坏的 AppId 通常会报错 , 但也见过不报错的情形(如 Chromium 中节点经子域访问却用 TLD 作 AppId)。强烈建议多浏览器测试 —— 因为后期改 AppId 会让 U2F 注册全部失效。

14.6.10.用户激活 U2F

打开 TFA 窗口 U2F 页 , 输入当前密码(root 除外), 按 Register。服务器配置正确且浏览器接受 AppId 时会弹提示 —— 按下 U2F 设备按钮(YubiKey 的灯大约每秒闪两次)。 Firefox 用户可能要在 about:config 开 security.webauth.u2f 才能用 U2F。

14.7.权限管理Permission Management

执行操作(列举 / 修改 / 删除 VM 配置等)须有相应权限。 PVE 采用 基于角色与路径 的权限管理 —— 权限表中一条记录允许用户 / 组 / Token 在访问某对象 / 路径时承担特定角色。即 (path, user, role) / (path, group, role) / (path, token, role) 三元组 , 角色含允许动作集合 , path 是动作目标。

14.7.1.角色

角色即特权列表。 PVE 自带一组预定义角色 , 已能满足多数需求:

  • Administrator:完整权限
  • NoAccess:无权限(用于禁止访问)
  • PVEAdmin:可做大多数任务 , 但无权改系统设置(Sys.PowerMgmt、 Sys.Modify、 Realm.Allocate)与权限(Permissions.Modify)
  • PVEAuditor:只读
  • PVEDatastoreAdmin:建 / 分配备份空间与模板
  • PVEDatastoreUser:分配备份空间、查看存储
  • PVEMappingAdmin / PVEMappingUser:管理 / 查看并使用资源映射
  • PVEPoolAdmin / PVEPoolUser:分配 / 查看资源池
  • PVESDNAdmin / PVESDNUser:管理 SDN / 访问桥与 vnet
  • PVESysAdmin:审计、系统控制台、系统日志
  • PVETemplateUser:查看与克隆模板
  • PVEUserAdmin:管理用户
  • PVEVMAdmin:完整管理 VM
  • PVEVMUser:查看、备份、配 CD-ROM、 VM 控制台、 VM 电源

GUI 可查看全部预定义角色。也可在 GUI(Datacenter → Permissions → Roles → Create)或命令行加新角色:

pveum role add VM_Power-only  --privs "VM.PowerMgmt VM.Console"
pveum role add Sys_Power-only --privs "Sys.PowerMgmt Sys.Console"
NOTE

以 PVE 打头的角色都是内置 —— 自定义角色 不可使用 此前缀。

14.7.2.特权

特权是执行某特定动作的权利。特权归入角色管理 —— 不能直接把特权分配给用户 + 路径 , 必须通过角色。目前支持的特权:

节点 / 系统相关
  • Group.Allocate:创建 / 修改 / 删除组
  • Mapping.Audit:查看资源映射
  • Mapping.Modify:管理资源映射
  • Mapping.Use:使用资源映射
  • Permissions.Modify:修改访问权限
  • Pool.Allocate:创建 / 修改 / 删除资源池
  • Pool.Audit:查看资源池
  • Realm.AllocateUser:把用户分配给域
  • Realm.Allocate:创建 / 修改 / 删除认证域
  • SDN.Allocate:管理 SDN 配置
  • SDN.Audit:查看 SDN 配置
  • Sys.Audit:查看节点状态 / 配置、 Corosync 集群配置、 HA 配置
  • Sys.Console:节点控制台
  • Sys.Incoming:允许来自其他集群的入站数据流(实验性)
  • Sys.Modify:创建 / 修改 / 删除节点网络参数
  • Sys.PowerMgmt:节点电源(start / stop / reset / shutdown 等)
  • Sys.Syslog:查看 syslog
  • User.Modify:创建 / 修改 / 删除用户的访问与详情
虚拟机相关
  • SDN.Use:访问 SDN vnet 与本地网桥
  • VM.Allocate:在服务器上创建 / 删除 VM
  • VM.Audit:查看 VM 配置
  • VM.Backup:备份 / 恢复 VM
  • VM.Clone:克隆 / 复制 VM
  • VM.Config.CDROM:弹出 / 更换 CD-ROM
  • VM.Config.CPU:修改 CPU 设置
  • VM.Config.Cloudinit:修改 Cloud-init 参数
  • VM.Config.Disk:增 / 改 / 删盘
  • VM.Config.HWType:修改模拟硬件类型
  • VM.Config.Memory:修改内存设置
  • VM.Config.Network:增 / 改 / 删网卡
  • VM.Config.Options:修改其他 VM 配置
  • VM.Console:VM 控制台
  • VM.GuestAgent.Audit:发送只读型 QEMU guest agent 命令
  • VM.GuestAgent.FileRead:经 guest agent 读取客户机文件
  • VM.GuestAgent.FileSystemMgmt:经 guest agent freeze / thaw / trim
  • VM.GuestAgent.FileWrite:经 guest agent 写客户机文件
  • VM.GuestAgent.Unrestricted:任意 guest agent 命令
  • VM.Migrate:迁移 VM 到集群其他节点
  • VM.PowerMgmt:VM 电源
  • VM.Replicate:配置 / 运行客户机复制
  • VM.Snapshot.Rollback:回滚到快照
  • VM.Snapshot:创建 / 删除 VM 快照
存储相关
  • Datastore.Allocate:创建 / 修改 / 删除存储并删卷
  • Datastore.AllocateSpace:在存储上分配空间
  • Datastore.AllocateTemplate:分配 / 上传模板与 ISO
  • Datastore.Audit:查看 / 浏览存储
WARN

Permissions.Modify 与 Sys.Modify 须 谨慎使用 —— 它们允许修改系统危险或敏感配置。

NOTE

细读下节关于继承 , 以了解角色(与其特权)沿 ACL 树传播的方式。

14.7.3.对象与路径

权限赋给对象(VM、存储、资源池), 用类文件系统的路径寻址 —— 这些路径构成天然的树 , 上级(路径较短)的权限可选择性向下传播。

路径可以是模板化的 —— 当 API 调用要求模板化路径的权限时 , 路径可含对 API 参数的引用(花括号包围)。某些参数从 API URI 隐式取得 —— 例如调 /nodes/mynode/status 的权限路径 /nodes/{node} 对应 /nodes/mynode; PUT 到 /access/acl 中的 {path} 指该方法的 path 参数。常见例子:

  • /nodes/{node}:对 PVE 服务器的访问
  • /vms:所有 VM
  • /vms/{vmid}:特定 VM
  • /storage/{storeid}:特定存储
  • /pool/{poolname}:特定池里的资源
  • /access/groups:组管理
  • /access/realms/{realmid}:域管理
继承

对象路径构成树 , 权限可沿树向下继承(propagate 标志默认开)。继承规则:

  • 用户个人权限 总是覆盖 组权限。
  • 用户是某组成员时 , 该组权限生效。
  • 更深层权限覆盖继承而来的权限。
  • NoAccess 在给定路径上 抵消所有其他角色。

此外 , 分离权限的 Token 在任何路径上 都不会超过 其所属用户的权限。

14.7.4.池

池可聚合一组 VM 与存储 —— 只需在 /pool/{poolid} 设权限 , 其下所有成员自动继承 , 是简化 ACL 的利器。

14.7.5.我需要哪些权限?

每个 API 方法的所需权限都见 API Viewer。权限以列表表示 , 可读作 逻辑与访问检查函数的树:

["and", <subtests>...] / ["or", <subtests>...]
and 要求所有子项为真 , or 要求任意子项为真。
["perm", <path>, [<privileges>...], <options>...]
path 是模板化参数(见 §14.7.3)。必须在指定路径上 全部(或若用 any 选项则 任一)具备列出的特权。 require-param 选项表明即使该参数按 API schema 可选 , 此处也视作必需。
["userid-group", [<privileges>...], <options>...]
调用者必须在 /access/groups 上有任一列出的特权。视 groups_param 是否设置:
  • 设置了 :API 有非空 groups 参数 , 调用者须对所有列出的组具备任一特权。
  • 未设 :userid 参数指向的用户须存在 , 且所在组里调用者要有任一特权(通过 /access/groups/<group> 路径)。
["userid-param", "self"]
API 的 userid 参数须指向执行者本人 —— 常与 or 并用 , 让用户即便无高权限也能对自己操作。
["userid-param", "Realm.AllocateUser"]
用户需在 /access/realm/<realm> 有 Realm.AllocateUser, 其中 <realm> 指 userid 参数所属域。注意 :用户不必存在也能关联到域 , 因为用户 ID 以 <username>@<realm> 形式传入。
["perm-modify", <path>]
path 是模板化参数。需要 Permissions.Modify, 或视路径可替换为:
  • /storage/...:Datastore.Allocate
  • /vms/...:VM.Allocate
  • /pool/...:Pool.Allocate
path 为空时需 /access 上的 Permissions.Modify。无 Permissions.Modify 时 , 用户只能在给定路径 委派自身特权的子集(例如 PVEVMAdmin 可授予 PVEVMUser, 但不能授 PVEAdmin)。

14.8.命令行工具Command-line Tool

多数用户通过 GUI 管用户 , 但也有完整功能的命令行 pveum(Proxmox VE User Manager)。所有 PVE CLI 都是 REST API 的包装 —— 同样能力也可经 REST API 访问。常见示例:

pveum                            # 显示帮助
pveum help user add              # 具体子命令帮助
pveum user add testuser@pve -comment "Just a test"
pveum passwd testuser@pve        # 改密(并非所有域支持)
pveum user modify testuser@pve -enable 0
pveum group add testgroup
pveum role add PVE_Power-only -privs "VM.PowerMgmt VM.Console"

14.9.真实示例Real World Examples

14.9.1.管理员组

给一组用户以完整管理员权限(而不用 root):

pveum group add admin -comment "System Administrators"
pveum acl modify / -group admin -role Administrator
pveum user modify testuser@pve -group admin

14.9.2.审计员

把 PVEAuditor 赋给用户 / 组即只读。

pveum acl modify / -user joe@pve -role PVEAuditor       # joe 看所有
pveum acl modify /vms -user joe@pve -role PVEAuditor    # joe 看所有 VM

14.9.3.委派用户管理

把用户管理委派给 joe@pve:

pveum acl modify /access -user joe@pve -role PVEUserAdmin

joe@pve 现可增 / 删用户、改其他用户属性(含密码)。该角色很强 , 通常要进一步限制在指定域 / 组:

pveum acl modify /access/realm/pve -user joe@pve -role PVEUserAdmin
pveum acl modify /access/groups/customers -user joe@pve -role PVEUserAdmin
NOTE

这样 joe 只能在 pve 域内加入 / 管理属于 customers 组的用户。

14.9.4.监控用的受限 API Token

API Token 权限永远是所属用户权限的子集 —— Token 不能做用户做不了的事。用分离权限 Token 可进一步收紧。给 joe@pve 赋 PVEVMAdmin:

pveum acl modify /vms -user joe@pve -role PVEVMAdmin

再建一个只允查看 VM 信息(如监控)的分离权限 Token:

pveum user token add joe@pve monitoring -privsep 1
pveum acl modify /vms -token 'joe@pve!monitoring' -role PVEAuditor

查验用户与 Token 的权限:

pveum user permissions joe@pve
pveum user token permissions joe@pve monitoring

14.9.5.资源池

企业常按部门划分 , 希望给每部门分配资源并委派管理。假设要为软件开发部建池 —— 先建组:

pveum group add developers -comment "Our software developers"

创建属于该组的用户:

pveum user add developer1@pve -group developers -password
NOTE

-password 参数会提示输入密码。

为开发部建资源池:

pveum pool add dev-pool --comment "IT development pool"

对池授权:

pveum acl modify /pool/dev-pool/ -group developers -role PVEAdmin

开发者们现可管理分配到该池的资源。