我的目标是让 Apache 使用 Kerberos 对 AD 进行身份验证,而不提示输入用户名和密码。它目前总是显示“401 Unauthorized”,并且似乎没有尝试 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").
配置主机名和 DNS,并在 Windows DNS 服务器中添加 A 和 PTR 条目。名称解析显示正常。
创建
/etc/krb5.conf
、/etc/samba/smb.conf
使用authconfig-tui
和调整它们。
krb5.conf
`/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 设置步骤:
net ads join createupn=HOST/[email protected] -k -U administrator
要求我输入 Windows 密码,然后接受。它加入域(在 AD 中创建计算机对象)。net ads testjoin
报告“加入正常”。net ads keytab create -k -U administrator
创建并用排列/etc/krb5.keytab
填充它。HOST/centos....
net ads keytab add HTTP -k -t /etc/krb5.keytab -U administrator
将HTTP/centos.site.example.com
条目添加到 keytab。klist -ke
显示了许多 SPN 组合,包括HTTP/[email protected]
并且似乎将 KVNO 与服务器对象上的 Windows 的 msDS-KeyVersionNumber 属性相匹配。
此时,我可以使用 PuTTY 通过 SSH 连接,并使用 SSO 自动登录,无需密码提示。我可以通过 SSH 连接并强制提示密码,使用 Windows 用户名和密码登录。使用 Windows 帐户登录后,我可以kinit
看到klist
Kerberos 票证。我可以使用wbinfo -u
andwbinfo -g
来net ads search
查询 AD 并获得结果。
一切看起来都很好。让我们继续讨论 Apache:
chgrp apache /etc/krb5.keytab
chmod ugo+r /etc/krb5.keytab
yum install mod_auth_kerb
编辑
/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
得到一张票,显示为客户端:[email protected],服务器: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 中为每个服务使用不同的用户名,然后创建单独的 keytab 是合理的(例如,如果 Apache 被破坏并且它可以读取的 HTTP/keytab 被破坏,HOST/keytab 仍然是安全的)。
但是,我无法回答为什么 Kerberos 对 windows 的主要查找在我原来的方法中失败的原因。这是令人沮丧的,因为像http://requesttracker.wikia.com/wiki/Kerberos_SSO_with_Active_Directory_Integration和http://wiki.gentoo.org/wiki/Kerberos_Windows_Interoperability这样的指南使用 Samba 将多个主体放在一个与计算机帐户绑定的密钥表中net ads 命令,并且(大概)从中获得工作设置。
我已经多次使用http://www.grolmsnet.de/kerbtut/上的说明,因为它们有效。作为记录,您不需要将linux主机加入AD域,可以这样做但不是必需的。
首先,确保您可以从 centos 主机启动到您的 AD 领域。您可以像这样使用普通用户凭据:
(顺便说一下,kinit 是 centos 中 krb5-workstation 软件包的一部分)
输入您的密码,没有消息就是好消息。运行 klist,您应该会在那里看到一个 kerberos 票证作为您的 AD 用户名。如果此步骤不成功,请返回并修复您的 krb5.conf,直到成功为止。
用 kdestroy 摆脱那张票。
一旦成功,您就可以在 AD 中创建一个用户帐户。确保它不必更改其密码并且密码不会过期。
然后我们将服务主体名称 (spn) HTTP/host.adrealm.tld 绑定到该用户帐户,使用 setspn.exe 在具有管理工具的 Windows 主机上或在域控制器中作为管理员或具有足够权限的帐户:
现在我们可以使用 ktpass.exe(仍在 Windows 管理主机或域控制器中)为该对象生成密钥表:
将该文件传输到 centos 主机并将其以 640 权限(root:apache)放在 /etc/httpd/conf.d/ 中。如果启用了 selinux,则运行 restorecon -rv /etc 最终修复 selinux 上下文。
您可以使用以下方法验证密钥表文件:
您甚至可以通过使用它登录更进一步:
在您的 dns 基础设施中(可能也在 AD dns 中),创建一个指向 centos 主机的 A host.realm.tld(如果您使用 samba 加入它应该为您创建的主机,请确保它是正确的)。
确保您的 centos 主机已安装 mod_auth_kerb。
如果您编辑您的(虚拟)主机的 apache conf 文件之一以用于 apache。
在这种情况下,让我们保护文件夹http://host.adrealm.tld/topsecret:
在 centos 主机的文件系统中创建 topsecret 文件夹。在其中设置几个虚拟文件。如果您在启用 selinux 的情况下运行,请确保该文件夹具有正确的 apache 安全上下文(如果该文件夹位于 /var/www/html 中,它应该是正确的,运行 restorecon -rv /var/www/html 最终将修复任何 selinux 问题)。
验证 apache2 语法是否通过:
如果您收到“语法正常”并警告您无法可靠地确定主机 fqdn,那么您就可以开始了(如果需要,您可以稍后修复它,这并不重要)。重新加载阿帕奇:
验证您的本地防火墙是否允许 httpd 连接。
这应该是它。现在您需要配置客户端。如果您的网络中已经有带有“Windows 身份验证”的网络服务器,那么您已设置好,转到最高机密 url,如果您有有效的 kerberos 票证,您应该会看到这些文件,否则您将被拒绝访问。