总结

总结

总结

我希望能够使用我第一次登录时生成的 kerberos 票证从 FreeBSD 主机 ssh 到 FreeBSD 主机。

问题

环境

FreeBSD 10.3 带有可用的 openldap-sasl-client、kerberos 5(不是 heimdal)、sssd、ssh,并已加入 Active Directory(2008 R2)。我必须从 /usr/ports 源位置编译 sssd,因为默认情况下不包含我需要的 sssd-ad。我没有使用 winbind,因此参考 1 没有帮助。(显然 FreeBSD 也没有 authconfig 命令。)我可以kinit很好地执行:

[bgstack15@localhost /]$ kinit
[email protected]'s Password:
[bgstack15@localhost /]$ klist
Credentials cache: FILE:/tmp/krb5cc_5532829429
        Principal: [email protected]

  Issued                Expires               Principal
Aug 18 16:01:16 2016  Aug 19 02:01:16 2016  krbtgt/[email protected]

之后我就可以了ssh -K secondhost,它会带我到那里。

问题是我希望能够在登录时生成 Kerberos 票证,或者至少我根本不需要输入密码。我使用 GSSAPI 身份验证访问本地主机,因此我使用 Kerberos 票证登录。我可以传递那个吗?

我已经尝试过的方法

这是我的/etc/pam.d/sshd

auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            sufficient      pam_unix.so             no_warn
auth            sufficient      pam_krb5.so             no_warn use_first_pass forwardable ccache=krb5cc_%u
auth            required        pam_unix.so             no_warn try_first_pass

account         required        pam_nologin.so
account         required        pam_login_access.so
account         sufficient      /usr/local/lib/pam_sss.so       ignore_unknown_user
account         required        pam_unix.so

session         optional /usr/local/lib/pam_sss.so
session         required        /usr/local/lib/pam_mkhomedir.so mode=0700
session         required        pam_permit.so

password        sufficient      /usr/local/lib/pam_sss.so       use_authtok
password        sufficient      pam_krb5.so             use_authtok forwardable
password        required        pam_unix.so             no_warn try_first_pass

我也试过
auth sufficient pam_krb5.so no_warntry_first_passforwardable ccache=krb5cc_%u

有一个选项可以kinit在.profile 中运行,但我试图避免输入密码。

可以使用 pam_exec.so 吗?我可以echo PASSWORD | kinit --password-file=STDIN这样做,那么我可以以某种方式调用它吗?

参考

  1. 与这个类似,但在 FreeBSD 10.3 上使用 PAM 在 ssh 登录时初始化 Kerberos 票证
  2. pam_krb5.so 配置文件https://www.freebsd.org/cgi/man.cgi?query=pam_krb5&sektion=8
  3. 类似,但不能解决无密码问题使用 SSH 获取 Kerberos 票证
  4. http://web.archive.org/web/20150315074946/http://howtovmlinux.com/articles/infrastructure-management/red-hat-idm/automate-kinit-kerberos-ticket-during-ssh-login.html

答案1

看来您的 ssh 客户端 (PuTTY) 没有委派凭据。无论使用多少 pam 技巧,都无法解决这个问题,除非您重新输入密码,这反而会破坏要点。

我似乎无法让 putty 0.67 进行委托,即使选中了 likely 选项。您提到的 accept 行看起来像是从 sshd 记录身份验证,而不是委托。默认情况下,sshd 不记录委托。查看 SSH 数据包日志,putty 0.67 似乎甚至没有尝试。

答案2

编辑:

鉴于使用密码登录对您没有帮助(在评论中),您可能/etc/krb5.conf还需要调整设置。在继续排除 GSSAPI 登录故障之前,您需要先使用交互式登录来解决这个问题。

[libdefaults]
        default_realm = EXAMPLE.COM

# The following krb5.conf variables are only for MIT Kerberos.
        krb4_config = /etc/krb.conf
        krb4_realms = /etc/krb.realms
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true

原始答案如下。


问题是我希望能够在登录时生成 Kerberos 票证,或者至少我根本不需要输入密码。我使用 GSSAPI 身份验证访问本地主机,因此我使用 Kerberos 票证登录。我可以传递那个吗?

实际上,我怀疑这是您的问题。当您sshd使用 GSSAPI(或任何其他形式的基于密钥的身份验证)进行身份验证时,您将auth完全绕过堆栈。这可以防止 PAM 模块提示您输入任何形式的交互式凭据,但也可以防止触发模块在该堆栈中实现的任何“便利功能”。一个快速测试是使用您的密码登录并运行klist,我强烈怀疑这会向您显示您期望的结果。

我最有经验的实现pam_krb5是由eyrie.org(Russ Allbery),所以我将使用它作为与您链接的文档的比较点。您可以找到我引用的手册页这里

两个模块都pam_setcred()auth堆栈中实现:

  • FreeBSD的:

    Kerberos 5 身份验证组件提供验证用户身份(pam_sm_authenticate())和设置用户特定凭据(pam_sm_setcred())的功能。

  • eyrie.org:

    提供 pam_authenticate() 和 pam_setcred() 的实现。前者从 PAM 会话中获取用户名,提示输入用户密码(除非配置为使用已输入的密码),然后执行 Kerberos 初始身份验证,将获得的凭据(如果成功)存储在临时票证缓存中。后者根据调用时使用的标志,获取临时票证缓存的内容并将其写入用户拥有的持久票证缓存,或使用临时票证缓存刷新现有用户票证缓存。

两个模块均未pam_setcred()account堆栈中实现:

  • FreeBSD的:

    Kerberos 5 帐户管理组件提供了一个执行帐户管理的函数 pam_sm_acct_mgmt()。该函数通过调用 krb5_kuserok()(检查用户的 .k5login 文件)来验证已验证的主体是否允许登录本地用户帐户。

  • eyrie.org:

    提供 pam_acct_mgmt() 的实现。它所做的就是执行与上述 pam_authenticate() 实现相同的授权检查。

Russ Allbery 模块pam_setcred()session堆栈中实现。FreeBSD 模块没有什么当通过session堆栈调用时。

  • FreeBSD的:

    Kerberos 5 会话管理组件提供启动 (pam_sm_open_session()) 和终止 (pam_sm_close_session()) 会话的函数。由于 Kerberos 5 下未定义会话管理,因此这两个函数都只返回成功。提供它们只是因为 PAM 模块的命名约定。

  • eyrie.org:

    提供 pam_open_session() 的实现,这相当于使用 PAM_ESTABLISH_CRED 标志调用 pam_setcred(),以及 pam_close_session(),这会销毁由 pam_setcred() 创建的票证缓存。


简而言之,您需要一个 PAM 模块来提供accountsession堆栈中所需的功能。当您通过 GSSAPI 进行身份验证时,您当前的模块似乎无法满足此需求。

相关内容