如何设置Ubuntu + Apache + Active Directory?

我有我们的内联网上的一个盒子的Ubuntu和Apache + PHP + MySQL工作正常。 该框只能通过IP地址(当前)访问。 现在我想设置它,以便已经通过企业Active Directory服务器进行身份validation的用户可以连接到网站,并将AD用户名stream向PHP,而无需用户再次提供AD凭据。 我听说这叫做SSPI,但是这显然是一个Windows的东西。 我发现在Linux下这样做有几十万个不同的指南,涉及到编辑各种configuration文件,而且没有一个指南对我有意义,因为他们中的大多数都试图在这个过程中设置Samba共享,而我只是需要对AD进行纯validation。 我得到的最接近的是当它最终join了一个域时,“同样开放”,但是后来我发现让Apache与“同样开放”一起工作的指示在这之后没有任何意义。 我遵循的指示说,将有一个“/ opt / likewise /”目录包含适当的Apache二进制文件,但“/ 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 

'同样开放'被安装,'domainjoin-cli'表示该框join了域(THEBOX),并且lw-get-status返回了一堆看起来很熟悉的东西。

以前有'winbind'和'libapache2-mod-auth-ntlm-winbind'(从第一次尝试开始,它从来没有成功join域)。

我愿意重新开始,如果有一个容易跟随和实际工作的新手指南。

准确地说,我需要做些什么才能使Apache与AD交谈?

Kerberos是你的朋友! (AD实际用于Auth的是什么)

如何在PHP中使用Kerberos

Soureforge Source&如何将Kerberos模块安装到Apache中

您可能需要:libapache2-mod-auth-curb首先,按照:

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


全文:

configurationApache以使用Kerberos身份validation背景

Kerberos是一种支持单点login(SSO)概念的身份validation协议。 在会话开始时进行了一次validation,用户可以在整个Kerberos领域访问networking服务,而无需再次进行身份validation。 为了这个工作,有必要使用Kerberos感知的networking协议。

在HTTP的情况下,通常使用SPNEGOauthentication机制(简单和受保护的GSS-API协商)来提供对Kerberos的支持。 这也被称为“综合authentication”或“协商authentication”。 Apache本身不支持SPNEGO,但可以通过mod_auth_kerb身份validation模块添加支持。 脚本

假设您希望限制访问网站http://www.example.com/ 。 身份validation将使用Kerberos和SPNEGO执行。 该网站无需访问非SPNEGO的网页浏览器。

要访问的用户是Kerberos EXAMPLE.COM的成员,并且被命名为dougal,brian,ermintrude和dylan。 领域可以使用主要的bofh / admin进行pipe理。 先决条件

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

Apache应该处于可以从相关网站请求至less一个页面用于testing目的的状态。 它不需要包含任何真实的内容(如果确实如此),那么您可能需要采取措施将服务器与未经授权的用户隔离,直到其得到适当的保护。

Kerberos应处于已将EXAMPLE.COMconfiguration为缺省领域的状态,并且可以在Web服务器上获得该领域的故障单。 方法概述

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

安装mod_auth_kerbauthentication模块。 为Web服务器创build一个服务主体。 为服务主体创build一个keytab。 指定要使用的身份validation方法。 指定授权用户的列表。 重新加载Apacheconfiguration。

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

configurationFirefox使用SPNEGO和Kerberos进行身份validation

安装mod_auth_kerbauthentication模块

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

 apt-get install libapache2-mod-auth-kerb 

以及由包mod_auth_kerb在基于Red Hat的系统上:

 yum install mod_auth_kerb 

Apache模块在使用之前必须被加载,但是上述两个软件包都会自动进行安装。 如果因为任何原因你需要手动完成这个工作,那么相应的configuration指令是:

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

(模块的path名应该replace为适合您的系统的path)。 为Web服务器创build一个服务主体

SPNEGO要求为Web服务器创build一个Kerberos服务主体。 服务名称被定义为HTTP,因此对于服务器www.example.com,所需的服务主体名称是HTTP / http://[email protected]。

如果您使用的是MIT Kerberos,则可以使用kadmin命令创build服务主体:

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

请参阅microHOWTO使用MIT Kerberos创build服务主体以获取有关如何创build服务主体以及为什么需要创build服务主体的更多信息。 为服务主体创build一个keytab

密钥表是用于存储对应于一个或多个Kerberos主体的encryption密钥的文件。 mod_auth_kerb需要一个才能使用上面创build的服务主体。 如果您正在使用MIT Kerberos,则可以使用kadmin命令创build密钥表(如服务主体)。 它的所有权必须能够被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的path名,如果它不存在,将会创build它。

请参阅microHOWTO使用MIT Kerberos将主机或服务主体添加到密钥表中以获取有关创build密钥表及其用途,以及为什么默认密钥表(通常为/etc/krb5.keytab)不适用于networking服务不要以root身份运行。

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

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

指定要使用的身份validation方法

必须告诉Apache哪些网站的哪些部分使用由mod_auth_kerb提供的authentication。 这是通过使用Kerberos值的AuthType指令完成的。 然后需要一些更多的指令来configurationmod_auth_kerb应该如何工作。

如果意图是将这些指令应用于整个给定的网站,则可以将它们放置在具有对应于网站根目录的path的容器中:

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

AuthName指令指定HTTP授权领域。 其目的是为了向用户指示他可能知道哪些密码需要访问特定的网站。 使用真正的Kerberos身份validation应该没有密码提示,并且mod_auth_kerb看起来工作得很好,没有指定AuthName; 然而,Apache文档指出这是必需的,所以无论如何提供一个似乎是谨慎的。 适当的值可能是域名,Kerberos领域的名称或网站所属组织的名称。

除了SPNEGO协议之外,mod_auth_kerb还能够使用基本身份validation询问用户密码,然后通过尝试向KDC进行身份validation来validation该密码。 如果Web站点的授权用户需要从不属于Kerberos领域的机器访问Web站点,那么这会非常有用,但是它的安全性远低于真正的Kerberos身份validation。 SPNEGO和密码authentication都是默认启用的。 在这个例子中,没有要求非SPNEGO的Web浏览器访问站点,所以使用KrbMethodK5Passwd指令禁用了密码authentication。 为了完整起见,已经使用KrbMethodNegotiate指令明确启用了SPNEGO。

Krb5Keytab指令指定添加了HTTP服务主体的keytab的path名。 它应该匹配在本程序中早先传递给kadmin的ktadd命令的任何内容。

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

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

在这个例子中,只有四个用户需要访问,最简单的方法是通过Require指令进行安排:

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

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

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

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

 service apache2 force-reload 

安全考虑密码authentication

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

 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来解决这些问题中的第一个问题。 第二点和第三点不那么容易理解,并且破坏了单点login模型提供的安全优势,特别是Kerberos。

在实践中,有时需要允许来自不属于Kerberos域的主机的访问,或者允许来自不支持SPNEGO的用户代理的访问。 由于这个原因,build议密码validation永远不应该被用作回退是不现实的,但是如果你可以并且不应该仅仅因为它被默认启用就被允许,那么最好避免这种情况。 SPNEGO

使用SPNEGO的authentication解决了上面列出的问题,但是与HTTP集成的方式远非理想。 当客户端向Kerberosnetworking服务进行身份validation时,身份validation过程的产品之一是客户端和服务器可以使用的encryption密钥来保护它们之间的任何进一步通信。 当使用SPNEGO对HTTP连接进行身份validation时,这不会被使用,这意味着如果连接在身份validation完成后被劫持,则没有什么可以阻止攻击者发布未经授权的HTTP命令。

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