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

如何为非本地用户启用Linux PAM认证(Ubuntu SFTP场景)

解决Ubuntu SFTP服务器动态创建用户首次登录失败问题

问题根源

sshd默认会在触发PAM认证流程之前,先查询系统用户数据库(如/etc/passwd)验证用户是否存在。第一次登录时,用户尚未创建,sshd直接判定为无效用户,不会进入你的PAM认证逻辑执行用户创建代码;第二次登录时用户已存在,才会走PAM认证流程,因此首次登录失败。

可行解决方案

方案一:修改sshd配置,跳过预用户存在性检查

修改/etc/ssh/sshd_config,添加/调整以下配置,让sshd直接触发PAM认证,不预先检查用户是否存在:

# 启用PAM
UsePAM yes
# 启用密码认证
PasswordAuthentication yes
# 关闭sshd自带的用户存在性检查(关键配置)
UseLogin no
# 禁止空密码登录
PermitEmptyPasswords no
# 配置SFTP使用internal-sftp(推荐)
Subsystem sftp internal-sftp
# 限制SFTP用户的权限(可选,增强安全)
Match Group sftp
    ChrootDirectory %h
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no

修改后重启sshd服务:

systemctl restart sshd

方案二:优化PAM模块,创建用户后刷新系统用户缓存

在你的PAM Python代码中,创建用户后立即刷新系统用户缓存,让系统实时识别新创建的用户。同时务必先通过外部REST API验证凭证,再执行用户创建,避免恶意请求创建无效用户:

import os
import pam

def pam_sm_authenticate(pamh, flags, argv):
    try:
        user = pamh.get_user(None)
        # 获取用户输入的密码
        password = pamh.authenticate(None, flags)
    except pamh.exception as e:
        return e.pam_result

    # 第一步:调用外部REST API验证凭证(替换为你的实际验证逻辑)
    # if not validate_credentials_via_rest(user, password):
    #     return pamh.PAM_AUTH_ERR

    # 第二步:验证通过后,动态创建用户(如果不存在)
    home_dir = f"/home/{user}"
    if not os.path.exists(home_dir):
        # 创建用户时指定/sbin/nologin,禁止SSH登录,仅允许SFTP
        os.system(f"useradd -m -g sftp -s /sbin/nologin {user}")
        # 刷新用户缓存,让系统立即识别新用户
        os.system("nscd -i passwd")

    # 认证成功
    return pamh.PAM_SUCCESS

注意:需要先安装nscd服务(用于用户缓存):

apt update && apt install nscd -y

方案三:使用自定义NSS模块,无需本地创建用户

如果你的用户量较大,预创建/动态创建本地用户不现实,可以通过自定义NSS(Name Service Switch)模块,让系统查询用户时直接调用外部REST API获取用户信息(UID、GID、家目录等)。这种方式不需要在本地创建用户账号,sshd查询用户时会直接认为用户存在,进入PAM认证流程。

你可以使用nss-python编写自定义NSS模块,实现getpwnam等函数,从REST API拉取用户数据,替代本地用户数据库查询。

关键注意事项

  • 安全优先:必须先验证外部API凭证,再执行用户创建或授权操作,防止恶意请求攻击。
  • 权限控制:创建用户时指定-s /sbin/nologin,避免用户通过SSH登录系统,仅限制为SFTP访问。
  • 错误处理:在PAM代码中添加useradd命令的错误捕获逻辑,避免因用户已存在等情况导致认证失败。

内容的提问来源于stack exchange,提问作者Jonny Marotte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:53:12