You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:05:13