基于Keycloak结合PAM实现机器身份认证的方案咨询
问题解答
1. Keycloak完全适配你的核心需求
Keycloak作为开源身份与访问管理系统,完全匹配你的场景需求:
- 统一身份认证:可作为单一身份源,同时支撑Web门户和部署机器的凭证验证,实现同一账号跨平台登录。
- 平滑过渡到LDAP:原生支持LDAP用户联邦功能,未来对接租户LDAP时,只需在Keycloak中配置LDAP用户源,无需修改现有Web和机器侧的认证流程,衔接成本极低。
- 用户生命周期一致性:Web应用已基于Keycloak实现用户CRUD,机器侧认证可直接复用Keycloak的用户数据,保证用户信息在全链路的统一。
2. 当前认证问题的解决方案
问题根源分析
- 本地已有
passwd条目用户登录挂起:大概率是PAM栈执行顺序错误,或认证脚本未正确返回PAM规定的状态码,导致系统等待脚本响应超时。 - 无
passwd条目用户提示“No passwd entry”:系统默认优先检查本地用户数据库,未找到用户时直接终止流程,未触发Keycloak认证及用户创建逻辑。
分步解决方案
(1)调整PAM配置,重构认证流程
以sshd服务为例,修改/etc/pam.d/sshd(不同发行版路径可能略有差异),保证Keycloak认证优先执行,并加入用户自动创建逻辑:
# 优先调用Keycloak认证脚本,expose_authtok传递密码避免终端交互 auth sufficient pam_exec.so expose_authtok /usr/local/bin/keycloak-auth.sh # 认证失败时回退到本地密码认证(可选,可根据需求移除) auth required pam_unix.so nodelay # 账户验证阶段:检查用户是否存在,不存在则触发创建脚本 account sufficient pam_exec.so /usr/local/bin/create-local-user.sh account required pam_unix.so # 会话阶段自动创建用户家目录 session optional pam_mkhomedir.so skel=/etc/skel umask=0022
(2)修复Keycloak认证脚本的状态码逻辑
脚本必须严格返回PAM要求的状态码,避免系统挂起。示例脚本:
#!/bin/bash # 从PAM环境变量获取用户名和密码 USER="$PAM_USER" PASSWORD=$(cat "$PAM_AUTHTOK") # Keycloak配置参数 KEYCLOAK_REALM="你的租户Realm" KEYCLOAK_URL="https://你的Keycloak域名/auth/realms/${KEYCLOAK_REALM}/protocol/openid-connect/token" CLIENT_ID="机器认证专用客户端ID" CLIENT_SECRET="客户端密钥" # 调用Keycloak密码授权端点验证凭证 RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=password&username=${USER}&password=${PASSWORD}&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}") # 校验响应是否包含有效access_token if echo "$RESPONSE" | grep -q "access_token"; then exit 0 # 认证成功,返回PAM成功状态码 else exit 1 # 认证失败,返回PAM失败状态码 fi
(3)实现自动创建本地用户的脚本
在PAM账户验证阶段触发,检查用户是否存在,不存在则创建:
#!/bin/bash USER="$PAM_USER" # 检查用户是否已存在 if ! id "$USER" &>/dev/null; then # 创建用户,可根据需求调整默认Shell、UID范围等参数 useradd -m -s /bin/bash "$USER" # 可选:从Keycloak用户信息接口拉取自定义属性(如UID/GID)进行精准配置 fi exit 0
(4)脚本权限与环境配置
- 给脚本添加执行权限:
chmod +x /usr/local/bin/keycloak-auth.sh /usr/local/bin/create-local-user.sh - 限制脚本权限避免篡改:
chown root:root /usr/local/bin/*.sh; chmod 700 /usr/local/bin/*.sh - 确保机器已安装
curl,且信任Keycloak的HTTPS证书(可通过curl -k临时跳过验证,生产环境建议导入证书)
额外注意事项
- 在Keycloak后台创建机器认证专用客户端,开启
密码授权类型,并配置正确的访问范围。 - 若需强制所有用户使用Keycloak认证,可移除PAM配置中
pam_unix.so相关行,彻底禁用本地密码登录。
内容的提问来源于stack exchange,提问作者Noufal Ibrahim
相关产品推荐
相关产品推荐

