如何使用带有 PAM 的 ssh 服务器但不允许密码验证?

如何使用带有 PAM 的 ssh 服务器但不允许密码验证?

许多教程告诉您像这样配置 ssh 服务器:

ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no 

但是在这个设置下你不能使用 PAM,因为我计划使用 Google Authenticator 的 2 Factor Auth(OTP 一次性密码),所以我需要 PAM。

那么,如果我想阻止使用正常密码登录但仍允许使用 PAM,那么如何配置全新的 debian jessie ssh deamon。

也许确切的问题是如何配置 pam 以不允许密码?

PAM 身份验证的详细信息

禁用基于 PAM 的密码验证相当不直观。几乎所有 GNU/Linux 发行版(Slackware 除外)和 FreeBSD 都需要它。如果您不小心,您可以将 PasswordAuthentication 设置为“no”,但仍然可以通过 PAM 验证仅使用密码登录。事实证明,您需要将“ChallengeResponseAuthentication”设置为“no”才能真正禁用 PAM 验证。FreeBSD 手册页有这样的说法,这可能有助于澄清情况:

请注意,如果 ChallengeResponseAuthentication 为“yes”,并且 sshd 的 PAM 身份验证策略包括 pam_unix(8),则无论 PasswordAuthentication 的值是什么,都将允许通过质询-响应机制进行密码身份验证。

http://www.unixlore.net/articles/five-minutes-to-more-secure-ssh.html

答案1

也许确切的问题是如何配置 pam 以不允许密码?

正确。您已经意识到设置UsePAM no通常是错误的建议。它不仅会阻止任何形式的基于 PAM 的身份验证,还会禁用account模块session。访问控制和会话配置是好事。

首先,让我们创建一个需求列表:

  • 通过 进行 OTP 验证pam_google_authenticator.so。这需要UsePAM yesChallengeResponseAuthentication yes。毕竟,您正在提示他们提供凭证!
  • 禁止通过 PAM 进行其他形式的密码验证。这意味着禁用任何auth可能允许通过keyboard-interactive登录传输密码的模块。(我们必须保持启用 OTP)
  • 基于密钥的身份验证。我们需要要求publickey身份验证,并且可能还gssapi-with-mic需要您配置 Kerberos。

通常,使用密钥进行身份验证会完全跳过基于 PAM 的身份验证。这会阻止我们使用旧版本的 openssh,但 Debian 8 (jessie) 支持该 AuthenticationMethods指令。这允许我们要求多种身份验证方法,但仅适用于实现 SSHv2 的客户端。


sshd 配置

以下是我建议的几行/etc/ssh/sshd_config。确保您有办法访问此系统,以免sshd您破坏某些东西!

# Require local root only
PermitRootLogin no

# Needed for OTP logins
ChallengeResponseAuthentication yes
UsePAM yes

# Not needed for OTP logins
PasswordAuthentication no

# Change to to "yes" if you need Kerberos. If you're unsure, this is a very safe "no".
GSSAPIAuthentication no


# Require an OTP be provided with key based logins
AuthenticationMethods publickey,keyboard-interactive

# Use this instead for Kerberos+pubkey, both with OTP
#
#AuthenticationMethods gssapi-with-mic,keyboard-interactive publickey,keyboard-interactive

sshd一旦进行了这些更改,请不要忘记重新加载。

PAM 配置

我们仍然需要配置 PAM。假设全新安装 Debian 8(根据您的问题):

  • 评论@include common-auth来自/etc/pam.d/sshd
  • 检查/etc/pam.d/sshd并确认没有以 开头的行auth。如果这是全新安装,则不应该有,但最好谨慎行事。
  • 添加auth的条目pam_google_authenticator.so

请记住,本地密码仍然有效。

我们没有做任何会影响通过本地控制台登录的更改,也没有阻止用户使用密码通过升级其权限。sudo.这超出了问题的范围。如果您决定采取进一步措施,请记住,应始终允许 root 通过密码本地登录。否则,您可能会意外将自己锁定在系统之外。

答案2

禁止密码请求

注释此行

#auth       substack     password-auth

在 /etc/pam.d/sshd 中

并确保此行末尾没有 nullok,除非无需使用 OTP 即可通过 ssh 进行身份验证

auth required pam_google_authenticator.so

相关内容