使用 kerberos 进行 Ubuntu SSH 无密码登录

使用 kerberos 进行 Ubuntu SSH 无密码登录

这让我很抓狂。我正在尝试设置一个集成了 AD 的 Ubuntu 16.04 服务器,以便在通过 SSH 登录时接受 Kerberos 票证。我有一台 CentOS 7 服务器,在加入 AD 域后可以毫无问题地接受票证,但我还没有在 Ubuntu 服务器上正确配置。

设置如下:

  • Windows 2012 AD 域(realdomain.tld)
  • Fedora 25 工作站(wksf25.realdomain.tld)
  • CentOS 7 服务器(sc7.realdomain.tld)
  • Ubuntu 16.04 服务器(su16.realdomain.tld)

所有内容都通过领域加入到 AD,并且运行正常。所有内容在登录时或通过 kinit 时也都能获得 Kerberos 票证。从 wksf25 到 sc7 的 SSH 运行正常,我能够使用登录 wkfs25 时获得的 kerberos 票证通过 SSH 登录。

以下是 Ubuntu 的设置步骤:

  1. 安装软件包:

    apt install realmd oddjob oddjob-mkhomedir sssd sssd-tools adcli samba-common krb5-user chrony packagekit libpam-krb5
    
  2. 编辑chrony.conf以使用 AD DC。
  3. 设置 realmd.conf:vim /etc/realmd.conf

    [users]
    default-home = /home/%D/%U
    
    [realdomain.tld]
    fully-qualified-names = no
    manage-system = no
    automatic-id-mapping = yes
    
  4. 加入域:realm join -vU domainuser realdomain.tld

  5. 允许登录:realm permit -R realdomain.tld -g linuxadmins
  6. Ubuntu 专用 - 设置 pam 在登录时创建主目录:`vim /etc/pam.d/common-session'

    session optional        pam_mkhomedir.so umask=0077
    
  7. Ubuntu 特定 - 在 OpenSSH 中启用 GSSAPI 身份验证:vim /etc/ssh/sshd_config

    GSSAPIAuthentiction yes
    GSSAPICleanupCredentials no
    
  8. 使用域帐户登录并确保一切正常。此时,除了通过 Ubuntu 服务器上的 Kerberos 票证进行无密码 SSH 登录外,一切正常。

以下是我得到的信息realm list

realdomain.tld
  type: kerberos
  realm-name: REALDOMAIN.TLD
  domain-name: realdomain.tld
  configured: kerberos-member
  server-software: active-directory
  client-software: sssd
  required-package: sssd-tools
  required-package: sssd
  required-package: libnss-sss
  required-package: libpam-sss
  required-package: adcli
  required-package: samba-common-bin
  login-formats: %U
  login-policy: allow-permitted-logins
  permitted-logins: 
  permitted-groups: linuxusers

sssd.conf:

[sssd]
domains = realdomain.tld
config_file_version = 2
services = nss, pam

[domain/realdomain.tld]
ad_domain = realdomain.tld
krb5_realm = REALDOAMIN.TLD
realmd_tags = joined-with-adcli 
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%d/%u
access_provider = simple
simple_allow_groups = linuxusers

krb5.conf:

[libdefaults]
    dns_lookup_realm = false
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = true
    rdns = false
    default_ccache_name = KEYRING:persistent:%{uid}

    default_realm = REALDOMAIN.TLD

[realms]
    REALDOMAIN.TLD = {
    }

[domain_realm]
    realdomain.org = REALDOMAIN.TLD
    .realdomain.org = REALDOMAIN.TLD

我错过了什么?

答案1

已修复。realm join -vU domainuser --membership-software=samba --client-software=sssd realdomain.tld加入 Ubuntu 上的 AD 域而不是realm使用默认值。

SSSD 配置中有一个小小的差异,我认为这并不重要,但事实证明它是重要的。

乌本图:realmd_tags = joined-with-adcli

CentOS:realmd_tags = joined-with-samba

为了从不同的角度看待这个问题,我启动了一台 OpenSUSE VM,并开始研究 SUSE 如何进行 AD 集成。当我弄清楚 SUSE 是如何工作的时,我偶然发现了一篇文章,其中建议应该使用 Samba 而不是 来加入 Windows Server 2012+ AD adcli1将其添加到上面配置的差异中,这就是正在发生的事情的线索。

离开域并使用更新的realm命令重新加入解决了该问题,并且最后一天一切都很稳定。

我不知道这两种方法之间的差异的确切根本原因,但这需要更多的研究,并且是另一天的斗争。

答案2

我们在添加 SSL 证书以支持 LDAPS 时也遇到了类似的情况(尽管我从未恢复该更改以确定它是否是因果关系)。我不确定是否有任何理由更喜欢,但我发现在使用时有adcli两个选项已修复(在 Ubuntu 14.04 和 16.04 上):realm joinadcli

解决方案 1(Ubuntu 16.04 或 14.04)

添加两个设置krb5.conf(单独使用都没有帮助):

[libdefaults]
    ...
    canonicalize = true
    rdns = false

解决方案 2(仅限 Ubuntu 14.04)

后来我偶然发现git 问题建议了另一个选项,该选项(单独)在 14.04 上也适用于我们:

[libdefaults]
    ...
    dns_canonicalize_hostname = false

仅供参考

我们实际上完全控制我们的 DNS,并且无法在现有记录中发现任何问题 - 或者任何消除这些问题需要的更改。

相关内容