如何设置 Ubuntu + Apache + Active Directory?

如何设置 Ubuntu + Apache + Active Directory?

我已经在我们的 Intranet 上的一个盒子上安装了 Ubuntu 和 Apache + PHP + MySQL,它们运行良好。目前,该盒子只能通过 IP 地址访问。现在我想设置它,以便已经通过企业 Active Directory 服务器进行身份验证的用户可以连接到网站,并让 AD 用户名流到 PHP,而无需用户再次提供他们的 AD 凭据。我听说这叫做 SSPI,但这显然是 Windows 独有的。我发现似乎有无数不同的指南在 Linux 下执行此操作,其中涉及编辑各种配置文件,但这些指南对我来说都毫无意义,因为大多数指南都试图在此过程中设置 Samba 共享,而我只需要针对 AD 进行纯粹的身份验证。我得到的最接近的结果是当它最终加入域时使用“likewise-open”,但之后我发现的让 Apache 使用“likewise-open”的说明没有任何意义。我遵循的说明说会有一个包含适当 Apache 二进制文件的“/opt/likewise/”目录,但“/opt”中没有任何内容(它是一个空目录)。

假设以下情况:

AD server primary DC hostname:  ad.primarydc.com (parent company owns this)
AD server primary DC IP:  172.130.0.25
Our AD domain:  MAIN (main.ad.primarydc.com)
Our AD domain IP:  10.1.134.67
Our AD admin account that can join computers to the domain:  MAIN\admin
Ubuntu box IP:  10.1.134.15
Ubuntu box name:  thebox
Ubuntu 12.04.2 LTS

安装了“likewise-open”,“domainjoin-cli”表示该盒子加入了域(THEBOX),并且 lw-get-status 返回了一堆看起来很熟悉的东西。

之前已安装了“winbind”和“libapache2-mod-auth-ntlm-winbind”(从第一次尝试开始。但它从未成功加入域)。

如果有一本针对新手的、易于遵循且真正有效的指南,我愿意重新开始。

我究竟需要做什么才能让 Apache 与 AD 对话?

答案1

Kerberos 是你的朋友!(它实际上是 AD 用于身份验证的)

如何在 PHP 中使用 Kerberos

Soureforge 源代码 & 如何在 Apache 中安装 Kerberos 模块

您可能首先需要:libapache2-mod-auth-kerb,如下所示:

http://www.microhowto.info/howto/configure_apache_to_use_kerberos_authentication.html


全文:

配置 Apache 使用 Kerberos 身份验证背景

Kerberos 是一种支持单点登录 (SSO) 概念的身份验证协议。在会话开始时进行一次身份验证后,用户无需再次进行身份验证即可访问整个 Kerberos 域中的网络服务。要实现这一点,必须使用支持 Kerberos 的网络协议。

对于 HTTP,通常使用 SPNEGO 身份验证机制(简单且受保护的 GSS-API 协商)来提供对 Kerberos 的支持。这也称为“集成身份验证”或“协商身份验证”。Apache 本身不支持 SPNEGO,但可以通过 mod_auth_kerb 身份验证模块添加支持。场景

假设您希望限制对网站的访问http://www.example.com/. 身份验证将使用 Kerberos 和 SPNEGO 进行。该网站无需可供未启用 SPNEGO 的 Web 浏览器访问。

被授予访问权限的用户是 Kerberos 领域 EXAMPLE.COM 的成员,名为 dougal、brian、ermintrude 和 dylan。可以使用主体 bofh/admin 来管理该领域。先决条件

下面的描述假设您已经在 Web 服务器上安装了 Apache 和 Kerberos。

Apache 应处于这样的状态:您可以从相关网站请求至少一个页面以进行测试。它不需要包含任何实际内容(如果包含,那么您可能需要采取措施将服务器与未经授权的用户隔离,直到服务器得到妥善保护为止)。

Kerberos 应处于 EXAMPLE.COM 已配置为默认领域的状态,并且可以在 Web 服务器上获取该领域的票证。方法概述

这里描述的方法有六个步骤:

