2012-10-09 53 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