使用 scp 时询问额外的密码

Asking extra password when using scp

我不确定我应该在这里还是在服务器故障中询问这个问题,请随时标记问题并在必要时迁移它。

我有一些服务器,我想添加一个额外的安全层。实际上我们使用的是带密码的密钥认证。

我们买了一些我想用的 Yubikeys(OTP 密码生成器)。我创建了一个系统来验证 Yubikey,并且 Yubikey 的所有者有权登录。为了使用这个系统,我创建了 ~/.ssh/rc,我要求用户按下 Yubikey,然后我使用远程服务器来验证它。

到目前为止一切顺利,尝试通过 ssh 登录时它运行良好。问题来了:当我尝试 scp 到具有这种额外保护的服务器时,它会抛出以下错误:

/dev/tty: No such device or address 

错误是由我要求用户输入 OTP 的行抛出的:

read -sp "Press your Yubikey..." OTP < /dev/tty

当我从一台服务器 ssh 到另一台具有这种额外保护的服务器时,这不会发生。

scp 不会启动交互式会话,因此没有可连接的终端(因此没有 /dev/tty 可读取)。

在这种情况下,您需要检测到它,而不是尝试从中读取。

话虽如此,这很可能是错误的做法。 ssh 很可能在您的系统上配置为使用 pam 并且 yubikey 有一个 pam 模块,可用于使用 yubikey 作为帐户的 ssh 身份验证。有关基础知识,请参阅 https://developers.yubico.com/yubico-pam/

他们的配置使用 yubikey 作为唯一的身份验证,您需要稍微不同地配置 pam 以使其成为所需的附加登录信息。 (当然,假设您希望它适用于 scp 案例,而不是仅仅跳过 scp 案例。)

正如 Etan 所指出的,您真的应该为此使用 PAM。

请注意,您也不必要求用户按下 Yubikey。 pam_yubico.so 模块将在对 PAM 堆栈中的下一个模块的质询响应之前传递您键入的任何内容。例如,查看 pam_unix(8) 中的 try_first_pass 标志。

只需输入密码,不要按回车键,然后按 Yubikey。

您可以实现自己的模块来进行数据库检查。编写 PAM 模块并不难。

/etc/pam.d/sshd 中的类似内容:

# auth
auth        requisite   /usr/local/lib/security/pam_yubico.so id=[yours] key=[yours] authfile=/etc/yubikey_mappings
auth        required    pam_unix.so     no_warn try_first_pass

尝试登录:

% slogin hogfather
YubiKey for `philip': [password][yubikey]
Last login: Thu Mar  5 01:13:55 2015 from twoflower.trouble.is

好的,您需要 yubikey 身份验证加上授权,检查用户是否被允许在此服务器上登录。

您可能想看看 privacyIDEA。 这是一个 OTP 身份验证后端。如果你愿意,你甚至可以初始化你的 yubikeys。使用 pam_radius 将授权请求转发给 privacyIDEA。 (没有麻烦 scp)。

privacyIDEA 可以

  1. 检查 yubikey 的 OTP 值 AND
  2. 使用策略检查是否允许用户使用此令牌类型或令牌序列号登录该计算机。见 readthedocs