跳转到内容

认证域:PAM、PVE、LDAP/AD 与 OpenID Connect ​

装完 PVE,root@pam 能登录,新建的用户也能选择「PVE 认证服务器」。这个 @pam、@pve 后缀就是认证域 (Realm)——它决定一个用户名从哪里验证身份。这篇讲清楚有哪几种域、什么时候该接入外部身份源。

为什么需要它 ​

单人使用时,默认的 pam 和 pve 两个域够用。但团队变大后你会遇到:

  • 想让同事用公司已有的 AD/LDAP 账号登录,不想在 PVE 里重复建号、重复管密码。
  • 想接入公司的单点登录 (SSO),用 OpenID Connect。
  • 想让某个域的用户强制开启两步验证,而不是靠自觉。

这些都要通过配置认证域实现。

开始之前 ​

  • 需要 Sysadmin 权限(通常就是 root@pam)。
  • 域配置存在 /etc/pve/domains.cfg,用户清单在 /etc/pve/user.cfg——但密码不在这里,各个域自己管密码。
  • 建议先读完用户、组、角色与权限路径,认证域只解决「身份从哪来」,不解决「能做什么」。

认证域一览 ​

域类型用户来源适合场景限制
Linux PAM (pam)宿主机系统用户单机、临时账号每个节点都要单独建这个系统用户;改密码只对当前节点生效,集群里不同步
PVE 认证服务器 (pve)PVE 自己维护的密码库大多数场景的默认选择密码哈希存在 /etc/pve/priv/shadow.cfg,只是密码库,不提供 SSO
LDAP外部 LDAP 目录已有 LDAP 服务的团队需要手动或同步把用户加进 PVE;本身不做认证以外的事
Microsoft Active Directory公司 AD 域Windows 域环境的团队配置方式和 LDAP 接近,多了 domain 字段和大小写选项
OpenID Connect外部 IdP(如 Keycloak、Google、Authentik)已有企业级 SSO需要 IdP 那边先注册好客户端 (client)

pam 和 pve 是内置域,不能删除,唯二可调的选项是「设为默认」和「是否强制两步验证」。

LDAP/AD 只负责认证,不负责授权

接入 LDAP 或 AD 之后,用户能登录,但默认没有任何权限。权限还是要照常在 PVE 里按权限路径分配,只是身份验证这一步交给了外部系统。

操作步骤 ​

添加 LDAP 或 Active Directory 域 ​

数据中心 → 权限 → 认证域 → 添加 → LDAP(或 Active Directory)。

主要字段:

字段说明
Realm域标识,例如 company-ldap
Base Domain Name / Base DN用户搜索的起点,例如 dc=example,dc=com
User Attribute Name哪个属性对应用户名,AD 通常是 sAMAccountName
Server / Fallback Server目录服务器地址,可配一个备用
Port、SSL 模式建议启用 ldaps 或 STARTTLS,避免密码明文传输
Bind Domain Name (bind_dn)如果目录不允许匿名查询,填一个只读账号

填了 bind_dn 之后,它的密码不写进 domains.cfg,而是单独存在 /etc/pve/priv/realm/<realm名>.pw。

AD 环境如果用户名大小写不敏感,另外执行:

sh
# 宿主机 shell
pveum realm modify <realm名> --case-sensitive 0

添加 OpenID Connect 域 ​

数据中心 → 权限 → 认证域 → 添加 → OpenID Connect,或者用命令行:

sh
# 宿主机 shell,示例接入一个通用 OIDC 提供方
pveum realm add company-sso \
  --type openid \
  --issuer-url https://sso.example.com/realms/company \
  --client-id proxmox-ve \
  --client-key <IdP 分配的密钥> \
  --username-claim username

issuer-url 必须是 https

IdP 那边要先注册这个客户端(回调地址通常是 https://<PVE地址>:8006/),拿到 client-id 和 client-key 再回来填。具体注册步骤因 IdP 而异,照 IdP 自己的文档操作。

同步 LDAP/AD 的用户和组 ​

接入之后用户不会自动出现,要手动加,或者用同步功能:

sh
# 宿主机 shell,先干跑一次看看会同步什么
pveum realm sync <realm名> --dry-run --scope both

# 确认没问题再真正执行
pveum realm sync <realm名> --scope both --enable-new 1

同步进来的组名会带上 -<realm名> 后缀,方便区分来源。

--remove-vanished 会删除本地记录

这个选项会把 LDAP/AD 里已经不存在的用户或组从 PVE 里删掉(可选删除 acl、entry、properties 中的一种或多种)。第一次同步不要带这个参数,确认同步结果符合预期之后再考虑加上。

设为默认域 / 强制两步验证 ​

编辑域时,Default 勾上后登录页会默认选中这个域;TFA 下拉可以选 TOTP 或 YubiKey OTP,选了之后这个域下所有用户登录都必须过两步验证,不是可选项。域级别强制和用户自己开启的区别、以及具体设置方法见开启双因素认证。

检查结果 ​

  1. pveum realm list:能看到新加的域。
  2. 用一个非 root 的测试账号,从对应域登录一次(登录页选择正确的 Realm 下拉项)。
  3. LDAP/AD 同步后执行 pveum user list --full,确认用户和组按预期出现。
  4. 给测试账号在某个受限路径上授权(见权限路径),验证它只能看到该路径下的资源。

常见问题 ​

LDAP/AD 连不上或 bind 失败。 先用 ldapsearch 之类的工具从宿主机手动测试目录服务器连通性和 bind_dn 密码是否正确,排除是 PVE 配置问题还是网络/目录服务本身的问题。

启用了 SSL 校验后连不上。 检查 capath 有没有指向正确的 CA 证书目录,自签证书的目录服务器需要把 CA 证书导入宿主机信任链。

同步没有新用户出现。 检查 --enable-new 是否为 1,以及 LDAP/AD 那边的 filter 是否把目标用户排除在外。

OpenID 登录后跳转出错。 多半是 IdP 里注册的回调地址和实际访问 PVE 的地址(含端口)不一致,两边要完全匹配。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。