如何通过PAM使用ssh服务器但不允许密码验证?


13

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

ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no 

但使用此设置后,您将无法使用PAM,因为我计划对Google Authenticator使用2因子验证(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),则无论密码认证的值如何,都可以通过挑战响应机制来允许密码认证。

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

Answers:


23

也许确切的问题是如何将pam配置为禁止密码?

正确。您已经偶然发现设置UsePAM no通常是个坏建议。它不仅阻止任何形式的基于PAM的身份验证,而且还禁用accountsession模块。访问控制和会话配置是一件好事。

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

  • 通过进行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用户通过密码在本地登录。否则,您可能会误将自己锁定在系统之外。


还没有测试过,但看起来很合逻辑,我赞成5次投票。
c33s

我已经测试过了。如果要完全禁用密码,则还必须将ChallengeResponseAuthentication设置为no。参见blog.tankywoo.com/linux/2013/09/14/…–
匿名,

@anonymous请参阅OP的问题和第一个项目符号。禁用ChallengeResponseAuthentication会破坏键盘交互身份验证方法,这是处理OTP的PAM身份验证模块所必需的。(由OP要求)只有在堆栈中确实有需要触发的PAM模块为零时,才可以安全地禁用CRA auth。如果PasswordAuthenticationGSSAPIAuthentication被禁用,除非PAM具有启用的身份验证模块要求输入密码,否则不会接受密码。
Andrew B

(也就是说,这仍然是一个很好的链接)
Andrew B

1

禁止输入密码

评论这行

#auth       substack     password-auth

在/etc/pam.d/sshd中

并确保在此行的末尾没有nullok,除非可以通过ssh进行身份验证而不使用OTP即可

auth required pam_google_authenticator.so
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.