OpenSSH双因素authentication结合Kerberos /公钥

我正在尝试为OpenSSH实现双因素身份validation。 环境是CentOS 7(内核:3.10.0-229.1.2.el7.x86_64),OpenSSH_6.6.1p1,OpenSSL 1.0.1e-fips 2013年2月11日。我们已经部署了Active Directory(LDAP)+ Kerberos。 规范如下:

  • 具有现有的有效Kerberos票证的用户只能被要求提供第二个因素
  • 必须要求没有现有有效Kerberos票证的用户input其密码和第二个因素
  • 本地用户(无LDAPauthentication)应该能够使用本地密码进行authentication
  • 第二个因素不能在第一个之前提供
  • 除了Kerberos之外,如果可用的话,公钥authentication也应该被接受为第一要素
  • 该function应该能够限制在一组用户 – 其他人只是让他们的密码

为了执行第二个因素的身份validation过程,第三方有一个对Kerberos一无所知的PAM模块。 所以这就是我所做的:

把这些行放到/ etc / ssh / sshd_config中:

# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd UsePam yes ChallengeResponseAuthentication yes # To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets GSSAPIAuthentication yes # Enable public key authentication PubkeyAuthentication yes # Password validation should be done via the KDC PasswordAuthentication yes KerberosAuthentication yes KerberosOrLocalPasswd yes # Kerberos / Public Key + PAM AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam # (only supported for OpenSSH 6.2 or higher) 

sshd(/etc/pam.d/sshd)的PAMconfiguration的auth部分

 auth [success=ignore default=1] pam_localuser.so auth substack password-auth auth [success=1 default=ignore] pam_localuser.so auth required pam_2fa.so [...some arguments...] auth include postlogin 

模块pam_2fa.so负责提示和validation第二个因素。

现在对于Kerberos来说,这几乎是我想要实现的一切。 但是,对于本地帐户,将导致两个后续的密码提示。 这是我的主要问题。 这是因为在这种情况下,正如预期的那样使用path“password,keyboard-interactive:pam”。 (我需要这个authenticationpath,所以有Kerberos帐户,但没有有效票证的人可以通过input密码,然后是OTP获得票证。)如果我从PAMconfiguration中完全删除密码authentication子包,那么Kerberos帐户仍然可以工作和本地帐户仍然无法正常工作。 对我来说,似乎KerberosOrLocalPasswd yes语句被忽略,因为UsePAM yes也存在。 但是,sshd确实在使用KDC进行密码validation,否则它也不适用于LDAP帐户。

再次,为了进一步澄清我希望在这里实现的是描述所需authentication逻辑的伪代码:

 if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey): return second_factor_auth(user, read_otp()) else: if is_local_account(user): if local_passwd_auth(user, read_password()): return second_factor_auth(user, read_otp()) else: return AUTH_ERR else: if krb5_auth(principal, read_password()): return second_factor_auth(user, read_otp()) return AUTH_ERR 

所以我认为我的想法不是太复杂或者有雄心,但是尽pipe我花了几天的时间来研究和实验,但是我仍然找不到一个清晰的实现方法。 你能帮我find解决办法吗?

提前非常感谢!

我不知道有什么办法可以在不用编写新的pam模块的情况下用PAM来做什么。 PAM相对来说比较复杂,sshd和PAM和Kerberos交互的方式一直是我的经验,总是有一个边缘案例不起作用。

你想要什么可能是可能的,我只是不知道该怎么做。 如果你只需要安全的SSH我会build议使用

 ForceCommand /path/to/2fa_executable 

在你的sshd_config中。 这将允许你实现你想要的逻辑,缺点是2fa_executable需要setuid来读取任何2fa的秘密。

Duo Security网站上有一个例子和代码。 你可以使用二重奏setuid包装和你使用的任何2fa代码。

双核Unixconfiguration

  • 具有现有的有效Kerberos票证的用户只能被要求提供第二个因素。

这不能通过PAM来实现。

针对sshd成功执行的基于密钥的身份validation绕过了PAM的auth栈。 这包括GSSAPI,这是基于票据的Kerberos身份validation的要求。 它别无select,只能做到这一点,因为PAM根本没有考虑到这种types的authentication。

设置UsePAM yes会执行以下操作:

  • ChallengeResponseAuthenticationPasswordAuthentication将钩住PAM的auth堆栈以validation密码。 除了这两种方法之外,任何forms的authentication都不会触及auth堆栈。
  • 成功authentication后,将调用PAM的account堆栈以确定是否允许authentication的用户访问。 (总是)
  • 将会调用PAM的session堆栈来处理会话设置任务。

简介:绝对没有办法在auth堆栈中获取双因素身份validation提示,以便对使用GSSAPI或ssh密钥进行身份validation的用户进行身份validation。 您可以将accountsession堆栈与这些身份validation方法结合使用,但就PAM而言。