SSH - 即使存在公钥,也定期需要密码

SSH - 即使存在公钥,也定期需要密码

如何允许公钥身份验证但仍需要每 24 小时输入一次用户密码?首选主机操作系统是 Debian。

答案1

查看手册页sshd_config(5)我发现了一些可用于以某种方式实现此目的的配置关键字:

  1. 使用修改后的AuthenticationMethods与一个Match堵塞
  2. 使用AuthorizedKeysCommand每次登录时调用一个脚本来决定是否需要密码
  3. 使用ForceCommand成功登录后执行自定义命令以检查所需的密码。

详细地:

  1. 使用修改后的AuthenticationMethods与一个Match阻止:通过此您可以禁止公钥身份验证或此外需要对特定用户进行密码验证:
Match User john
        AuthenticationMethods publickey,password publickey,keyboard-interactive

这样,用户john在成功进行公钥认证后需要输入密码。但会定期变化哪个用户必须输入密码有点棘手。一种方法是更改​​自定义脚本sshd_config以添加/删除用户并发出信号sshd以重新加载其配置 - 这是一个非常令人讨厌的黑客行为。

我动态地看到的唯一方法MatchGroup

Match Group need-passwd
        AuthenticationMethods publickey,password publickey,keyboard-interactive

这样,您不需要更改,sshd_config而只需分别向系统组添加/删除用户need-passwdsshd然后将检查用户是否在该组中,如果是,则还需要密码。

  1. 使用AuthorizedKeysCommand每次登录时调用一个脚本来决定是否需要密码
# ignore existing authorized_keys files by default
AuthorizedKeysFile /dev/null
# instead load allowed authorized_keys using external command
AuthorizedKeysCommand /path/to/external_script.sh
# root is required to be able to read users ~/.ssh/authorized_keys files
AuthorizedKeysCommandUser root

sshd直接查看~/.ssh/authorized_keys此内容,而是仅使用可以实现自定义逻辑的位置提供的密钥external_script.sh,例如 * 查找用户上次成功的远程登录 * 如果是超过 24 小时前,则不返回任何授权密钥,从而有效禁用公钥身份验证 * 如果是在过去 24 小时内,则只需返回以下内容~/.ssh/authorized_keys

后者是external_script.sh需要root访问权限才能读取用户主文件夹中的文件的原因。

与 1. 和 3. 相比,这种方法的缺点是您必须通过允许仅密码登录来实际降低安全性。

  1. 使用ForceCommand成功登录后执行自定义命令以检查所需的密码。

将在成功登录(使用公钥)后执行,而不是执行ssh用户提供给客户端的命令。ForceCommand在该命令中,您可以实现自定义逻辑(见上文),并在需要时首先要求登录密码,否则只需执行提供的命令行。

这里的缺点是很难做到正确: * 因为命令仅被执行成功登录,用户将已经登录到系统 - 这意味着在输入密码之前请求的端口/X11/ssh代理转发可能已经处于活动状态 * 正确处理提供的命令行 - 如果有 - 可能需要仔细转义所有内容字符串

此外,由于密码/登录名是由自定义脚本查询的,因此客户端不会支持/处理,ssh但需要一个有效的tty.

您可以结合方法 2. 和 3.,而不是返回任何授权密钥,在行前添加所有访问选项的前缀restrict,并且仅执行强制自定义command,请参阅AUTHORIZED_KEYS_FILE_FORMAT

答案2

这是一个棘手的问题。在我做出这个想法之前,我还有另外两个想法。

我的方法是让 root cron 作业在凌晨 3 点运行,并将用户authorized_keys文件重命名为authorized_keys.disabled.这将使用户的 ssh 密钥失效并强制使用密码登录。然后,在用户的 中.bashrc,一行可以简单地重命名authorized_keys.disabled回,authorized_keys以便当天剩余时间的登录可以使用 ssh 密钥。

cron 条目将是这样的:

00 03 * * * mv --force /home/jennifer/.ssh/authorized_keys /home/jennifer/.ssh/authorized_keys.disabled

.bashrc条目将类似于:

mv --force ~/.ssh/authorized_keys.disabled ~/.ssh/authorized_keys

我的计划可能有漏洞。我还没有测试过。

相关内容