我想使用AFS对我的web2py应用程序的用户进行身份验证。不幸的是,pam.py模块似乎不支持AFS,只支持本地用户。有没有可能用pam来做这件事,或者我应该使用其他东西?
发布于 2014-05-10 14:44:51
使用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“而不是”kinit“、”aklog“或”klog.krb5“)向AFS进行身份验证,那么您将需要使用pam_afs.so PAM模块。像这样的东西可能会起作用:
auth required pam_afs.so use_first_pass
auth required pam_deny.so这不是很优雅,但它应该可以工作。
发布于 2012-10-09 09:29:46
由于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语言中可能有点离题,但是如果您找到一个与JGSS等价的Python,this Java/JGSS tutorial可以为您提供所需的指示。)
注意,不要为运行web2py的同一进程用户下的所有传入请求(可能来自不同用户)共享您的AFS令牌。您可能需要考虑从web2py层查看PAG(进程身份验证组)。您需要将这些进程与到达web2py的请求绑定在一起。
https://stackoverflow.com/questions/12791534
复制相似问题