如何使用PAM的SSH服务器,但不允许密码validation?

许多教程告诉你像这样configuration你的ssh服务器:

ChallengeResponseAuthentication no PasswordAuthentication no UsePAM no 

但有了这个设置,你不能使用PAM,因为我打算使用Google身份validation器(OTP一次性密码)2因子authentication,我需要PAM。

所以如何configuration一个新鲜的debian jessie ssh deamon,如果我想阻止用正常密码login,但仍然允许使用PAM。

也许确切的问题是如何configuration帕姆不允许使用密码?

PAMvalidation的详细信息

禁用基于PAM的密码authentication是相当不直观的。 几乎所有的GNU / Linux发行版(除了Slackware之外)都需要它,以及FreeBSD。 如果您不小心,可以将PasswordAuthentication设置为“no”,并通过PAM身份validation使用密码login。 事实certificate,您需要将“ChallengeResponseAuthentication”设置为“no”才能真正禁用PAMauthentication。 FreeBSD的手册页有这样的说法,这可能有助于澄清一些情况:

请注意,如果ChallengeResponseAuthentication为'yes',并且sshd的PAMauthentication策略包含pam_unix(8),则无论PasswordAuthentication的值如何,都将允许通过质询 – 响应机制进行密码authentication。

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

也许确切的问题是如何configuration帕姆不允许使用密码?

正确。 你已经偶然发现,设置UsePAM no通常是不好的build议。 它不仅阻止任何forms的基于PAM的身份validation,还会禁用accountsession模块。 访问控制和会话configuration是好东西。

首先,我们build立一个需求清单:

  • OTP通过pam_google_authenticator.so 。 这需要UsePAM yesChallengeResponseAuthentication yes 。 毕竟,你在提示他们input证书。
  • 没有通过PAM的其他forms的密码authentication。 这意味着禁用任何可能允许通过keyboard-interactivelogin传输密码的auth模块。 (我们必须离开启用OTP)
  • 基于密钥的authentication。 我们需要publickeyauthentication,如果你configuration了Kerberos,可能需要gssapi-with-mic

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


sshdconfiguration

以下是我为/etc/ssh/sshd_config提出的build议。 确保你有一个方法来访问这个系统没有sshd的情况下,你打破了一些东西!

 # Require local root only PermitRootLogin no # Needed for OTP logins ChallengeResponseAuthentication yes UsePAM yes # Not needed for OTP logins PasswordAuthentication 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

PAMconfiguration

我们仍然需要configurationPAM。 假设一个干净的Debian 8安装(根据您的问题):

  • /etc/pam.d/sshd注释@include common-auth
  • 查看/etc/pam.d/sshd并确认没有以auth开头的行。 如果这是一个干净的安装,不应该有,但最好是安全的。
  • pam_google_authenticator.so添加一个auth条目。

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

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

禁止密码请求

注释这一行

 #auth substack password-auth 

在/etc/pam.d/sshd中

并且一定不要在这行结尾有nullok,除非通过ssh进行身份validation而不使用OTP

 auth required pam_google_authenticator.so