将 MediaWiki 与 LDAP 集成

使用 ApacheDS 测试和配置对 MediaWiki 的 LDAP 身份验证

学习如何向 MediaWiki 添加轻型目录访问协议 (LDAP) 身份验证模块,允许它向 LDAP 目录验证用户。更深入地理解 MediaWiki、Apache Directory Services (ApacheDS) 和 Apache Directory Studio,以及如何使用它们创建用于测试的 LDAP 目录。

Nathan A. Good, Web 开发人员, 自由开发人员

Nathan GoodNathan A. Good 居住在明尼苏达州的双子城。他的专长是软件开发、软件架构和系统管理。平时不编写软件时,他喜欢组装 PC 和服务器、阅读和撰写技术文章,并鼓励他的所有朋友转用开源软件。他是许多书籍和文章的作者或合著者,包括 Professional Red Hat Enterprise Linux 3、Regular Expression Recipes: A Problem-Solution ApproachFoundations of PEAR: Rapid PHP Development



2012 年 4 月 24 日

开始之前

在本文中,您将学习将 MediaWiki 与 LDAP 绑定以实现身份验证。使用 LDAP 进行身份验证,您可以简化用户管理,所以无需在两个或更多不同位置维护用户和权限。因为许多 PHP 解决方案都具有 LDAP 身份验证支持,因此 LDAP 可能是您创建中央用户和组存储库的最佳选择。

开始之前,您需要以下软件:

  • PHP 5.1 或更高版本(访问 MediaWiki 站点,获取所需 PHP 版本的详细信息)
  • MySQL 4.0 或更高版本,或者 PostgreSQL 8.1 或更高版本
  • PHP LDAP 身份验证模块

参见 参考资料 获取链接。


MediaWiki

MediaWiki 是一个使用 PHP 实现的解决方案,提供了 wiki 功能,此功能使拥有正确权限的任何用户编辑网页的内容。有许多 MediaWiki 的实际应用示例,其中最流行的可能是 Wikipedia,它在全球拥有几百万用户(参见 参考资料)。

您可以免费下载 MediaWiki(参见 参考资料)。MediaWiki 提供了在下载之后在系统上安装 MediaWiki 的总体概述。


ApacheDS

ApacheDS 是一个使用 Java™ 语言编写的 LDAP 实现。它的跨平台性质使它成为了一种不错解决方案,可在几乎任何平台上进行测试和使用。

LDAP 是一个应用程序协议,它指定一种访问和存储目录信息的方法。通常,这些目录信息是以用户信息的形式存在,比如姓名、用户名和用户所属的组。您可以将 LDAP 用于任何地方,从企业电子邮件地址目录到身份验证和授权。

除了将 ApacheDS 用于服务,还可以安装 Apache Directory Studio 来帮助管理目录服务。它是一个 Eclipse 插件,提供了一个图形用户界面 (GUI) 可轻松浏览 LDAP 树,查看和编辑用户和组。


安装 ApacheDS

可通过两种方式安装 ApacheDS 来测试使用 MediaWiki 的身份验证:

  • 将 Apache Directory Studio 插件安装到 Eclipse 集成开发环境 (IDE) 中。
  • 仅安装 ApacheDS 服务器。

将 Apache Directory Studio 插件安装到 Eclipse IDE 中

当安装 Apache Directory Studio 插件时,会安装 ApacheDS 服务器的一个嵌入式版本供您运行和使用。对于本文其余内容,此解决方案是理想的选择,因为您可以迅速让该解决方案正常运行。

