Apache模块用于OpenID身份验证
OpenID是广泛采用的技术,用于Web应用程序中的用户身份验证。 它依赖于博客应用程序中分布式用户身份验证的概念。 这本小Recipe介绍了如何安装和配置Open Source Apache模块的mod_auth_oid 。
该模块的预期目的是提供一个简单的依赖方实现,可用于保护对基于Apache的Web应用程序和资源的访问。 模块没有实现全部,在官方规范描述的功能。 但是,它的功能已经足够成熟,为您的应用和用户提供了舒适的登录可用性。
还有两个附加模块,它们增强了身份验证模块,能够将用户界面映射到本地用户,不仅可以通过Apache配置,还可以使用本地映射文件(可以从其他应用程序存在)或通过Ldap。
安全警告:该模块不支持PAPE等协议扩展。 因此,不推荐在具有较高数据保护要求的环境中使用,如医疗保健或货币交易。
安装
先决条件
为了安装此Apache模块,必须满足以下要求:
- Apache 2.2包括mod_ssl,mod_proxy,mod_include,Headerfiles和apxs / apxs2(通常称为apache2和apache2-devel包)。
- Apache模块mod_parp用于参数解析。 从这里得到它 安装是直接的:使用sudo或以root身份登录:
$ tar xvBzf mod_parp-0.10-src.tar.gz
$ cd mod_parp-0.10 $ sudo apxs2 -i -c apache2/mod_parp.c
$ sudo chmod 755 /usr/lib64/apache2/mod_parp.so
主模块
从这里下载并解压缩源代码。
$ tar xvBzf mod_auth_oid-2.0-src.tar.gz
$ cd mod_auth_oid-2.0
$ sudo apxs2 -i -c -I . -D AOID_MOD_EXT_HOOKS apache2/mod_auth_oid.c -lcrypto -lparp
可选:源代码附带的附加模块。 如果您还要使用强烈推荐的附加模块mod_auth_oid_file.c或mod_auth_oid_ldap.c,请使用以下命令之一编译并安装它们。
$ sudo apxs2 -i -c -I . apache2/mod_auth_oid_file.c
$ sudo apxs2 -i -c -I . apache2/mod_auth_oid_ldap.c
组态
服务器部分
需要以下Apache标准模块:
-
mod_ssl
(提供mod_auth_oid使用的加密例程) -
mod_proxy
(为mod_auth_oid提供函数,以便向OpenID Provider提供请求) -
mod_include
(提供shtml页面的渲染)
启用Apache全局配置部分中的模块。 根据文件系统布局调整文件位置。 同样重要的是,模块在mod_ssl之后加载。 因此,将此行放置在Apache的LoadModule块的末尾。 如果您打算使用映射模块,请取消最后两行的注释。 如果您的发行版具有加载模块的单独样式,请根据其说明进行操作(例如,将以下行放置在自动包含的文件中,如果它位于特定目录,如启用模块或类似的目录。
LoadModule parp_module /usr/lib64/apache2/mod_parp.so LoadModule auth_oid_module /usr/lib64/apache2/mod_auth_oid.so # LoadModule auth_oid_file_module /usr/lib64/apache2/mod_auth_oid_file.so # LoadModule auth_oid_ldap_module /usr/lib64/apache2/mod_auth_oid_ldap.so
尝试重新启动服务器。 如果模块正确加载,则应在Servers error.log中报告:
[Sun Nov 06 12:10:59 2011] [notice] Apache/2.2.17 (Linux/SUSE) mod_ssl/2.2.17 OpenSSL/1.0.0c mod_auth_oid/2.0 configured -- resuming normal operations
VirtualHost部分
现在是准备保护您的应用程序的具体配置的时候了。 编辑您的VirtualHost配置。 当然,这应该是您的https VirtualHost,因为我们在这里处理安全。 并用您自己的OpenID替换我的OpenID YOURNAME,否则您的名字可能会一天偷你的皇冠。 ;)如果您要使用Google作为OpenID提供商,您必须略有不同,并添加一个AOID_UserPattern,因为Google使用Directed Identity方法与每个站点不透明的OpenID。 在这个howto的最后一章中,称为缩小您喜欢的OpenID提供程序的命名空间,配置指令用Google示例解释。
我们假设我们要保护的资源是位置/私有
,并且身份验证处理程序位于/ aoid上
。 对以下部分进行评论,以表明您要做什么。
# A complete reference of all available configuration options # is available under: http://auth-openid.sourceforge.net/ # Caution: Enable on trusted CA's by putting them into cacerts # Link them to hashnames like described in the Apache documentation # http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslproxycacertificatepath SSLProxyEngine on SSLProxyCACertificatePath /etc/ssl/cacerts # use httponly flag preventing XSS attacks to the session cookie BrowserMatch "Mozilla.*Firefox/(3|4)" HttpOnlyCookie BrowserMatch "MSIE [6789]" HttpOnlyCookie BrowserMatch "Opera/(10|9\.[56789])" HttpOnlyCookie BrowserMatch Secure SecureCookie # mod_auth_oid base settings AOID_Realm / AOID_StartPage /private/index.html AOID_LogLevel info AOID_LoginPath /aoid/login AOID_LoginSuffix .shtml AOID_Timeout 300 AOID_CookieName AJESSIONID # OpenID User Mapping. Additional possibilitys are described # in the Chapter "Local file mapping" of the Howtoforge Page # allowed/known users REPLACE WITH YOUR OPENID AOID_User http://YOURNAME.myopenid.com/ YOURNAME # Enforce mod_auth_oid user authentication of the following location <Location /private> AuthType OpenID Require valid-user </Location> # mod_auth_oid login page # enable SSI for the login page (requires mod_include) <Location /aoid> Options Includes AddType text/html .shtml AddOutputFilter INCLUDES .shtml </Location>
文件
现在,在VirtualHost的DocumentRoot中创建一个名为private的目录,其中包含您希望保护的内容。 作为一个例子,添加一个index.html
文件,该文件说:“Yeahh !! mod_auth_oid rocks and I hacked 127.0.0.1!
此外,您还需要在DocumentRoot中的Directory aoid
中的登录页面。 作为一个开始,您可以使用tarball中目录htdocs
中的样本SHTML页面。 只需将其复制到您的htdocs中
。 检查新创建的文件的权限,如果它们与您的Web服务器首选项匹配。
现在你可以重新启动Apache了。 请检查error.log,看看一切都很好。
测试您的安装
现在打开浏览器。 如果您已经完成了所有正确的操作,并且Apache也执行了此操作,那么当您将浏览器指向以下URL时,您应该会看到一个登录页面: https://YOURHOST/private/index.html
选择您的提供者并提交。 该模块将重定向到您登录的提供商,如果成功,您将被发送回您的私人应用程序。 如果您选择Google,只需提交建议的OP标识符,在另外两种情况下,将OpenID输入突出显示的部分。 后来在howto是一个很方便的解决方案,一个花哨的登录页面描述。
调试在一些事情是错误的
在不太可能的情况下,如果某些内容没有按预期方式工作,您可能有几个迹象表明Apache服务器的error.log可能有错误。 日志消息应该指示什么失败。 可以在mod_auth_oid页面找到可能的错误代码的详细列表,以及如何启用更高级的Loglevel。
其他选项
花梢登录页面
我假设你像我一样,你想要看到的第一件事是浏览器中一个很好看的登录页面。 这样的东西看起来很酷,足以让你的口味。
这个专业的登录页面是使用开源项目openid-selector创建的,这是一种用户友好的选择OpenID的方式。
在生成Loginpage之后,必须使用mod_auth_oid中的shtml包含的东西进行增强。 我已经将错误渲染部分从原始登录页面添加到生成的html页面,从openid-selector。 我可以在这里下载自定义页面的示例。
本地用户标识映射
如果您还编译了mod_auth_oid_file
模块,那么您还可以将用户ID记录映射到本地文件中,而不是将其全部添加到Apache配置文件中。 详细的说明可以在这里找到。
阅读以下章节,一次性添加用户自注册与本地文件映射。
用户自我管理OpenID到本地用户标识映射
假设您已经有基于Apache的.htpasswd
文件的用户管理,您可以使用以下配置snipplet来增强它,以便用户可以将OpenID帐户注册到其本地帐户。 将file_mapper.html
文件从tarball复制到您的htdocs中
。
# Virtual Host section AOID_File_DB /etc/apache2/mapdb AOID_File_AdminPage /usr/local/apache2/htdocs/file_mapper.html # Profile administration location # Adjust filepath according to your existing .htpasswd file <Location /profile> AuthUserFile /srv/data/.htpasswd AuthName 'Enter your LoginName: Cancel to register if you do not have one.' AuthType Basic Require valid-user SetEnvIf Request_Method POST parp SetEnvIf Request_Method GET parp SetHandler auth-oid-file AOID_File_UserOnly on </Location>
现在,mod_auth_oid_file创建一个mapdb
文件,它存储OpenID帐户和本地.htpasswd
帐户之间的关系。
安全注意事项
依赖方发现文件
OpenID推荐托管依赖方发现文档 ,指示OpenID提供商的正确return_to地址。 如果您不提供此类文档,雅虎将会将您的网站表示为不信任。 更多信息,请点击这里 。
在您网站的DocumentRoot
中保存名为openid.xrd
的文档。 内容应与以下示例类似。 根据您的设置进行调整。
<?xml version="1.0" encoding="UTF-8"?> <xrds:XRDS xmlns:xrds="xri://$xrds" xmlns:openid="http://openid.net/xmlns/1.0" xmlns="xri://$xrd*($v*2.0)"> <XRD> <Service priority="1"> <Type>http://specs.openid.net/auth/2.0/return_to</Type> <URI>https://YOUR_HOST_HERE/aoid/login</URI> </Service> </XRD> </xrds:XRDS>
然后,文档必须通过每个HTTP响应发送特制的标题,或者它可以包含在站点顶级文档中。
变体1通过标题(推荐)
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so # ....... Header set X-XRDS-Location https://YOUR_HOST_HERE/openid.xrd
变式2在顶级html文档的头部中宣布
.... <head> <meta http-equiv="X-XRDS-Location" content="https://YOUR_HOST_HERE/openid.xrd"/> ....
保护DoS和其他类型的攻击
DoS攻击和跨站点请求伪造是今天的一个大问题。 您可以通过另一个名为mod_qos的开源模块,有效地保护您的站点免受DoS攻击。 这个模块是瑞士军刀,用于保护您的服务器免受各种攻击。 该模块可以像任何其他Apache模块一样轻松安装。 以下配置示例显示了一种基本配置,可以保护您的站点免受DoS攻击和自我管理页面上的跨站点请求伪造。
# server section LoadModule qos_module /usr/lib/apache2/modules/mod_qos.so # handles connections from up to 100000 different IPs QS_ClientEntries 100000 # will allow only 50 connections per IP QS_SrvMaxConnPerIP 50 # maximum number of active TCP connections is limited to 256 MaxClients 256 # disables keep-alive when 70% of the TCP connections are occupied: QS_SrvMaxConnClose 180 # minimum request/response speed (deny slow clients blocking the server, ie. slowloris keeping connections open without requesting anything): QS_SrvMinDataRate 120 1500 400 # and limit request header and body (carefull, that limits uploads and post requests too): QS_SrvMaxConnClose 70% LimitRequestFields 30 QS_LimitRequestBody 102400 QS_ClientEventBlockCount 20 300 QS_SetEnvIfStatus 400 QS_Block QS_SetEnvIfStatus 401 QS_Block QS_SetEnvIfStatus 403 QS_Block QS_SetEnvIfStatus 404 QS_Block QS_SetEnvIfStatus 405 QS_Block QS_SetEnvIfStatus 406 QS_Block QS_SetEnvIfStatus 408 QS_Block QS_SetEnvIfStatus 411 QS_Block QS_SetEnvIfStatus 413 QS_Block QS_SetEnvIfStatus 414 QS_Block QS_SetEnvIfStatus 417 QS_Block QS_SetEnvIfStatus 500 QS_Block QS_SetEnvIfStatus 503 QS_Block QS_SetEnvIfStatus 505 QS_Block QS_SetEnvIfStatus QS_SrvMinDataRate QS_Block QS_SetEnvIfStatus NullConnection QS_Block QS_SrvMaxConnExcludeIP 127.0.0.1 # CSRF protection of the Self Registration Form by setting # four milestones for profile administration QS_MileStone deny "^GET /OpenIdLogin" QS_MileStone deny "^GET /OpenIDRegistration" QS_MileStone deny "^GET /profile" QS_MileStone deny "^POST /profile"
缩小您的首选OpenID提供商的命名空间
您可以使用配置指令AOID_UserPattern来限制您接受网站身份验证的OpenID提供程序。 以下两个示例为您提供了如何为此目的构造正则表达式的粗略思想。
# VirtualHost section # Allow only Google OpenID's AOID_UserPattern "^(https://www\.google\.com/accounts/o8/id\?id=.*)$" "$1" # Allow only my.company.com OpenID's and use only a part of it for mapping it to a local user. AOID_UserPattern "^https://my\.company\.com/([a-z]{1})[a-z]+\.([a-z]{2})[a-z]+$" "$1$2"
最后的话
感谢您阅读本教程。 我希望你的安装顺利进行。 我希望你,许多用户将从这个模块中获利,我希望安装它很有趣。 如果您想了解模块发生了什么,您可以订阅我们的mod_auth_oid facebook页面 。
学分:我要感谢Pascal Buchbinder指导我,改进这个Apache模块,并用identifier_select
方法来增强它。 他是几个Apache模块的作者,如mod_qos , mod_sslcrl , mod_parp等。