如何将数据从mod-auth-external身份验证器传播到提供的页面

时间:2015-08-12 11:11:55

标签: apache http-status-code-401 pam mod-auth-external

背景

在我们的Apache配置中,我们使用mod-auth-external(以前在Google Code上)来调用PAM身份验证。

现在有一个请求正确处理基于阴影的密码到期:

  1. 如果密码在警告期之前,Apache应该使用HTTP状态代码200进行响应。此处没有新内容。
  2. 如果密码处于警告期(其有效期结束),Apache应以HTTP状态代码200响应,但包含有关警告期的某些信息。
  3. 如果密码处于有效期(它不再有效,但用户仍然可以自行更改),Apache应该使用HTTP状态代码401进行响应,并以某种方式包含有关有效期的信息。
  4. 如果密码超出了有效期(它已不再有效并且帐户被锁定,则管理员必须将其解锁)Apache应该使用HTTP状态代码401进行响应,并以某种方式包含有关锁定状态的信息。
  5. (还有一些页面缺失或其他一些错误。目前还不清楚该怎么做。但似乎解决上述问题也可以解决这些极端情况。)

    我们的PAM身份验证器(通过mod-auth-external使用)能够通过调整返回值来区分这些情况。我们已经拥有了。

    但问题是如何从验证器获取信息到为页面提供服务的相关操作(具有200状态代码的实际页面或401错误文档)。

    目前的调查

    应注意,要求2与要求3和要求4之间存在显着差异。

    单独的需求3和4稍微容易一些,因为它们都涉及我们的mod-auth-external身份验证器返回错误(访问被拒绝)。所以我们只需要知道如何在401错误页面中获取该错误代码。我甚至raised issue页面上的mod-auth-external

    要求2要困难得多。在这种情况下,我们的身份验证者必须返回0(授予访问权限),并且仍然以某种方式将有关警告的信息传播到最终提供的任何内容。

    记录解析

    明显(和丑陋)的想法是解析日志。关于mod-auth-externalGoogle Code Wiki描述提到验证者返回值被写入Apache syslog。此外,无论身份验证器打印到标准错误流也会被记录。

    这可用于将信息从验证者传递到其他一些实体。

    这里的困难在于不清楚如何安全地做到这一点。要打印什么以确保“其他实体”将正确匹配当前请求和日志条目。仅仅URL似乎不够,因为同时可能有多个同一URL请求。虽然我没有看到任何更有用的身份验证器。

    这里的另一个问题是,似乎能够解析日志,你必须为“另一个实体”运行一些非平凡的代码。这会使事情进一步复杂化,因为我们应该怎么做呢?

    另一个想法

    如果我们可以让验证者以某种方式修改“请求会话”(或者其他什么,可能只是环境? - 我不知道,我是Apache的新手)来向它添加任意数据我们将(几乎)在家。

    我们的身份验证器会以某种方式存储“密码状态”,也可能会在警告/有效期结束时保留剩余天数(如果适用)。然后,在提供401错误页面时,我们将检索该页面并使用它来动态生成页面内容。

    或者甚至更好,我们会将它存储在会话中,以便另一端可以直接读取该数据。 (对于不仅仅是浏览器显示页面的情况。)

    但到目前为止,我还没有看到如何做到这一点。

    您是否知道如何满足这些要求?

1 个答案:

答案 0 :(得分:0)

一个多月来我没有得到答案。我在GitHub issue打开的mod-auth-external也没有。

所以我结束了对mod-auth-external的自定义修改。我不喜欢修改第三方软件,但无论如何这个似乎已经死了。而且事实证明我们使用的是相当旧的版本(2.2.9,我升级到2.2.11,最后一个在2.2.x行)。无论如何,它已经有了一些自定义。

我在对GitHub issue的评论中解释了解决方案的详细信息,因此我不在此重复。

然而,我会评论阴影细节,因为那里没有提到它们。

我有两个选择:使用getspnam函数检索影子数据或解析PAM生成的消息。首次尝试基于getspnam函数,但最后我使用了PAM消息。我没有充分的理由说明这些。但是我决定在HTTP响应中传播不仅阴影状态,而且传播任何生成的PAM消息,因此更容易遵循这种方式。