Proxmox VE支持多种身份验证源,例如 Linux PAM,集成的Proxmox VE身份验证服务器,LDAP,Microsoft Active Directory。

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

14.1、用户

Proxmox VE将用户属性存储在/etc/pve/user.cfg中。 密码未存储在此处,而是将用户与以下所述的身份验证领域相关联。 因此,内部经常通过名称和领域来标识用户,形式为@

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

  • 名字
  • 电子邮件地址
  • 组成员
  • 可选的到期日期
  • 关于此用户的评论或注释
  • 此用户是启用还是禁用
  • 可选的两因素身份验证密钥

14.1.1、系统管理员

系统的root用户始终可以通过Linux PAM领域登录,并且是不受限制的管理员。 无法删除该用户,但仍可以更改属性,系统邮件将发送到分配给该用户的电子邮件地址。

14.2、组

每个用户可以是多个组的成员。 组是组织访问权限的首选方式。 您应该始终将权限授予组,而不要使用单个用户。 这样,您将获得更短的访问控制列表,更易于处理。

14.3、API 令牌

API令牌允许其他系统,软件或API客户端对REST API的大部分进行无状态访问。 可以为单个用户生成令牌,并且可以为令牌分配单独的权限和到期日期,以限制访问的范围和持续时间。 如果API令牌遭到破坏,则可以在不禁用用户本身的情况下将其撤消。

API令牌有两种基本类型:

  • 分离的特权:令牌需要使用ACL进行显式访问,其有效权限是通过与用户和令牌权限相交来计算的。
  • 完全特权:令牌权限与关联用户的权限相同。
    1. 警告
    2. 生成令牌时,令牌值仅显示/返回一次。 以后无法通过API再次检索!

要使用API令牌,请在发出API请求时将HTTP标头授权设置为PVEAPIToken = USER @ REALM!TOKENID = UUID形式的显示值,或参考您的API客户端文档。

14.4、身份验证领域

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

Linux PAM标准认证
在这种情况下,系统用户必须存在于允许该用户登录的所有节点上(例如,通过adduser命令创建),并且该用户使用其通常的系统密码进行身份验证。

  1. useradd heinz
  2. passwd heinz
  3. groupadd watchman
  4. usermod -a -G watchman heinz

Proxmox VE认证服务器
这是一个类似密码存储(/etc/pve/priv/shadow.cfg)的Unix。 使用SHA-256哈希方法对密码进行加密。 对于用户不需要访问Proxmox VE以外的任何内容的小型(甚至中型)安装,这是最方便的方法。 在这种情况下,用户将由Proxmox VE完全管理,并能够通过GUI更改自己的密码。

LDAP
可以通过LDAP服务器(例如openldap)对用户进行身份验证。 可以配置服务器和可选的回退服务器,并且可以通过SSL加密连接。

在基本域名(base_dn)下搜索用户,并在用户属性名称(user_attr)字段中指定的属性中找到用户名。

例如,如果通过以下ldif数据集表示用户:

  1. # user1 of People at ldap-test.com
  2. dn: uid=user1,ou=People,dc=ldap-test,dc=com
  3. objectClass: top
  4. objectClass: person
  5. objectClass: organizationalPerson
  6. objectClass: inetOrgPerson
  7. uid: user1
  8. cn: Test User 1
  9. sn: Testers
  10. description: This is the first test user.

基本域名将是ou = People,dc = ldap-test,dc = com,用户属性将是uid。

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

要验证证书,您需要设置能力。 您可以将其直接设置为LDAP服务器的CA证书,也可以设置为包含所有受信任CA证书(/ etc / ssl / certs)的系统路径。 此外,您需要设置验证选项,也可以通过Web界面进行设置。

微软AD
需要指定服务器和认证域。 与ldap一样,可以配置可选的回退服务器,可选的端口和SSL加密。

14.4.1、同步基于LDAP的领域

image.png

可以为基于LDAP的领域同步用户和组。 您可以使用CLI命令

pveum realm sync <realm>

或在GUI的“身份验证”面板中。 用户和组将同步到群集范围的用户配置文件/etc/pve/user.cfg。

要求和限制
**
bind_dn用于查询用户和组。 该帐户需要访问所有所需的条目。

可以分别通过user_attr和group_name_attr来配置代表用户和组名称的字段。 只有符合user.cfg常规字符限制的条目才会被同步。

组将与名称中附加的-$ realm同步,以避免命名冲突。 请确保同步不会覆盖手动创建的组。