安装 mod_auth_kerb 身份验证模块。为 Web 服务器创建服务主体。为服务主体创建密钥表。指定要使用的身份验证方法。指定授权用户列表。重新加载 Apache 配置。

请注意,除了在 Web 服务器上启用 SPNEGO 之外,可能还需要在 Web 浏览器中明确启用它。Mozilla Firefox 就是这种情况。请参阅:

配置 Firefox 使用 SPNEGO 和 Kerberos 进行身份验证

安装 mod_auth_kerb 认证模块

如上所述,Apache 本身不提供对 SPNEGO 的支持,但可以使用模块 mod_auth_kerb 添加。大多数主流 GNU/Linux 发行版都包含该模块,但由于它是第三方模块,因此通常与 Apache 分开打包。在基于 Debian 的系统上,它由软件包 libapache2-mod-auth-kerb 提供:

apt-get install libapache2-mod-auth-kerb

在基于 Red Hat 的系统上,可以使用 mod_auth_kerb 软件包:

yum install mod_auth_kerb

Apache 模块必须先加载才能使用,但上述两个软件包都安排自动加载。如果出于任何原因您需要手动执行此操作,则适当的配置指令是:

LoadModule auth_kerb_module /usr/lib/apache2/modules/mod_auth_kerb.so

(模块的路径名应替换为适合您系统的任何路径名)。为 Web 服务器创建服务主体

SPNEGO 要求为 Web 服务器创建 Kerberos 服务主体。服务名称定义为 HTTP,因此对于服务器 www.example.com,所需的服务主体名称为 HTTP/[电子邮件保护]

如果您使用 MIT Kerberos,那么可以使用 kadmin 命令创建服务主体:

kadmin -p bofh/admin -q "addprinc -randkey HTTP/www.example.com"

有关如何创建服务主体以及为什么需要服务主体的更多信息,请参阅 microHOWTO 使用 MIT Kerberos 创建服务主体。为服务主体创建密钥表

keytab 是用于存储与一个或多个 Kerberos 主体对应的加密密钥的文件。mod_auth_kerb 需要一个 keytab 才能使用上面创建的服务主体。如果您使用的是 MIT Kerberos,则可以使用 kadmin 命令创建 keytab(如服务主体)。它的所有权必须能够被 Apache 进程读取。

在基于 Debian 的系统上,keytab 的合适位置是 /etc/apache2/http.keytab,适当的所有者是 www-data:

kadmin -p bofh/admin -q "ktadd -k /etc/apache2/http.keytab HTTP/www.example.com"
chown www-data /etc/apache2/http.keytab

在基于 Red Hat 的系统上,合适的位置是 /etc/httpd/http.keytab,适当的所有者是 apache:

kadmin -p bofh/admin -q "ktadd -k /etc/httpd/http.keytab HTTP/www.example.com"
chown apache /etc/httpd/http.keytab

-k 选项指定 keytab 的路径名,如果该路径名不存在,则会创建该路径名。

有关密钥表的创建、其用途以及为什么默认密钥表(通常为 /etc/krb5.keytab)不适合非以 root 身份运行的网络服务使用的更多信息,请参阅 microHOWTO 使用 MIT Kerberos 将主机或服务主体添加到密钥表。

如果您希望检查密钥是否已正确添加到密钥表,那么您可以尝试使用它来作为服务主体进行身份验证,然后使用 klist 查看生成的票证授予票证:

kinit -k -t /etc/apache2/http.keytab HTTP/www.example.com
klist

指定要使用的身份验证方法

必须告知 Apache 哪些网站的哪些部分要使用 mod_auth_kerb 提供的身份验证。这可以通过使用值为 Kerberos 的 AuthType 指令来完成。然后需要一些进一步的指令来配置 mod_auth_kerb 的行为方式。

如果目的是将这些指令应用于整个给定的网站,那么可以将它们放置在具有与网站根目录相对应的路径的容器中:

<Location />
 AuthType Kerberos
 AuthName "Acme Corporation"
 KrbMethodNegotiate on
 KrbMethodK5Passwd off
 Krb5Keytab /etc/apache2/http.keytab
</Location>

