Apache kerberos 身份验证未在 Active Directory 中发生。(是否与 KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN 有关?)

Apache kerberos 身份验证未在 Active Directory 中发生。(是否与 KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN 有关?)

我的目标是让 Apache 使用 Kerberos 对 AD 进行身份验证,而无需提示输入用户名和密码。它目前总是显示“401 未授权”,似乎没有尝试 Kerberos。我找不到任何错误日志,只能找到一个kinit明显不起作用并给出错误的命令 - 该错误在 WireShark 中显示为:

Linux sends AS-REQ
Windows replies KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN

线索还是干扰因素?

设置/背景详细信息

Windows Server 2008 R2 SP1, with Active Directory ("winserver").
CentOS 6.5 ("centos").
  1. 配置主机名和 DNS,并在 Windows DNS 服务器中添加 A 和 PTR 条目。名称解析显示正常。

  2. 创建/etc/krb5.conf/etc/samba/smb.conf使用authconfig-tui并调整它们。

krb5配置文件

`/etc/krb5.conf`

[libdefaults]
 default_realm = SITE.EXAMPLE.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 SITE.EXAMPLE.COM = {
  kdc = winserver.site.example.com
  admin_server = winserver.site.example.com
 }

[domain_realm]
 site.example.com = SITE.EXAMPLE.COM

和桑巴

`/etc/samba/smb.conf` includes

workgroup = SITE
password server = winserver
realm = SITE.EXAMPLE.COM
security = ads
kerberos method = system keytab
winbind use default domain = true

从这里开始,Kerberos 设置步骤:

  1. net ads join createupn=HOST/[email protected] -k -U administrator要求我输入 Windows 密码并接受。它加入域(在 AD 中创建计算机对象)。

  2. net ads testjoin报告“加入正常”。

  3. net ads keytab create -k -U administrator创建/etc/krb5.keytab并用HOST/centos....排列填充它。

  4. net ads keytab add HTTP -k -t /etc/krb5.keytab -U administratorHTTP/centos.site.example.com向密钥表添加 条目。klist -ke显示了很多 SPN 组合,包括并且似乎将 KVNO 与服务器对象上的 Windows msDS-KeyVersionNumber 属性相匹配。HTTP/[email protected]

此时,我可以使用 PuTTY 通过 SSH 连接,并使用 SSO 自动登录,无需输入密码。我可以通过 SSH 连接并强制输入密码提示,使用 Windows 用户名和密码登录。使用 Windows 帐户登录后,我可以kinit看到klistKerberos 票证。我可以使用和wbinfo -u查询AD 并获得结果。wbinfo -gnet ads search

一切看起来都很好。让我们继续讨论 Apache:

  1. chgrp apache /etc/krb5.keytab

  2. chmod ugo+r /etc/krb5.keytab

  3. yum install mod_auth_kerb

  4. 编辑/etc/httpd/conf/httpd.conf并添加:

httpd.conf

LoadModule auth_kerb_module /usr/lib64/httpd/modules/mod_auth_kerb.so

AuthName "Kerberos Authentication"
AuthType Kerberos

Krb5Keytab /etc/krb5.keytab
KrbAuthRealms SITE.EXAMPLE.COM
KrbMethodNegotiate on
KrbMethodK5Passwd off
KrbServiceName Any

在 Internet Explorer 中,“本地 Intranet 站点”包括http://*.site.example.com并设置为“仅在 Intranet 区域自动登录”。使用这些设置,自动登录适用于办公室内的其他(基于 IIS 的)网站。在 FireFox 中,about:config 具有network.negotiate-auth.trusted-uris; .site.example.com

在 IE、FireFox 或 Chrome 中,我使用 FQDN 访问网站,得到401 Unauthorized。看来甚至没有尝试 Kerberos。

我在 Linux 日志文件 /var/log/httpd/error_log 或 access_log /var/log/secure 或 /var/log/audit/audit.log 中找不到任何内容来显示任何错误。

尝试找到要测试的东西,我能找到的唯一能产生清晰且看似相关的错误的命令是:

$ kinit -k -t /etc/krb5.keytab HTTP/centos.site.example.com
kinit: Client not found in Kerberos database while getting initial credentials

我不知道它到底在做什么,但如果我用 WireShark 来测试它:

Linux sends AS-REQ to Windows with content
    cname name-string 2 items
    KerberosString: HTTP
    KerberosString: centosserver.site.example.com
    realm: SITE.EXAMPLE.COM
Windows replies KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN 
    error-code eRR-C-PRINCIPAL-UNKNOWN (6)

在 Windows 上,如果我使用setspn -L centos它,显示注册的主体名称包括 HTTP/centos.site.example.com。

在我的 Windows 桌面客户端上,如果我klist get HTTP/centos.site.example.com收到一张显示为客户端的票:[电子邮件保护]、服务器:HTTP/centos.site.example.com。

感觉有点像http://support.microsoft.com/kb/951191- 但这仅适用于 Windows Server 2008 原始版本,Service Pack 2 之前版本。这是 Windows Server 2008 R2 Service Pack 1。我尝试将其指向另一个域控制器,但它也运行相同的 Windows Server 版本并以相同的方式响应。

在 Linux 方面:我一直在使用 CentOS 6.5(Samba 3.x、Kerberos 5.0),但我也全新安装了 CentOS 7(Samba 4.x 和 Kerberos 5.1),并尝试了相同的设置,并从 kinit 获得了相同的结果。我还没有在 CentOS 7 上尝试过 Apache。

SSH 的无密码登录有效。针对 AD 的登录身份验证与 kinit 配合使用。Kerberos 身份验证在 Apache 中不起作用,它似乎甚至没有在 Apache 中尝试,或记录任何错误。我错过了什么,为什么它不尝试 Kerberos 身份验证?我可以测试或做什么来让它记录更多?