选项
image.png
同步的主要选项是:

  • dry-run:没有数据写入配置。 如果要查看哪些用户和组将同步到user.cfg,这将很有用。 当您在GUI中单击“预览”时,将进行设置。
  • enable-new:如果设置,则启用新同步的用户并可以登录。 默认值为true。
  • full:如果设置,则同步将使用LDAP目录作为事实来源,覆盖user.cfg中手动设置的信息,并删除LDAP目录中不存在的用户和组。 如果未设置,则仅将新数据写入配置,并且不会删除过时的用户。
  • purge:如果设置,则同步将在删除用户和组时删除所有相应的ACL。 仅在选项full时才有用。
  • scope:要同步的范围。 它可以是用户,组或两者。

这些选项可以通过领域选项sync-defaults-options设置为参数或默认值。

14.5、双因素身份验证

有两种使用双重身份验证的方法:

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

或者,用户可以选择稍后通过TOTP加入两因素身份验证,即使该领域没有强制执行它。 作为另一种选择,如果服务器配置了AppId,则用户可以选择加入U2F身份验证,前提是该领域不强制执行任何其他第二因素。

14.5.1、领域强制两因素身份验证

添加或编辑身份验证领域时,可以通过TFA下拉框选择一种可用方法来完成。当一个领域启用了TFA时,它成为一项要求,只有配置了TFA的用户才能登录。

当前有两种方法可用:

基于时间的誓言(TOTP)
它使用标准的HMAC-SHA1算法,其中当前时间与用户配置的密钥一起散列。已配置时间步长和密码长度参数。

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

Proxmox VE提供了密钥生成工具(oathkeygen),该工具以Base32表示法打印出随机密钥,该密钥可以直接与各种OTP工具(例如oathtool命令行工具)或在Android Google Authenticator,FreeOTP和OTP或类似应用程序上一起使用。

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

+请参阅YubiKey OTP文档,了解如何使用YubiCloud或托管您自己的验证服务器。

14.5.2、用户配置的TOTP身份验证

用户可以选择通过用户列表中的TFA按钮启用TOTP作为登录时的第二个因素(除非该领域强制执行YubiKey OTP)。
image.png
打开TFA窗口后,将向用户显示一个对话框,以设置TOTP身份验证。 Secret字段包含密钥,可以简单地通过Randomize按钮随机生成。 可以添加可选的颁发者名称,以向TOTP应用程序提供密钥所属的信息。 大多数TOTP应用程序都会显示发行人名称以及相应的OTP值。 用户名也包含在TOTP应用程序的QR码中。

生成密钥后,将显示QR码,可与大多数OTP应用程序(例如FreeOTP)一起使用。 现在,用户需要验证当前用户密码(除非以root用户身份登录),以及在按“应用”按钮之前通过在“验证码”字段中键入当前OTP值来正确使用TOTP密钥的能力。

14.5.3、服务器端U2F配置

为了允许用户使用U2F身份验证,服务器需要具有带有有效https证书的有效域。 最初,需要配置AppId 。

  1. 注意
  2. 更改AppId将使所有现有的U2F注册不可用!

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

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

对于单个节点,AppId可以完全是浏览器中使用的Web UI地址,包括https://和上面显示的端口。 请注意,匹配AppId时,某些浏览器可能比其他浏览器更严格。

使用多个节点时,最好有一个单独的https服务器提供一个appid.json 2文件,因为它似乎与大多数浏览器兼容。 如果所有节点都使用同一顶级域的子域,则将TLD用作AppId可能就足够了,但是请注意,某些浏览器可能不接受此名称。

  1. 注意
  2. 不良的AppId通常会产生错误,但是我们遇到的情况不会发生,特别是当对通过Chromium中的子域访问的节点使用顶级域AppId时,尤其如此。 因此,建议使用多个浏览器测试配置,因为稍后更改AppId将使现有的U2F注册不可用。

14.5.4、以用户身份激活U2F

要启用U2F身份验证,请打开“ TFA”窗口的“ U2F”标签,输入当前密码(除非以root用户身份登录),然后按“注册”按钮。 如果服务器设置正确且浏览器接受了服务器提供的AppId,则会出现一条消息,提示用户按下U2F设备上的按钮(如果是YubiKey,则按钮指示灯应每秒稳定闪烁两次,左右稳定闪烁。 )。

Firefox用户可能需要通过about:config启用security.webauth.u2f,然后才能使用U2F令牌。

14.6、许可经营

为了使用户能够执行操作(例如列出,修改或删除VM配置的一部分),用户需要具有适当的权限。

Proxmox VE使用基于角色和路径的权限管理系统。 权限表中的条目允许用户,组或令牌在访问对象或路径时担当特定角色。 这意味着这样的访问规则可以表示为(路径,用户,角色),(路径,组,角色)或(路径,令牌,角色)的三元组,其中角色包含一组允许的操作,并且 代表这些动作目标的路径。