AuthName 指令指定 HTTP 授权领域。其目的是向用户指出他可能知道的各种密码中的哪一个是访问特定网站所需的。对于真正的 Kerberos 身份验证,应该不会出现密码提示,并且 mod_auth_kerb 似乎可以在没有指定 AuthName 的情况下完美运行;但是 Apache 文档指出它是必需的,因此无论如何提供一个似乎是明智的。合适的值可能是域名、Kerberos 领域的名称或网站所属组织的名称。

除了 SPNEGO 协议之外,mod_auth_kerb 还能够使用基本身份验证要求用户输入密码,然后通过尝试向 KDC 进行身份验证来验证该密码。如果需要让授权用户从不属于 Kerberos 领域的机器访问网站,这可能很有用,但它的安全性明显低于真正的 Kerberos 身份验证。默认情况下,SPNEGO 和密码身份验证均已启用。在此示例中,无需让未启用 SPNEGO 的 Web 浏览器访问网站,因此已使用 KrbMethodK5Passwd 指令禁用密码身份验证。为了完整起见,已使用 KrbMethodNegotiate 指令明确启用了 SPNEGO。

Krb5Keytab 指令指定已添加 HTTP 服务主体的 keytab 的路径名。它应该与在此过程中先前传递给 kadmin 的 ktadd 命令的内容相匹配。

虽然本例中使用了容器,但将上述指令放在 、 或 容器或 .htaccess 文件中也是可以接受的。指定授权用户列表

设置身份验证方法本身并不会限制对服务器的访问。这是因为 Apache 默认允许匿名用户访问,除非该行为被覆盖,否则将不会调用身份验证方法(无论它是什么)。

在此示例中,只有 4 个用户需要访问权限,而安排此权限的最简单方法是通过 Require 指令:

<Location />
 # ...
 Require user [email protected] [email protected] [email protected] [email protected]
</Location>

请注意,每个名称都由其所属的 Kerberos 领域限定。

对于拥有大量用户的服务器,这显然不是一个可扩展的解决方案,但是 Apache 还有其他可以有效处理大量用户的授权方法,包括 mod_authz_dbd 和 mod_authnz_ldap。重新加载 Apache 配置

请参阅使系统服务重新加载其配置。在最近的基于 Debian 的系统上,所需的命令是:

service apache2 force-reload

安全注意事项 密码验证

如上所述,mod_auth_kerb 能够使用 HTTP 基本身份验证从 Web 浏览器请求用户名和密码,然后使用 Kerberos 检查该用户名和密码是否有效。与真正的 Kerberos 身份验证相比,这种方法有三个严重缺点:

The password is sent unencrypted as part of the HTTP stream.
The password is exposed to the Apache server.
The password must be entered mid-session.

第一个问题可以通过启用 TLS (SSL) 访问并禁用纯 HTTP 来解决。第二个和第三个问题不太容易处理,并且会破坏单点登录模型(尤其是 Kerberos)提供的许多安全优势。

实际上,有时需要允许来自不属于 Kerberos 域的主机或不支持 SPNEGO 的用户代理的访问。因此,建议永远不要使用密码身份验证作为后备是不切实际的,但是,如果您可以并且不应该仅仅因为它默认启用而被允许,则最好避免使用密码身份验证。SPNEGO

使用 SPNEGO 进行身份验证解决了上述问题,但它与 HTTP 集成的方式远非理想。当客户端向 Kerberos 网络服务进行身份验证时,身份验证过程的产物之一是加密密钥,客户端和服务器可以使用该密钥来保护它们之间的任何进一步通信。当使用 SPNEGO 对 HTTP 连接进行身份验证时,不会使用该密钥,这意味着如果在身份验证完成后连接被劫持,那么就无法阻止攻击者发出未经授权的 HTTP 命令。

通过使用 TLS (SSL) 保护连接,可以大大降低这种风险。这可以防止连接在建立后被劫持,并防止服务器接受到没有有效证书的网站的连接。由于可以颁发证书的组织数量众多,因此这不是一个完美的解决方案。有一种解决方案使用通道绑定将 TLS 密钥链接到 Kerberos,但在撰写本文时,它尚未得到广泛实施(并且不受 mod_auth_kerb 支持)。

相关内容