OpenID认证的Apache模块

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_qosmod_sslcrlmod_parp等。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