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
- 所属组
- 可选过期日期
- 注释
- 启用 / 禁用标志
- 可选的双因素密钥
禁用 / 删除用户或过期时 , 该用户不能再建新会话 / 开新任务;但已启动的任务(如终端会话)不会被自动终止。
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 权限与所属用户一致。
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 监听端口。
要让某 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) - 监听端口。
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) - 进一步筛选。
过滤器可叠加匹配条件以缩小同步范围。 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。
含冒号或斜杠的用户名不可同步 —— 这是 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。
须确保用户在 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:一次性钥匙列表 —— 打印后锁在保险地方或存电子保险库;每个只能用一次。即便所有其他第二因子都丢失 / 损坏也不会被锁出。
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 直接创建一组即可。
每个用户同时 只能存在一组 一次性 recovery keys。
14.6.8.服务端 WebAuthn 配置
要允许使用 WebAuthn, 须用有效域名 + 有效 SSL 证书 , 否则部分浏览器会告警甚至拒绝。
修改 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 配置
推荐改用 WebAuthn。
允许 U2F 亦需有效域名 + 有效 SSL, 先配 AppId。
修改 AppId 会让已有 U2F 注册 全部失效!
经 /etc/pve/datacenter.cfg:
u2f: appid=https://mypve.example.com:8006
单节点时 AppId 可直接是浏览器用的完整地址(含 https:// 与端口)。不同浏览器对 AppId 的匹配严格程度不同。多节点时最好另起一个 https 服务器提供 appid.json —— 兼容多数浏览器。若各节点同属一个顶级域子域 , 用 TLD 作 AppId 可能够用 , 但部分浏览器不接受。
坏的 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"
以 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:查看 syslogUser.Modify:创建 / 修改 / 删除用户的访问与详情
虚拟机相关
SDN.Use:访问 SDN vnet 与本地网桥VM.Allocate:在服务器上创建 / 删除 VMVM.Audit:查看 VM 配置VM.Backup:备份 / 恢复 VMVM.Clone:克隆 / 复制 VMVM.Config.CDROM:弹出 / 更换 CD-ROMVM.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 / trimVM.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:分配 / 上传模板与 ISODatastore.Audit:查看 / 浏览存储
Permissions.Modify 与 Sys.Modify 须 谨慎使用 —— 它们允许修改系统危险或敏感配置。
细读下节关于继承 , 以了解角色(与其特权)沿 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>路径)。
- 设置了 :API 有非空
["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
/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
这样 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
-password 参数会提示输入密码。
为开发部建资源池:
pveum pool add dev-pool --comment "IT development pool"
对池授权:
pveum acl modify /pool/dev-pool/ -group developers -role PVEAdmin
开发者们现可管理分配到该池的资源。