14.6.1、角色

角色只是特权列表。 Proxmox VE带有许多预定义角色,可以满足大多数需求。

  • 管理员:拥有所有特权
  • NoAccess:没有特权(用于禁止访问)
  • PVEAdmin:可以执行大多数操作,但是缺少修改系统设置的权限(Sys.PowerMgmt,Sys.Modify,Realm.Allocate)。
  • PVEAuditor:只读访问
  • PVEDatastoreAdmin:创建和分配备份空间和模板
  • PVEDatastoreUser:分配备份空间并查看存储
  • PVEPoolAdmin:分配池
  • PVESysAdmin:用户ACL,审核,系统控制台和系统日志
  • PVETemplateUser:查看和克隆模板
  • PVEUserAdmin:用户管理
  • PVEVMAdmin:完全管理VM
  • PVEVMUser:查看,备份,配置CDROM,VM控制台,VM电源管理

您可以在GUI上看到整套预定义角色。

可以通过GUI和命令行来添加新角色。
image.png
对于GUI,只需从数据中心导航到“权限”→“用户”选项卡,然后单击“创建”按钮,即可在其中设置名称并从“权限”下拉框中选择所有需要的角色。

要通过命令行添加角色,可以使用pveum CLI工具,如下所示:

pveum roleadd PVE_Power-only -privs "VM.PowerMgmt VM.Console"
pveum roleadd Sys_Power-only -privs "Sys.PowerMgmt Sys.Console"

14.6.2、特权

特权是执行特定操作的权利。 为了简化管理,特权列表被分组为角色,然后可以在权限表中使用这些角色。 请注意,如果没有特权,则不能直接将特权分配给用户和路径。

我们目前使用以下特权:

节点/系统相关特权
**

  • Permissions.Modify:修改访问权限
  • Sys.PowerMgmt:节点电源管理(启动,停止,重置,关机等)。
  • Sys.Console:对Node的控制台访问
  • Sys.Syslog:查看Syslog
  • Sys.Audit:查看节点状态/配置,Corosync群集配置和HA配置
  • Sys.Modify:创建/删除/修改节点网络参数
  • Group.Allocate:创建/删除/修改组
  • Pool.Allocate:创建/删除/修改池
  • Realm.Allocate:创建/删除/修改身份验证领域
  • Realm.AllocateUser:将用户分配到领域
  • User.Modify:创建/删除/修改用户访问权限和详细信息。

