{pve}支持多种认证源,例如Linux PAM、一个集成的Proxmox VE认证服务器、LDAP、Microsoft Active Directory和OpenID Connect。

通过对所有对象(虚拟机、存储、节点等)使用基于角色的用户和权限管理,可以定义细粒度的访问权限。

用户

'{pve} 存储用户属性在 /etc/pve/user.cfg 中。密码不会被存储在这里;用户被关联到下面描述的身份验证领域。因此,一个用户通常以他们的用户名和领域的形式内部识别,即 <userid>@<realm>'

此文件中的每个用户条目包含以下信息:

  • 姓氏

  • 姓氏

  • 电子邮件地址

  • 群组成员身份

  • 一个可选的过期日期

  • 关于这个用户的评论或备注

  • 这个用户是启用还是禁用

  • 可选的双因素认证密钥

Caution
当您停用或删除一个用户,或者设置的到期日期已过,此用户将无法登录新会话或启动新任务。所有已经由该用户启动的任务(例如,终端会话)将不会由于任何此类事件自动终止。

系统管理员

系统的根用户始终可以通过Linux PAM领域登录,并且是一个不受限制的管理员。这个用户不能被删除,但是属性仍然可以被修改。系统邮件将会发送到分配给该用户的电子邮件地址。

群组

每个用户可以成为几个群组的成员。群组是组织访问权限的首选方式。你应该始终授予权限给群组而不是个别用户。那样你将得到一个更易于维护的访问控制列表。

API 令牌

API令牌允许从其他系统、软件或API客户端以无状态的方式访问REST API的大部分区域。令牌可以为单个用户生成,并可以被赋予单独的权限和到期日期,以限制访问的范围和持续时间。如果API令牌被泄露,可以撤销它而不禁用用户本身。

API 令牌有两种基本类型:

  • 分离权限:令牌需要通过ACLs被显式地授予访问权限。其有效权限是通过计算用户权限和令牌权限的交集得出的。

  • 完全权限:令牌的权限与关联用户的权限相同。

Caution
令牌值仅在生成令牌时显示/返回一次。稍后通过API不能再次检索它!

要使用API令牌,请在进行API请求时将HTTP头’Authorization’设置为表单`PVEAPIToken=USER@REALM!TOKENID=UUID`显示的值,或参阅您的API客户端文档。

资源池

资源池是一组虚拟机、容器和存储设备的集合。在某些用户应受控制地访问特定资源集的情况下,资源池对于权限处理非常有用,因为它允许对一组元素应用单一权限,而不是必须对每个资源单独管理权限。资源池经常与组结合使用,以便组的成员对一组机器和存储有权限。

认证领域

由于{pve}用户只是某些外部领域中存在的用户的对应方,因此必须在`/etc/pve/domains.cfg`中配置这些领域。以下领域(认证方法)可用:

Linux PAM 标准认证

Linux PAM 是一个用于系统级用户认证的框架。这些用户是通过如 adduser 等命令在宿主系统上创建的。如果 PAM 用户在 {pve} 宿主系统上存在,相应的条目可以添加到 {pve} 中,以允许这些用户通过他们的系统用户名和密码登录。

{pve} 认证服务器

这是一个类Unix密码存储方式,它将哈希密码存储在`/etc/pve/priv/shadow.cfg`中。密码使用SHA-256哈希算法进行哈希处理。对于小规模(甚至中等规模)的安装来说,这是最方便的范围,用户不需要访问{pve}之外的任何东西。在这种情况下,用户完全由{pve}管理,并且能够通过GUI更改自己的密码。

轻量级目录访问协议

LDAP(轻量级目录访问协议)是一个开放的、跨平台的协议,用于使用目录服务进行认证。OpenLDAP是LDAP协议的一个流行的开源实现。

微软活动目录(AD)

Microsoft Active Directory (AD) 是 Windows 域网络的目录服务,并且被支持作为 {pve} 的认证领域。它支持 LDAP 作为认证协议。

OpenID Connect