要安装 Apache Directory Studio,可以打开 Eclipse IDE,选择 Help > Install New Software,然后输入 Directory Services 更新站点 URL (http://directory.apache.org/studio/update/1.x)。确保选择了所有功能(参见 图 1),然后单击 Next 安装它们。

图 1. 在 Eclipse 中安装 Apache Directory Studio 功能
在 Eclipse 中安装 Apache Directory Studio 功能

如果同意条款和条件,则接受它们并继续操作。您需要重新启动 Eclipse,更改才能生效。

重新启动 Eclipse 后,选择 Window > Open Perspective 菜单选项切换到 LDAP 透视图。

要创建一个新服务器实例,可以单击 Server 选项卡并单击 Add 按钮。将新服务器命名为 local,完成后单击 Finish。您可以单击上下文菜单中的 Run 来启动该服务器。

您需要创建一个服务器连接,然后才能使用 LDAP 浏览器浏览它的 LDAP 目录。要创建服务器连接,可以在 Servers 选项卡上单击该服务器,并选择 LDAP Browser > Create Connection。该插件在 Connections 选项卡中创建一个新连接。

仅安装 ApacheDS 服务器

要仅安装 ApacheDS 服务器,从 ApacheDS 下载站点下载适合您的操作系统的二进制文件(参见 参考资料)。

如果使用二进制文件的压缩版本,在下载之后将它解压到一个文件夹。将文件解压到文件夹后,您需要设置一个示例分区来启动 ApacheDS 服务(参见 参考资料)。如果不设置示例分区,在尝试启动服务时会遇到错误。

当解压它之后,如果使用的是 Microsoft® Windows®,您可以运行 apacheds.bat。如果使用的是 Mac OS® X 或 Linux®,则运行 apacheds.sh shell 脚本。

要连接到刚刚创建的服务器,可以使用 LDAP Browser > Create Connection。您将在 Connections 选项卡中看到新连接。您还将在 LDAP Browser 选项卡中看到该连接的详细信息。


设置用户和组

在继续运行 MediaWiki 之前,应该设置一些用户和组来测试身份验证。如果您想直接导入一些样例用户和组,可以导入本文中包含的 LDAP 数据交换格式 (LDAP Data Interchange Format, LDIF) 文件(参见 下载)。

如果自行设置一种结构,应该通过从快捷菜单选择 New > Context Entry 来添加一个上下文条目。这允许您添加域组件和在其中添加用户和组的组织。

设置用户

使用 LDAP 浏览器设置用户的最简单方法是克隆一个现有的条目。ApacheDS 插件随带了一个已设置的用户 adminadmin 用户的 LDAP 专有名称 (Distinguished Name, DN) 是 uid=admin,ou=system。一个用户或组的 DN 是一个完全限定名称,用于惟一标识该实体。“配置身份验证” 一节将更详细地介绍 DN。

完成以下步骤,以克隆 admin 条目:

  1. 选择 LDAP > New Entry
  2. 选择 Create entry from scratch,如 图 2 所示。

    图 2. 从头创建一个新条目
    从头创建一个新条目
  3. 添加 inetOrgPerson 对象类,如 图 3 所示,然后单击 Next

    图 3. 添加 inetOrgPerson 对象类
    添加 inetOrgPerson 对象类
  4. 添加一个分配给 uid 的惟一用户名,如 图 4 所示,然后单击 Next

    图 4. 定义新用户的 uid 字段
    定义新用户的 uid 字段
  5. 添加 cnsn 字段的值,如 图 5 所示,然后单击 Finish

    图 5. 设置新用户的值
    设置新用户的值

现在您已创建了用户,可以在 LDAP 浏览器中找到它,如 图 6 所示。

图 6. 在 LDAP 浏览器中查看新用户
在 LDAP 浏览器中查看新用户

要编辑 LDAP 条目,可以在列表中单击该条目,然后从上下文菜单选择 Edit Entry 或按 F7 键。通过编辑条目,您可以更改用户的名称 (cn) 和用户名称的显示方式 (displayName)。确保您将用户的密码更改为了在从 MediaWiki 测试登录时会记住的某个字符组合。

设置组

可以选择 New > Entry 来设置用户的组。在 Object Classes 窗口中,选择 groupOfUniqueNames 对象类,如 图 7 所示。

图 7. 使用 groupOfUniqueNames 对象类
使用 groupOfUniqueNames 对象类

现在执行与设置用户相同的步骤,但定义组名称的 cn 字段,而不是使用 uid 字段。您可以在 uniqueMember 属性的值中添加一个用户的 DN。图 8 展示了在完成后组在 LDAP 浏览器中的显示效果。

图 8. LDAP 浏览器中显示的组详细信息
LDAP 浏览器中显示的组详细信息

现在您已设置了用户和组,您已配置了 MediaWiki,并添加了合适的扩展来对 LDAP 目录进行身份验证。


安装 MediaWiki

要安装 MediaWiki,从 MediaWiki 站点(参见 参考资料)下载该压缩文件。安装 MediaWiki 的大体步骤如下:

  1. 将压缩文件的内容解压到一个可供 Web 服务器使用的文件夹。
  2. 在浏览器中,导航到 config 目录(例如 http://localhost/mediawiki/config/index.php)。
  3. MediaWiki 安装程序将引导您执行剩余步骤。

要了解安装 MediaWiki 的更多信息,请参见 参考资料 获取完整的安装指南。


安装 MediaWiki LDAP 模块

当 MediaWiki 能够正常运行后,您需要安装 MediaWiki LDAP 模块来绑定到 ApacheDS 实例和验证用户。

要安装该模块,请访问 MediaWiki 的 LDAP Authentication 扩展的站点(参见 参考资料)并下载快照。将扩展解压到 mediawiki/extensions 文件夹,使您的扩展文件夹看起来类似于 清单 1

清单 1. MediaWiki extensions 文件夹的内容
mwuser@umediawiki161:/var/www/mediawiki/extensions$ ls
LdapAuthentication  README

现在您已将扩展安装到正确的文件夹中,可以修改 LocalSettings.php 文件来添加扩展的配置值。


配置身份验证

配置该模块来用于 LDAP 可能是该过程中最困难的部分。LDAP 中的名称不容易理解,所以如果您不知道它们的含义,很难正确获得它们。

在一个目录中,在 objectClass 字段中为各个条目提供了类目标。一定要记住,一个条目可包含具有相同字段的多个实例,但使用不同的值。任何条目都可包含多于一个 objectClass 字段值对。

这些类描述该条目上需要和允许哪些字段。例如,一个组就是一个包含 groupOfUniqueNames 对象类的条目。包含此类的条目可以有一个或多个 uniqueMember,后者包含该组某一位成员(用户)的 DN。另一方面,用户通常是用于身份验证的 inetOrgPerson 类型的条目。

在 ApacheDS 中,您可以配置包含用户和组的 DN 的条目。前面已经提到,用户或组的 LDAP DN 是一个惟一标识该实体的完全限定名称。DN 包含 LDIF 字段的一个逗号分隔路径,设定一个范围并完全限定该对象。如果 DN 表示一个用户,那么该 DN 可包含通用名称 (cn) 或用户标识符 (uid)。

例如,假设您的新 ApacheDS 目录中有一位用户,比如 editor1,DN 可能为 uid=editor1,ou=users,o=wiki,dc=mywiki,dc=com表 1 包含有关此 DN 中的字段的更多信息。

表 1. DN 中出现的字段
字段示例描述
uideditor1用户名称的惟一标识符,通常为用户的登录名。
ouusers用户所属的组织单元名称。
owiki组织名称。
dcdc=mywiki,dc=com组织的域组件。这通常对应于 Internet 域名。例如这个 dc 条目可能对应于 mywiki.com。

组的指定方式与用户非常相似,其中惟一标识该组的字段可能是通用名称 (cn) 字段,而不是 uid。一个示例组 DN 是 cn=wikiusers,ou=groups,o=wiki,dc=mywiki,dc=com

请参见 参考资料 获取 LDIF 的更多信息。

有了对 LDAP 中的 DN 的基本理解,要了解如何配置就会容易一些。要向 MediaWiki 添加配置,可以编辑 MediaWiki 主目录中的 LocalProperties.php 文件,添加 清单 2 中所示的代码。

清单 2. LocalSettings.php 中的配置代码
require_once("$IP/extensions/LdapAuthentication/LdapAuthentication.php");

$wgAuth = new LdapAuthenticationPlugin();

$wgLDAPDomainNames = array("ApacheDS"); 
$wgLDAPServerNames = array("ApacheDS" => "ldap.example.com"); 
$wgLDAPPort = array("ApacheDS" => 10389); 
$wgLDAPEncryptionType = array( "ApacheDS" => "clear"); 

$wgLDAPProxyAgent = array( 
    "ApacheDS"=>"uid=proxyuser,ou=users,o=wiki,dc=mywiki,dc=com");
$wgLDAPProxyAgentPassword = array( "ApacheDS"=>"password"); 
$wgLDAPGroupUseRetrievedUsername = array("ApacheDS"=>true);
$wgLDAPSearchAttributes = array( "ApacheDS" => "uid");
$wgLDAPBaseDNs = array( "ApacheDS"=>"dc=mywiki,dc=com");
$wgLDAPGroupBaseDNs = array( "ApacheDS"=>"ou=groups,o=wiki,dc=mywiki,dc=com");
$wgLDAPUserBaseDNs = array( "ApacheDS"=>"ou=users,o=wiki,dc=mywiki,dc=com");

$wgLDAPGroupUseFullDN = array( "ApacheDS"=>true ); 
$wgLDAPLowerCaseUsername = array( "ApacheDS"=>true); 
$wgLDAPGroupObjectclass = array( "ApacheDS"=>"groupofuniquenames" );
$wgLDAPGroupAttribute = array( "ApacheDS"=>"uniquemember" );
$wgLDAPGroupNameAttribute = array( "ApacheDS"=>"cn" );

$wgLDAPRequiredGroups = array( "ApacheDS" => 
    array("cn=WikiUsers,ou=groups,o=wiki,dc=mywiki,dc=com"));
$wgLDAPGroupSearchNestedGroups = array( "ApacheDS"=>false );

可以看到,所有条目都是分配给数组的变量。在每个数组中,将一个条目分配给了一个键,这个键是您为 $wgLDAPDomainNames 变量选择的名称。

表 2 中所示的信息配置域和主机信息。

表 2. 用于配置域和主机信息的变量
配置描述
$wgLDAPDomainNames身份验证范围的名称。这些元素在一个下拉框中向用户显示,所以请选择对用户有意义的名称。名称可以是任何随意的值,但其他配置键会在它们的数组中使用这些名称。
$wgLDAPServerNames运行 LDAP 服务的服务器的主机名。
$wgLDAPPortLDAP 的端口,如果该端口为非标准端口。因为默认的 LDAP 端口(389、636 用于基于 SSL 的 LDAP)低于 1024,所以您可能需要提升特权才能绑定到该端口。
$wgLDAPEncryptionType为 LDAP 连接所使用的加密类型。在生产部署中或当您使用实际用户信息时,不要使用除 tlsssl 外的任何类型。

配置了域和主机信息后,就可以设置用于绑定到 LDAP 目录的用户了。也可以允许匿名访问,但这可能不符合您的安全目标。代理用户设置如 表 3 中所示。

表 3. 设置一个代理用户来绑定 LDAP
配置描述
$wgLDAPProxyAgent用户用于绑定到 LDAP 的完整 DN。不要使用 LDAP 管理用户。
$wgLDAPProxyAgentPassword代理用户的密码。

将代理用户成功绑定到 LDAP 目录之后,您需要指定要在其中搜索用户信息的基础 DN。这些配置设置将在 表 4 中更详细地解释。

表 4. 基础 DN 的配置设置
配置描述
$wgLDAPGroupUseRetrievedUsername将此设置为 true,以使用从 LDAP 检索到的用户名称。这有助于确保在过滤包含该用户的组时使用正确的值。
$wgLDAPSearchAttributes使用登录名搜索的 LDIF 字段的名称。在大部分情况下,这应该为 uid
$wgLDAPBaseDNs用于搜索的基础 DN。您应该将此设置为域或组织的 DN。
$wgLDAPGroupBaseDNsLDAP 目录中的组的基础 DN。
$wgLDAPUserBaseDNsLDAP 目录中用户的基础 DN。

表 5 中所示的设置来控制组的访问。

表 5. 基于组的身份验证的配置设置
配置描述
$wgLDAPGroupUseFullDN如果设置为 true,会使用组的完整 DN 进行绑定。因为明确地代表该组,所以在这里使用 true。
$wgLDAPLowerCaseUsername如果设置为 true,则转换或保持用户登录名为小写。
$wgLDAPGroupObjectclass包含您的用户的组的对象类名称。本文中的示例使用 groupOfUniqueNames 类。您可以在这里键入全小写的值。
$wgLDAPGroupAttribute在组中查找该字段来找到用户的 DN。对于 groupOfUniqueNames 类,这是 uniqueMember 字段。该值可以为小写形式。
$wgLDAPGroupNameAttribute组名称属性。在本文的示例中,该属性为 cn
$wgLDAPRequiredGroups这个变量允许您按组限制访问。它应该包含组的完整 DN,该组包含能够访问您 MediaWiki 安装的用户。
$wgLDAPGroupSearchNestedGroups除非您知道您拥有嵌套的组,否则除了性能原因,请将此值设置为 false。

现在您已为 MediaWiki 配置了 LDAP 身份验证模块,请访问 MediaWiki 站点,尝试使用您创建的一个用户登录到 MediaWiki。如果一切正常,MediaWiki 会让您登录,您现在是通过验证的用户。如果您在尝试登录时遇到错误,请参见 “故障排除” 一节,了解跟踪错误来源的更多信息。


安全性

为了方便使用和测试,本文中的 LDAP 示例使用明文完成。但是,对于生产系统,并不建议此种做法。以明文形式传输信息使人们能够知道如何 “窃听” MediaWiki 与 LDAP 服务器之间的对话。窃听连接的人可以获得用户和密码信息,这可能为您的组织带来灾难性后果。

在将 LDAP 身份验证解决方案部署到生产环境之前,请确保将 $wgLDAPEncryptionType 变量更改为 tlsssl。我使用与纯主机网络隔离的虚拟机以明文形式测试了 MediaWiki-to-LDAP 身份验证,这使我能够进行真实的测试,但不会向外部窃听者泄露任何信息。首先让一切组件正常运行,然后实现一个安全套接字层 (SSL) 加密解决方案,这常常比较简单,因为加密也具有自己的挑战。在设置期间,您要确保您在实际地调试 LDAP 问题,而不是安全证书问题。


故障排除

使用 ApacheDS 独立服务器的一个好处是,您可以轻松修改日志属性文件来向控制台显示详细的调试信息。即使您最终为生产需求使用不同的 LDAP 目录,如果能够在服务器端看到调试信息,您就能够确定您指定的基础 DN 和其他属性是否正确设置。在进行查询来查找用户和组时,除了搜索结果,查询的 DN 和过滤器也会打印到服务器的控制台输出。

在服务器上调试还使您能够确保已正确建立连接。如果在绑定到 LDAP 目录时遇到任何问题,首先应该确认已正确建立连接。

此外,您可以为 MediaWiki LDAP 身份验证模块打开调试。您添加到 LocalSettings.php 文件来显示调试信息的两个条目如 清单 3 所示。

清单 3. 在 LocalSettings.php 中添加针对调试的配置
$wgLDAPDebug = 5;
$wgDebugLogGroups["ldap"] = "/tmp/ldap.log";

您需要知道谁可以查看此调试信息。如果将调试级别设置为高于 3,LDAP 身份验证模块会将敏感信息打印到日志。您需要确保在生产实例中注释掉了这些值,使得任何敏感信息都不会打印到日志。


结束语

MediaWiki 是一个 PHP 解决方案,您可以使用它允许用户在 Web 上轻松编辑和发布它们自己的内容,这使它成为了内部知识库和信息分享的理想解决方案。知识分享解决方案带来了访问数据以进行编辑的问题,这正是 LDAP 的用武之地。LDAP 解决方案允许您以集中的方式和能为广泛客户端访问的标准格式管理管理用户和组。


下载

描述名字大小
样例 LDIF 文件Example.zip1KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source
ArticleID=811656
ArticleTitle=将 MediaWiki 与 LDAP 集成
publish-date=04242012