与虚拟机相关的特权
**

  • VM.Allocate:将新的VM创建/删除到服务器清单
  • VM.Migrate:将VM迁移到群集上的备用服务器
  • VM.PowerMgmt:电源管理(启动,停止,重置,关机等
  • VM.Console:对VM的控制台访问
  • VM.Monitor:访问VM监视器(kvm)
  • VM.Backup:备份/还原VM
  • VM.Audit:查看VM配置
  • VM.Clone:克隆/复制VM
  • VM.Config.Disk:添加/修改/删除磁盘
  • VM.Config.CDROM:弹出/更改CDROM
  • VM.Config.CPU:修改CPU设置
  • VM.Config.Memory:修改内存设置
  • VM.Config.Network:添加/修改/删除网络设备
  • VM.Config.HWType:修改模拟的硬件类型
  • VM.Config.Options:修改任何其他VM配置
  • VM.Snapshot:创建/删除VM快照

与存储相关的特权

  • 数据存储。分配:创建/删除/修改数据存储,删除卷
  • Datastore.AllocateSpace:在数据存储区上分配空间
  • Datastore.AllocateTemplate:分配/上传模板和ISO映像
  • 数据存储库。审计:查看/浏览数据存储库

14.6.3、对象和路径

访问权限已分配给对象,例如虚拟机,存储或资源池。 我们使用类似路径的文件系统来解决这些对象。 这些路径形成一棵自然树,可以选择在此层次结构内向下传播更高级别的权限(较短的路径)

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

一些例子是:

  • /nodes/{node}:访问Proxmox VE服务器计算机
  • /vms:涵盖所有VM
  • /vms/{vmid}:访问特定的VM
  • /storage/{storeid}:访问存储
  • /pool/{poolname}:访问池中VM的一部分
  • /access/groups:组管理
  • /access/realms/{realmid}:对领域的管理访问

继承
**
如前所述,对象路径形成像树这样的文件系统,并且权限可以沿继承下来
树(默认情况下设置了传播标志)。 我们使用以下继承规则:

  • 单个用户的权限始终替换组权限。
  • 当用户是该组的成员时,将应用组的权限。
  • 权限替换了从上级继承的权限。

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

14.6.4、池

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

14.6.5、我需要什么许可?

每种方法都记录了必需的API权限,可以在http://pve.proxmox.com/pve-docs/api-viewer/中找到

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

[“and”, …] and [“or”, …]
当前列表中的每个(和)或任何(或)其他元素必须为true。

[“perm”, , [ …], …]
路径是模板参数(请参见对象和路径)。 必须在指定路径上允许所有列出的特权(如果使用any选项,则使用any)。 如果指定了require-param选项,则即使API调用的架构将其列出为可选参数,也必须指定其指定的参数。

[“userid-group”, [ …], …]
调用方必须在/ access / groups上具有任何列出的特权。 另外,根据是否设置了groups_param选项,有两种可能的检查:

  • 设置了groups_param:API调用具有一个非可选的groups参数,并且调用者必须对所有列出的组具有任何列出的特权。
  • 未设置groups_param:通过userid参数传递的用户必须存在,并且是调用者在其中具有任何列出的特权(通过/ access / groups / 路径)的组的一部分。

[“userid-param”, “self”]
为API调用的userid参数提供的值必须引用执行操作的用户。(通常与或结合使用,以使用户即使没有提升的权限也可以对自己执行操作。)

[“userid-param”, “Realm.AllocateUser”]
用户需要Realm.AllocateUser对/ access / realm / 的访问权限,其中指的是通过userid参数传递的用户的领域。请注意,该用户不需要存在就可以与一个 领域,因为用户ID以<用户名> @ <领域>的形式传递。

[“perm-modify”, ]
路径是模板参数(请参见对象和路径)。 用户需要Permissions.Modify特权,或者取决于路径,以下特权可以替代:

  • / storage / …:另外需要“ Datastore.Allocate”
  • / vms / …:另外需要“ VM.Allocate”
  • / pool / …:另外需要“ Pool.Allocate”

如果路径为空,则需要/ access上的Permission.Modify。

14.7、命令行工具

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

这是一些简单的用法示例。 要显示帮助,请输入:

pveum

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

pveum help useradd

创建一个新用户:

pveum useradd testuser@pve -comment "Just a test"

设置或更改密码(并非所有领域都支持):

pveum passwd testuser@pve

禁用用户:

pveum usermod testuser@pve -enable 0

创建一个新组:

pveum groupadd testgroup

创建一个新角色:

pveum roleadd PVE_Power-only -privs "VM.PowerMgmt VM.Console"

14.8、现实世界的示例

14.8.1、管理员组

最需要的功能之一是能够定义具有完全管理员权限的用户组(无需使用root帐户)。

定义组:

pveum groupadd admin -comment "System Administrators"

然后添加权限:

pveum aclmod / -group admin -role Administrator

您最终可以将用户添加到新的管理员组中:

pveum usermod testuser@pve -group admin

14.8.2、审核员

通过将PVEAuditor角色分配给用户或组,可以授予用户只读访问权限。

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

pveum aclmod / -user joe@pve -role PVEAuditor

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

pveum aclmod /vms -user joe@pve -role PVEAuditor

14.8.3、委托用户管理

如果要将用户管理委派给joe @ pve用户,可以使用以下方法:

pveum aclmod /access -user joe@pve -role PVEUserAdmin

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

pveum aclmod /access/realm/pve -user joe@pve -role PVEUserAdmin
pveum aclmod /access/groups/customers -user joe@pve -role PVEUserAdmin

  1. 注意
  2. 该用户可以添加其他用户,但前提是他们是组客户的成员并且在域内。

14.8.4、受限的API令牌以进行监控

在所有VM上为用户joe @ pve提供PVEVMAdmin角色:

pveum aclmod /vms -user joe@pve -role PVEVMAdmin

添加具有单独特权的新API令牌,该令牌只允许查看VM信息(例如,出于监控目的):

pveum user token add joe@pve monitoring -privsep 1
pveum aclmod /vms -token ’joe@pve!monitoring’ -role PVEAuditor

验证用户和令牌的权限:

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

14.8.5、池

企业通常由几个较小的部门组成,通常要为其分配资源并委派管理任务。 池只是一组虚拟机和数据存储。 您可以在GUI上创建池。 之后,您可以将资源添加到池(VM,存储)。

您还可以向池分配权限。 这些权限将继承给所有池成员。

假设您有一个软件开发部门,那么我们首先创建一个小组

pveum groupadd developers -comment "Our software developers"

现在,我们创建一个新用户,该用户是该组的成员

pveum useradd developer1@pve -group developers -password

  1. 注意
  2. -password参数将提示您输入密码

我假设我们已经在GUI上创建了一个名为“ dev-pool”的池。 因此,我们现在可以为该池分配权限:

pveum aclmod /pool/dev-pool/ -group developers -role PVEAdmin

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