OpenID Connect是作为一个身份层实现在OATH 2.0协议之上的。它允许客户端基于外部授权服务器执行的认证来验证用户的身份。

Linux PAM 标准认证

由于Linux PAM对应于主机系统用户,因此必须在每个允许用户登录的节点上存在一个系统用户。用户使用他们通常的系统密码进行认证。这个领域是默认添加的,不能被移除。在可配置性方面,管理员可以选择要求从该领域登录的双因素认证,并将该领域设置为默认的认证领域。

{pve} 认证服务器

{pve} 认证服务器领域是一个简单的类Unix密码存储。该领域默认会被创建,与Linux PAM一样,唯一可配置的项目是要求领域的用户使用双因素认证,并将其设置为登录的默认领域。

与其他{pve}领域类型不同,用户完全通过{pve}创建和验证,而不是针对另一个系统进行验证。因此,在创建此类型的用户时,您需要为其设置密码。

轻量级目录访问协议

您也可以使用外部LDAP服务器进行用户认证(例如,OpenLDAP)。在这种领域类型中,用户会在“基础域名”(base_dn)下被搜索,使用在“用户属性名”(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: This is the first test user.

''基础域名为`ou=People,dc=ldap-test,dc=com`,用户属性为`uid`。''

如果 {pve} 需要在能够查询和认证用户之前认证(绑定)到LDAP服务器,可以通过 /etc/pve/domains.cfg 文件中的 bind_dn 属性配置绑定域名。然后,其密码必须存储在 /etc/pve/priv/ldap/<realmname>.pw 中(例如,/etc/pve/priv/ldap/my-ldap.pw)。这个文件应该包含一个单行的原始密码。

要验证证书,你需要设置`capath`。你可以直接将其设置为你的LDAP服务器的CA证书,或者设置为包含所有受信任CA证书的系统路径(/etc/ssl/certs)。此外,你还需要设置`verify`选项,这也可以通过Web界面完成。

LDAP服务器领域的主要配置选项如下:

  • "Realm (realm): {pve} 用户的域标识符"

  • 基础域名` (base_dn): 用户搜索所在的目录

  • User Attribute Name` (user_attr): 该LDAP属性包含用户将用以登录的用户名

  • Server` (server1): 托管LDAP目录的服务器

  • Fallback Server```(```server2```): 主服务器不可达时的可选备用服务器地址

  • Port` (port): LDAP服务器监听的端口

Note
为了允许特定用户使用LDAP服务器进行认证,您还必须从{pve}服务器将他们作为该领域的用户添加进去。这可以通过同步自动完成。

微软活动目录(AD)

要将Microsoft AD设置为一个领域,需要指定服务器地址和认证域。活动目录支持大多数与LDAP相同的属性,例如可选的后备服务器、端口和SSL加密。此外,配置后,可以通过同步操作自动将用户添加到{pve}。

就像LDAP一样,如果 {pve} 需要在绑定到AD服务器之前进行认证,你必须配置 Bind User (bind_dn) 属性。这个属性通常是Microsoft AD默认要求的。

Microsoft Active Directory的主要配置设置是:

  • "Realm (realm): {pve} 用户的域标识符"

  • Domain` (domain): 服务器的AD域

  • Server` (server1): 服务器的完全限定域名或IP地址

  • Fallback Server```(```server2```): 主服务器不可达时的可选备用服务器地址

  • Port` (port): Microsoft AD服务器监听的端口

Note
Microsoft AD通常不区分大小写地检查诸如用户名之类的值。要让{pve}也做到这一点,您可以通过编辑Web界面中的领域或使用CLI(将`ID`替换为领域ID)来禁用默认的`case-sensitive`选项:`pveum realm modify ID --case-sensitive 0

同步基于LDAP的域

可以自动同步基于LDAP的领域(LDAP和Microsoft Active Directory)的用户和组,而不必手动将它们添加到{pve}中。您可以从网页界面的`认证`面板的添加/编辑窗口访问同步选项,或通过`pveum realm add/modify`命令访问。然后,您可以从GUI的`认证`面板执行同步操作,或使用以下命令:

pveum realm sync <realm>

用户和组被同步到集群范围的配置文件`/etc/pve/user.cfg`中。

属性转换为属性

如果同步响应包括用户属性,它们将被同步到`user.cfg`中匹配的用户属性中。例如:firstnamelastname

如果属性的名称与{pve}属性不匹配,您可以通过使用`sync_attributes`选项在配置中设置自定义字段到字段的映射。

如果某些属性消失了,如何处理这些属性可以通过同步选项进行控制,请参见下文。

同步配置

同步基于LDAP的领域的配置选项可以在添加/编辑窗口的`Sync Options`选项卡中找到。

配置选项如下:

  • Bind User` (bind_dn): 指的是用于查询用户和组的LDAP账户。这个账户需要访问所有需要的条目。如果设置了此账户,搜索将通过绑定来进行;否则,搜索将匿名进行。用户必须是一个完整的LDAP格式的可区分名称(DN),例如,cn=admin,dc=example,dc=com

  • 组名属性(group_name_attr):代表用户的组。只有符合`user.cfg`常见字符限制的条目会被同步。为了避免命名冲突,组名会以`-$realm`的形式附加在名称上进行同步。请确保同步操作不会覆盖手工创建的组。

  • User classes` (user_classes): 与用户关联的对象类。

  • Group classes` (group_classes): 与组关联的对象类别。

  • E-Mail属性`:如果基于LDAP的服务器指定了用户电子邮件地址,通过在此处设置关联属性也可以将这些邮件地址包含在同步过程中。从命令行,这可以通过`--sync_attributes`参数实现。

  • 用户过滤` (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): 删除在同步响应中未返回的用户和组的ACL。这通常与`Entry`一起使用时最为合理。

    • Entry`(entry):当它们在同步响应中未被返回时,移除条目(即用户和群组)。

    • Properties` (properties): 当同步响应中的用户不包含那些属性时,移除条目的属性。这包括所有属性,即使是那些从未被同步设置的属性。例外是令牌和启用标志,即使启用此选项,这些也将被保留。

  • Preview` (dry-run): 不会将数据写入配置中。如果您想看到哪些用户和群组将被同步到`user.cfg`,这非常有用。

保留字符

某些字符是保留的(参见https://www.ietf.org/rfc/rfc2253.txt[RFC2253])并且如果没有被适当地转义,在DNs的属性值中不能被轻易使用。

需要转义的字符有:

  • 在开头或结尾处的空格

  • 在开头处的井号 (#)

  • 逗号(,

  • 加号 (+)

  • 双引号("

  • 正斜杠 (/)

  • 尖括号 (<>)

  • 分号 (;)

  • 等号 (=)

要在DNs中使用这样的字符,请用双引号包围属性值。例如,要绑定一个CN(通用名称)为`Example, User`的用户,使用`CN="Example, User",OU=people,DC=example,DC=com`作为`bind_dn`的值。

这适用于`base_dn`、`bind_dn`和`group_dn`属性。

Note
包含冒号和正斜杠的用户无法同步,因为这些是用户名中的保留字符。

OpenID Connect

主要的OpenID Connect配置选项包括:

  • Issuer URL` (issuer-url):这是授权服务器的URL。Proxmox使用OpenID Connect发现协议来自动配置进一步的细节。

    虽然可以使用未加密的`http://` URL,但我们强烈建议使用加密的`https://`连接。

  • "Realm (realm): {pve} 用户的域标识符"

  • 客户端ID(client-id):OpenID客户端ID。

  • 客户端密钥(client-key):可选的OpenID客户端密钥。

  • Autocreate Users` (autocreate): 如果用户不存在,将自动创建用户。虽然在OpenID服务器上完成认证,但所有用户仍需在{pve}用户配置中有一个条目。您可以手动添加它们,或使用`autocreate`选项自动添加新用户。

  • Username Claim` (username-claim): 用于生成唯一用户名(subjectusernameemail)的 OpenID 声明。

用户名映射

OpenID Connect规范定义了一个独特的属性(在OpenID术语中称为“声明”), 名为`subject`。默认情况下,我们使用这个属性的值来生成{pve}用户名,方法是简单地添加`@和领域名:${subject}@${realm}`。

不幸的是,大多数OpenID服务器使用随机字符串作为`subject`,例如`DGH76OKH34BNG3245SB`,因此一个典型的用户名看起来像是`DGH76OKH34BNG3245SB@yourrealm`。虽然这是独一无二的,但人类很难记住这些随机字符串,使得将真实用户与此关联变得几乎不可能。

username-claim` 设置允许您使用其他属性进行用户名映射。如果 OpenID Connect 服务器提供该属性并保证其唯一性,则建议将其设置为 username

另一个选项是使用`email`,这也会产生便于人类阅读的用户名。再次强调,只有在服务器保证这一属性的唯一性时,才使用这个设置。

案例

这是使用Google创建OpenID域的一个例子。你需要用来自你的Google OpenID设置的值替换`--client-id`和`--client-key`。

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

上述命令使用了 --username-claim email,因此在{pve}侧面的用户名看起来像是 example.user@google.com@myrealm1

Keycloak (https://www.keycloak.org/) 是一个受欢迎的开源身份和访问管理工具,支持 OpenID Connect。在下面的示例中,你需要用你的信息替换 --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 可以在 {pve} 侧启用简单用户名,如 example.user@myrealm2

Warning
你需要确保用户不能自行编辑用户名设置(在Keycloak服务器上)。

双因素认证

有两种方法可以使用双因素认证:

认证领域可能要求通过’TOTP'(基于时间的一次性密码)或’YubiKey OTP’进行认证。在这种情况下,新创建的用户需要立即添加他们的密钥,因为没有第二因素就无法登录。在’TOTP’的情况下,用户稍后也可以更改’TOTP',前提是他们首先能够登录。

或者,用户可以选择稍后再开启两步验证,即使域名没有强制执行。

可用的第二因素

你可以设置多个二次验证因素,以避免丢失智能手机或安全密钥导致你永久无法访问你的账户的情形。

除了领域强制执行的TOTP和YubiKey OTP外,还可用以下两因素认证方法:

在支持WebAuthn之前,用户可以设置U2F。现有的U2F因素仍然可以使用,但建议一旦在服务器上配置了WebAuthn,就切换到WebAuthn。

领域强制双因素认证

这可以通过在添加或编辑认证领域时,通过’TFA’下拉框选择一个可用的方法来完成。当一个领域启用了双因素认证(TFA)后,它变成一个要求,只有配置了双因素认证的用户才能登录。

目前有两种可用的方法:

基于时间的一次性密码算法 (TOTP)

这使用标准的HMAC-SHA1算法,其中当前时间与用户配置的密钥一起进行哈希处理。时间步长和密码长度参数是可配置的。

一个用户可以配置多个密钥(通过空格分隔),并且密钥可以用Base32(RFC3548)或十六进制表示法指定。

{pve} 提供了一个密钥生成工具(oathkeygen),它以 Base32 符号形式输出一个随机密钥,可以直接用于各种 OTP 工具,如命令行工具 oathtool,或 Android 的 Google Authenticator、FreeOTP、andOTP 或类似应用程序。

YubiKey 动态密码

通过YubiKey进行认证,必须配置Yubico API ID、API KEY和验证服务器URL,并且用户必须有一个YubiKey可用。为了从YubiKey获取密钥ID,可以在通过USB连接YubiKey后触发一次YubiKey,并将输入密码的前12个字符复制到用户的’Key IDs’字段中。

请参考[YubiKey OTP]文档了解如何使用[YubiCloud]或者[托管您自己的验证服务器]。

两因素认证的限制和锁定

第二因素的目的是在用户的密码被泄露或猜出时保护用户。然而,一些因素仍可能被蛮力破解。因此,如果第二因素登录尝试失败次数过多,用户将被锁定。

对于TOTP,8次失败的尝试将会禁用用户的TOTP因素。它们在用恢复密钥登录时被解锁。如果TOTP是唯一可用的因素,需要管理员介入,并且强烈推荐要求用户立即更改密码。

由于FIDO2/Webauthn和恢复密钥对暴力攻击的抵抗性较强,因此那里的尝试次数限制更高(100次),但是当超出限制时,所有的第二因素都会被阻止一小时。

管理员可以随时通过用户界面中的用户列表或命令行解锁用户的双因素认证:

 pveum user tfa unlock joe@pve

用户配置的TOTP身份验证

用户可以选择通过用户列表中的“TFA”按钮,在登录时启用“TOTP”或“WebAuthn”作为第二重验证因素(除非领域强制执行“YubiKey OTP”)。

用户始终可以添加并使用一次性的“恢复密钥”。

在打开’TFA’窗口后,用户将看到一个对话框来设置’TOTP’认证。'Secret’字段包含密钥,可以通过’Randomize’按钮随机生成。可以添加一个可选的’Issuer Name’以提供信息给’TOTP’应用,说明密钥属于什么。大多数’TOTP’应用会显示发行者名称以及相应的’OTP’值。用户名也包含在’TOTP’应用的二维码中。

生成密钥后,将会显示一个二维码,该二维码可以与大多数OTP应用程序(如FreeOTP)一起使用。用户然后需要验证当前用户密码(除非作为‘root’登录),以及正确使用‘TOTP’密钥的能力,通过在‘验证码’字段中输入当前的‘OTP’值并按下‘应用’按钮来完成。

基于时间的一次性密码

不需要任何服务器设置。只需在您的智能手机上安装一个TOTP应用程序(例如,https://freeotp.github.io/[FreeOTP]),然后使用Proxmox Backup Server网络界面添加TOTP因素即可。

WebAuthn

为了WebAuthn能够工作,你需要有两样东西:

  • 一个受信任的HTTPS证书(例如,通过使用https://pve.proxmox.com/wiki/Certificate_Management[Let’s Encrypt])。虽然使用不受信任的证书可能也能工作,但如果证书不受信任,一些浏览器可能会发出警告或拒绝WebAuthn操作。

  • 设置WebAuthn配置(请在Proxmox VE网页接口中查看*Datacenter → Options → WebAuthn Settings*)。在大多数设置中,这可以自动填充。

一旦您满足了这两个要求,您就可以在*数据中心 → 权限 → 两步验证*下的*两步验证*面板中添加一个WebAuthn配置。

恢复密钥

恢复密钥代码不需要任何准备;你可以简单地在*数据中心 → 权限 → 两步验证*下的*两步验证*面板中创建一组恢复密钥。

Note
在任何时候,每个用户只能有一组一次性使用的恢复密钥。

服务端Webauthn配置

要允许用户使用’WebAuthn’身份验证,必须使用一个有效的域名和有效的SSL证书,否则一些浏览器可能会发出警告或完全拒绝认证。

Note
修改’WebAuthn’配置可能会使所有现有的’WebAuthn’注册变得无法使用!

这是通过 /etc/pve/datacenter.cfg 完成的。例如:

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

服务器端U2F配置

Note
建议使用WebAuthn代替。

要允许用户使用’U2F’验证,可能需要使用一个有效的域名和有效的SSL证书,否则,某些浏览器可能会显示警告或完全拒绝U2F的使用。最初,需要配置一个’AppId' 脚注:[AppId https://developers.yubico.com/U2F/App_ID.html]。

Note
更改’AppId’将导致所有现有的’U2F’注册变得无法使用!

这是通过 /etc/pve/datacenter.cfg 完成的。例如:

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

对于单个节点,AppId 可以简单地是Web接口的地址,就像在浏览器中使用的那样,包括 https:// 和端口号,如上所示。请注意,某些浏览器在匹配 AppIds 时可能比其他浏览器更严格。

当使用多个节点时,最好有一个单独的 https 服务器提供一个 appid.json 文件,文件脚注为[多面应用程序: https://developers.yubico.com/U2F/App_ID.html],因为这似乎与大多数浏览器兼容。如果所有节点使用同一顶级域名的子域名,使用TLD作为’AppId’可能就足够了。但应该注意,有些浏览器可能不接受这种做法。

Note
一个错误的’AppId’通常会导致错误,但我们遇到过这种情况不会发生的情况,尤其是在使用顶级域名’AppId’作为通过子域名在Chromium中访问的节点时。因此,建议使用多种浏览器测试配置,因为稍后更改’AppId’将使现有的’U2F’注册无法使用。

激活用户的U2F

要启用“U2F”身份验证,请打开“TFA”窗口的“U2F”选项卡,输入当前密码(除非以root身份登录),然后按“注册”按钮。如果服务器设置正确且浏览器接受服务器提供的“AppId”,将出现一条消息提示用户按下“U2F”设备上的按钮(如果是“YubiKey”,按钮灯应该稳定地开关切换,大约每秒两次)。

Firefox 用户可能需要在 about:config 中启用 security.webauth.u2f 之后才能使用 U2F 令牌。

权限管理

为了让用户执行操作(比如列出、修改或删除虚拟机配置的某些部分),用户需要具备相应的权限。

{pve} 使用基于角色和路径的权限管理系统。权限表中的一个条目允许用户、组或令牌在访问“对象”或“路径”时扮演特定的角色。这意味着,这样的访问规则可以表示为“(路径,用户,角色)”、“(路径,组,角色)”或“(路径,令牌,角色)”的三元组,其中角色包含一组允许的操作,而路径代表这些操作的目标。

角色

角色就是一系列权限的列表。Proxmox VE附带了许多预定义的角色,这些角色能满足大多数需求。

  • Administrator`: 拥有全部权限

  • NoAccess`:没有权限(用来禁止访问)

  • PVEAdmin`:可以执行大多数任务,但没有权限修改系统设置(Sys.PowerMgmtSys.ModifyRealm.Allocate)或权限(Permissions.Modify

  • PVEAuditor`:具有只读访问权限

  • 'PVEDatastoreAdmin:创建和分配备份空间及模板'''

  • PVEDatastoreUser`: 分配备份空间和查看存储

  • PVEMappingAdmin`:管理资源映射

  • PVEMappingUser`: 查看和使用资源映射

  • PVEPoolAdmin`: 分配池

  • PVEPoolUser`: 查看池子

  • PVESDNAdmin`:管理SDN配置

  • PVESDNUser`:访问桥接/虚拟网络

  • PVESysAdmin`:审计,系统控制台和系统日志

  • PVETemplateUser`:浏览和克隆模板

  • PVEUserAdmin`: 管理用户

  • PVEVMAdmin`:完全管理虚拟机

  • PVEVMUser`:查看、备份、配置 CD-ROM、VM 控制台、VM 电源管理

您可以在图形用户界面中查看全部预定义的角色。

你可以通过图形用户界面或命令行添加新角色。

从图形用户界面(GUI),导航到“数据中心(Datacenter)”下“权限 → 角色(Roles)”标签,并点击“创建(Create)”按钮。在那里,您可以设置一个角色名称,并从“权限(Privileges)”下拉菜单中选择任何所需的权限。

要通过命令行添加角色,您可以使用’pveum' CLI工具,例如:

pveum role add VM_Power-only --privs "VM.PowerMgmt VM.Console"
pveum role add Sys_Power-only --privs "Sys.PowerMgmt Sys.Console"
Note
以`PVE`开头的角色始终是内置的,不允许自定义角色使用这个保留前缀。

权限

特权是执行特定操作的权利。为了简化管理,特权列表被分组到角色中,然后可以在权限表中使用。请注意,特权不能直接分配给用户和路径,除非它们是角色的一部分。

我们目前支持以下权限:

节点/系统相关权限
  • 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`: 节点电源管理(启动,停止,重置,关机,…​)

  • Sys.Syslog`:查看系统日志

  • User.Modify`:创建/修改/移除用户访问权限和详细信息。

虚拟机相关权限
  • SDN.Use`:访问SDN虚拟网络和本地网络桥

  • VM.Allocate`:在服务器上创建/删除虚拟机

  • VM.Audit`:查看虚拟机配置

  • VM.Backup`:备份/恢复虚拟机

  • VM.Clone`: 克隆/复制一个虚拟机

  • 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.Migrate`:将虚拟机迁移到集群上的另一台服务器

  • VM.Monitor`:访问虚拟机监控器(kvm)

  • VM.PowerMgmt`:电源管理(启动,停止,重置,关机,…​)

  • VM.Snapshot.Rollback`:将虚拟机回滚到其某个快照状态

  • VM.Snapshot`: 创建/删除 VM 快照

存储相关权限
  • Datastore.Allocate`:创建/修改/删除数据存储并删除卷

  • Datastore.AllocateSpace`:在数据存储上分配空间

  • Datastore.AllocateTemplate`:分配/上传模板和ISO镜像

  • Datastore.Audit`:查看/浏览数据存储

Warning
Permissions.Modify`和`Sys.Modify`应当小心处理,因为它们允许修改系统及其配置的一些危险或敏感的方面。
Warning
仔细阅读下面有关继承的章节,以理解分配的角色(及其权限)是如何沿着ACL树传播的。

对象和路径

访问权限被分配给例如虚拟机、存储或资源池等对象。我们使用类文件系统的路径来定位这些对象。这些路径形成了一个自然的树结构,而且高层级的权限(更短的路径)可以可选地在这个层次结构中向下传播。

路径可以是模板化的。当一个API调用需要对模板路径的权限时,该路径可能包含对API调用参数的引用。这些引用在大括号中指定。有些参数是隐式地从API调用的URI中取得的。例如,在调用'/nodes/mynode/status’时,权限路径`/nodes/{node}需要对/nodes/mynode`的权限,而在对`/access/acl`发起PUT请求时,路径`{path}`指的是方法的`path`参数。

一些例子包括:

  • /nodes/{node}`: 访问 {pve} 服务器机器

  • /vms`:涵盖所有虚拟机

  • /vms/{vmid}`: 访问特定的虚拟机

  • /storage/{storeid}```: 访问特定的存储空间

  • /pool/{poolname}```: 访问包含在特定pool中的资源

  • /access/groups`:群组管理

  • /access/realms/{realmid}`:对领域的行政访问权限

继承

如前所述,对象路径形成了一个类似文件系统的树,而权限可以通过这棵树向下传递给对象(默认情况下会设置传播标志)。我们使用以下继承规则:

  • 单个用户的权限总是替换组权限。

  • 用户属于某个组时,组的权限设置对该用户生效。

  • 更深层级的权限会替换从上一级继承的权限。

  • NoAccess`会取消给定路径上的所有其他角色。

此外,权限隔离的令牌永远不能拥有其关联用户在任何给定路径上没有的权限。

游泳池

资源池可以用来对一组虚拟机和数据存储进行分组。然后,你可以简单地对资源池(/pool/{poolid})设置权限,这些权限会被所有资源池成员继承。这是简化访问控制的一个好方法。

我需要哪些权限?

所需的API权限为每个单独的方法记录,并可在 https://pve.proxmox.com/pve-docs/api-viewer/ 找到。

权限被指定为一个列表,可以解释为逻辑和访问检查函数的树:

["and", <subtests>…​]` 和 `["or", <subtests>…​]

当前列表中的每个(and)或任何(or)进一步元素必须为真。

["perm", <path>, [ <privileges>…​ ], <options>…​]

'path 是一个模板化参数(参见 对象和路径)。在指定路径上,必须允许所有列出的权限(或者,如果使用了 any 选项,任何权限)。如果指定了 require-param 选项,则即使 API 调用的架构将其列为可选,也必须要求其指定参数。'

["userid-group", [ <privileges>…​ ], <options>…​]

调用者必须拥有`/access/groups`上的任一列出的权限。此外,根据是否设置了`groups_param`选项,有两种可能的检查:

  • groups_param`已设置:API调用包含一个非可选的`groups`参数,调用者必须拥有列出的所有组中的任何列出的权限。

  • groups_param`未设置:通过`userid`参数传递的用户必须存在,并且属于调用者拥有任何列出权限的组(通过`/access/groups/<group>`路径)。

["userid-param", "self"]

API调用中`userid`参数的值必须指向执行该操作的用户(通常与`or`结合使用,以允许用户对自己执行操作,即使他们没有提升的权限)。

["userid-param", "Realm.AllocateUser"]

用户需要 Realm.AllocateUser 访问权限于 /access/realm/<realm>,其中 <realm> 指向通过 userid 参数传递的用户的领域。注意,用户不需要存在就能与一个领域关联,因为用户 ID 是以 <username>@<realm> 的形式传递的。

["perm-modify", <path>]

path`是一个模板参数(见对象和路径)。用户需要`Permissions.Modify`权限或者,根据路径的不同,以下权限可能作为替代:

  • /storage/…​`: requires 'Datastore.Allocate

  • /vms/…​`: 需要 `VM.Allocate

  • /pool/…​`: 需要 `Pool.Allocate

    如果路径为空,则需要对`/access`具有`Permissions.Modify`权限。

    如果用户没有`Permissions.Modify`权限,他们只能在给定的路径上委托自己权限的子集(例如,拥有`PVEVMAdmin`权限的用户可以分配`PVEVMUser`,但不能分配`PVEAdmin`)。

命令行工具

大多数用户将使用GUI来管理用户。但还有一个功能齐全的命令行工具称为`pveum`(简称`Proxmox VE User Manager`)。请注意,所有Proxmox VE命令行工具都是围绕API的包装器,因此您也可以通过REST API访问这些功能。

这里有一些简单的使用示例。要显示帮助,请输入:

对不起,"pveum"似乎不是一个有意义的词汇或者是拼写错误,无法进行翻译。

或者(显示有关特定命令的详细帮助)

帮助用户添加

创建一个新用户:

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"

真实世界例子

管理员组

可能有管理员想创建一个拥有完整管理员权限的用户组(而不使用root账户)。

要做到这一点,首先定义组:

pveum group add admin -comment "System Administrators"

然后分配角色:

pveum acl modify / -group admin -role Administrator

最后,你能够将用户添加到新的’admin’群组:

pveum user modify testuser@pve -group admin

审计员

你可以通过给用户或群组分配`PVEAuditor`角色来赋予他们只读访问权限。

示例 1: 允许用户 joe@pve 查看所有内容

pveum acl modify / -user joe@pve -role PVEAuditor

示例 2: 允许用户 joe@pve 查看所有虚拟机

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

委托用户管理

如果你想要将用户管理权限委托给用户 joe@pve,你可以通过以下方式来实现:

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

用户 joe@pve 现在可以添加和删除用户,以及更改其他用户属性,例如密码。这是一个非常强大的角色,你很可能希望将其限制在选定的领域和群组中。以下示例允许 joe@pve 修改领域 pve 内的用户,如果他们是群组 customers 的成员的话:

 pveum acl modify /access/realm/pve -user joe@pve -role PVEUserAdmin
 pveum acl modify /access/groups/customers -user joe@pve -role PVEUserAdmin
Note
用户可以添加其他用户,但前提是他们必须是`customers`组的成员并且属于`pve`领域。

用于监控的有限API令牌

API 令牌的权限始终是其对应用户权限的子集,这意味着 API 令牌不能用于执行后备用户没有权限执行的任务。本节将演示如何使用具有独立权限的 API 令牌,以进一步限制令牌所有者的权限。

给用户`joe@pve`在所有虚拟机上赋予PVEVMAdmin角色:

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

添加一个具有单独权限的新API令牌,该令牌只允许查看虚拟机信息(例如,用于监控目的):

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

验证用户和令牌的权限:

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

资源池

企业通常被结构划分为几个较小的部门,通常你会希望为每个部门分配资源并委派管理任务。假设你想为软件开发部门建立一个资源池。首先,创建一个组:

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

我们的软件开发人员现在可以管理分配给那个池的资源了。