2012-10-09 51 views
1

我想通过AFS验证我的web2py应用程序的用户。不幸的是,似乎pam.py模块不支持AFS,只有本地用户。是否可以用pam来做到这一点,还是应该使用其他的东西?Web2py和AFS身份验证

回答

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

您可以尝试遵循其中一个指南,但您可能只需要'auth'部分,因为您不需要需要担心会议和门票以及所有这些。您可能只需要/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)命令,并在该命令的标准输入上输入密码。这不是很优雅,但它应该工作。

+0

工作,谢谢! – user149377

0

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

您可以使用带有SPNEGO的Kerberos将浏览器认证到Web服务器。浏览器需要配置为允许委派(如this example with a Java SPNEGO filter中所述)。

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

我对web2py并不是很熟悉,但快速浏览一下文档并没有显示太多支持SPNEGO的迹象:您可能必须自己实现它。 (如果你可以找到一个支持它的现有GSS库,它应该“只”是在浏览器和这个库之间来回传递SPNEGO令牌,只要它被正确配置就可以了。 Python,但this Java/JGSS tutorial可能会告诉你需要什么,如果你发现一个相当于JGSS的Python)

请注意,不要在同一进程用户运行时共享所有传入请求(可能来自不同用户)的AFS标记web2py中。您可能需要考虑从web2py层查看PAG(进程身份验证组)。您需要将这些流程绑定到到达web2py的请求。

+0

实际上,我不需要执行任何操作/从用户那里获取AFS令牌,我只需要对他进行身份验证,以确保他被允许登录到我的应用程序。它使事情变得更简单吗?以任何方式感谢您提供完整的答案。 – user149377

+0

对不起,我不太清楚你正在尝试做什么。您的web2py应用程序和AFS如何协同工作,这与身份验证有什么关系? – Bruno

+0

对于用户能够登录到我的应用程序,我想确保他有一个AFS帐户。如果他在特定单元格上没有AFS帐户,我不会让他进入。我想我可以使用PAM来检查用户是否存在,但是PAM当然仅用于本地用户身份验证。一旦我确定用户是AFS用户,他就可以访问该应用程序。 – user149377