外观
认证域: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 usernameissuer-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,选了之后这个域下所有用户登录都必须过两步验证,不是可选项。域级别强制和用户自己开启的区别、以及具体设置方法见开启双因素认证。
检查结果
pveum realm list:能看到新加的域。- 用一个非 root 的测试账号,从对应域登录一次(登录页选择正确的 Realm 下拉项)。
- LDAP/AD 同步后执行
pveum user list --full,确认用户和组按预期出现。 - 给测试账号在某个受限路径上授权(见权限路径),验证它只能看到该路径下的资源。
常见问题
LDAP/AD 连不上或 bind 失败。 先用 ldapsearch 之类的工具从宿主机手动测试目录服务器连通性和 bind_dn 密码是否正确,排除是 PVE 配置问题还是网络/目录服务本身的问题。
启用了 SSL 校验后连不上。 检查 capath 有没有指向正确的 CA 证书目录,自签证书的目录服务器需要把 CA 证书导入宿主机信任链。
同步没有新用户出现。 检查 --enable-new 是否为 1,以及 LDAP/AD 那边的 filter 是否把目标用户排除在外。
OpenID 登录后跳转出错。 多半是 IdP 里注册的回调地址和实际访问 PVE 的地址(含端口)不一致,两边要完全匹配。
参考资料
- Proxmox VE User Management(官方 Wiki,认证域配置说明)
- pveum(1) 手册
- 用户、组、角色与权限路径
- 开启双因素认证