我唯一能明确让它失败的就是我在互联网上找到的命令 ^,但我不知道它到底在测试什么。它在做什么,为什么它不起作用,而显然,我的桌面可以向 AD 查询相同的服务主体并得到答案?

[编辑更新]

我按照 natxo asenjo 的回答“以不同的方式做”,现在我有一个有效的设置。我还接受在 AD 中为每个服务设置不同的用户名,然后创建单独的密钥表,这是合理的(例如,如果 Apache 受到攻击并且它可以读取的 HTTP/密钥表受到攻击,则 HOST/密钥表仍然安全一段时间)。

但是,我不知道为什么使用我原来的方法无法对 Windows 进行 Kerberos 主体查找。这很令人沮丧,因为像http://requesttracker.wikia.com/wiki/Kerberos_SSO_with_Active_Directory_Integrationhttp://wiki.gentoo.org/wiki/Kerberos_Windows_Interoperability使用 Samba net ads 命令将多个主体放在与计算机帐户绑定的一个 keytab 中,并(大概)从中获得一个有效的设置。

答案1

我已经按照说明进行操作http://www.grolmsnet.de/kerbtut/很多次,因为它们有效。顺便说一下,您不需要将 Linux 主机加入 AD 域,这样做是可以的,但不是必要的。

首先,确保您可以从 centos 主机 kinit 到您的 AD 领域。您可以像这样使用您的普通用户凭据:

$ kinit [email protected]

(顺便说一下,kinit 是 centos 中 krb5-workstation 包的一部分)

输入您的密码,没有消息就是好消息。运行 klist,您应该会看到一个 kerberos 票证作为您的 AD 用户名。如果此步骤不成功,请返回并修复您的 krb5.conf,直到成功为止。

使用 kdestroy 摆脱该票。

一旦成功,您就可以在 AD 中创建一个用户帐户。确保它不必更改密码,并且密码不会过期。

然后我们在具有管理工具的 Windows 主机上或域控制器中以管理员或具有足够权限的帐户身份使用 setspn.exe 将服务主体名称 (spn) HTTP/host.adrealm.tld 绑定到该用户帐户:

setspn -A HTTP/host.adrealm.tld username [enter]
Registering ServicePrincipalNames for CN=username,OU=service_accounts,dc=adrealm,DC=tld
        HTTP/host.adrealm.tld
Updated object

现在我们可以使用 ktpass.exe(仍在 Windows 管理主机或域控制器中)为该对象生成密钥表:

ktpass -princ HTTP/[email protected] -pass xxxxx -mapuser username -Ptype KRB5_NT_PRINCIPAL -out host_adrealm_tld.keytab [enter]
Targeting domain controller: DCname.Adrealm.tld
Successfully mapped HTTP/host.adrealm.tld to username.
Password succesfully set!
Key created.
Output keytab to host_adrealm_tld.keytab:
Keytab version: 0x502
keysize 75 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL)
vno 3 etype 0x17 (RC4-HMAC) keylength 16 (0x037da0f7493b97966e4a19636304064d)

将此文件传输到 centos 主机并将其放置在 /etc/httpd/conf.d/ 中,权限为 640(root:apache)。如果启用了 selinux,请运行 restorecon -rv /etc 以最终修复那里的 selinux 上下文。

您可以使用以下命令验证 keytab 文件:

$ klist -k -t host_adrealm_tld.keytab 
Keytab name: FILE:host_adrealm_tld.keytab
KVNO Timestamp         Principal
---- ----------------- --------------------------------------------------------
   3 01/01/70 01:00:00 HTTP/[email protected]

您甚至可以更进一步使用它来登录:

# kinit -k -t host_adrealm_tld.keytab -p HTTP/[email protected]
# klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: HTTP/[email protected]

Valid starting     Expires            Service principal
11/04/14 21:45:41  11/05/14 07:45:41  krbtgt/[email protected]
    renew until 11/05/14 21:45:41

在您的 DNS 基础架构中(也可能在 AD DNS 中),创建一个指向 centos 主机的 A host.realm.tld(如果您使用 samba 加入主机,它应该已经为您创建了它,请确保它是正确的)。

确保您的 centos 主机已安装 mod_auth_kerb。

您可以编辑您的(虚拟)主机的其中一个 apache conf 文件来安装 apache。

在这种情况下,让我们保护文件夹http://host.adrealm.tld/topsecret

Alias /topsecret/ "/path/to/topsecret/"

<Directory "/path/to/topsecret/">

    AuthType  Kerberos
    KrbAuthRealms YOURAD.TLD
    KrbServiceName HTTP
    Krb5Keytab /etc/httpd/conf.d/host_adrealm_tld.keytab
    KrbMethodNegotiate on
    KrbMethodK5Passwd off
    require valid-user

</Directory>

在 centos 主机的文件系统中创建 topsecret 文件夹。在其中设置几个虚拟文件。如果您在启用 selinux 的情况下运行,请确保该文件夹具有适合 apache 的安全上下文(如果文件夹位于 /var/www/html 中,则应该正确,运行 restorecon -rv /var/www/html 最终将修复所有 selinux 问题)。

验证 apache2 语法是否通过:

apachectl -t

如果您收到“语法正常”并出现无法可靠地确定主机 fqdn 的警告,则表示一切正常(您可以稍后再修复此问题,但这并不重要)。重新加载 apache:

apachectl graceful 

验证您的本地防火墙允许 httpd 连接。

就是这样。现在您需要配置客户端。如果您的网络中已经有使用“Windows 身份验证”的 Web 服务器,那么您就设置好了,转到 topsecret url,如果您有有效的 kerberos 票证,您应该可以看到文件,否则您将被拒绝访问。

相关内容