1

我想使用 AFS 对我的 web2py 应用程序的用户进行身份验证。不幸的是,pam.py 模块似乎不支持 AFS,只支持本地用户。是否可以用 pam 做到这一点,或者我应该使用其他东西?

4

2 回答 2

0

由于 web2py 是基于 web 的,并且由于 AFS 使用 Kerberos,因此您肯定需要在用户和 web2py 层之间传递 Kerberos 票证,以便让 web2py 以用户的名义获取 AFS 令牌。

您可以使用带有 SPNEGO 的 Kerberos 向 Web 服务器验证浏览器。需要将浏览器配置为允许委托(如本示例中使用 Java SPNEGO 过滤器所描述的那样)。

如果您设法在您的 web2py 应用程序中获得一次委托的 Kerberos 票证,您应该能够使用它aklog来获得 AFS 令牌。

我对 web2py 不是很熟悉,但是快速浏览一下文档并没有显示出太多支持 SPNEGO 的迹象:您可能必须自己实现它。(如果您可以找到支持它的现有 GSS 库,则它应该“仅”是在浏览器和此库之间来回传递 SPNEGO 令牌的问题,前提是它已正确配置。这可能有点偏离主题Python,但如果您找到与 JGSS 等效的 Python,此 Java/JGSS 教程可以告诉您需要什么。)

请注意不要在运行 web2py 的同一进程用户下共享所有传入请求(可能来自不同用户)的 AFS 令牌。您可能需要考虑从 web2py 层查看 PAG(进程身份验证组)。您需要将这些进程与到达 web2py 的请求联系起来。

于 2012-10-09T01:29:46.160 回答
0

使用 PAM 可能是您想要做的,因为 web2py 没有对 AFS 或 krb5 的任何内置支持。为了对非本地用户进行身份验证,您需要指定一个不同的 PAM 服务进行身份验证,并修改本地 PAM 配置以使该服务对 AFS 进行身份验证。

看起来 pam_auth.py 模块除了默认的“登录”之外不支持使用 PAM 服务,但这样做看起来很简单,或者创建你自己的。你只需要做这样的事情:

from gluon.contrib.pam import authenticate

def mypam_auth():
    def pam_auth_aux(username, password):
        return authenticate(username, password, "myservice")

auth.settings.login_methods.append(mypam_auth())

其中“myservice”只是您选择的服务名称。然后您需要修改本地 PAM 配置以使“myservice”对 AFS 进行身份验证。在 Linux 上,这通常意味着创建一个文件 /etc/pam.d/myservice,并用 PAM 配置填充它以向 AFS 进行身份验证。

如今,大多数 AFS 单元都使用 Kerberos 5 进行身份验证,因此这仅意味着您需要对 Kerberos 5 进行身份验证,并且不需要打扰任何 AFS 内容(除非您想验证用户是否拥有有效的 AFS 帐户;但那是更多的是授权问题而不是身份验证)。有一些使用 krb5 登录设置 PAM 的指南和示例,例如:http ://techpubs.spinlocksolutions.com/dklar/kerberos.html#PAM_configuration

您可以尝试遵循其中一个指南,但您可能只需要“身份验证”部分,因为您无需担心会话和票证以及所有这些。您可能只需要 /etc/pam.d/myservice 中的类似内容:

auth required pam_krb5.so no_ccache use_first_pass
auth required pam_deny.so

如果您所说的“AFS 身份验证”是指旧的 kaserver 基于 krb4 的身份验证而不是 krb5(也就是说,您使用 'klog' 对 AFS 进行身份验证,而不是 'kinit' 和 'aklog' 或 'klog.krb5'),你而是需要使用 pam_afs.so PAM 模块。像这样的东西可能会起作用:

auth required pam_afs.so use_first_pass
auth required pam_deny.so

如果您无法控制本地计算机上的本地 PAM 配置,则可以尝试通过生成“kinit”(krb5)或“klog”(旧 kaserver)命令来验证用户身份,并为命令提供密码这是标准输入。这不是很优雅,但它应该可以工作。

于 2014-05-10T06:44:50.670 回答