我想用AFS验证我的web2py应用程序的用户。不幸的是,似乎pam.py模块不支持AFS,只支持本地用户。可以用pam做到这一点,还是应该用别的东西?
答案 0 :(得分: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可以告诉你需要什么,如果你发现Python等同于JGSS。)
请注意,不要在运行web2py的同一进程用户下共享所有传入请求(可能来自不同用户)的AFS令牌。您可能需要考虑从web2py层查看PAG(进程身份验证组)。您需要将这些流程绑定到到达web2py的请求。
答案 1 :(得分: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)命令并给出命令来验证用户身份密码就是它的标准输入。这不是很优雅,但应该有效。