Apache2 mod_userdir和mod_authnz_external,如何限制對自己家的訪問

Apache2 mod_userdir和mod_authnz_external,如何限制對自己家的訪問

Apache2 使用 和 進行設置mod_userdirmod_authnz_external and pwauth以便每個使用者都可以存取他們的主頁並可以透過​​其本地 UNIX 憑證進行驗證。

現在我需要某種授權,以便每個使用者在經過驗證後只能存取自己的主目錄,而不能存取其他使用者的主目錄。

警告:在我的設定中,使用者不一定是其主目錄的擁有者,因此mod_authz_owner在這裡不起作用。

另一個問題:%{REMOTE_USER}Apache 設定的變數在指令(或其他可能有幫助的指令)內部不可用<If >,因為身份驗證是在請求處理過程中後製完成的。

我如何使用 Apache2 實現我的目標?是否有可能從中提取使用者主目錄名稱%{REQUEST_URI}並將其傳遞給 Require user ...指令?我無法找到如何做到這一點,所以任何幫助將不勝感激。

答案1

您需要編寫自己的驗證器腳本。您應該能夠輕鬆地做到這一點,而無需編寫太多程式碼。

Apache 透過環境變數將請求的 URI 傳遞給身份驗證器腳本,因此您需要調用普沃斯從腳本中驗證使用者名稱/密碼組合,然後將給定的使用者名稱與 URI 進行比較,以確保您剛剛驗證密碼的使用者名稱位於所要求的 URI 中。

這是文檔,當我為自己編寫身份驗證器時,它非常有幫助。 https://github.com/phokz/mod-auth-external/blob/master/mod_authnz_external/AUTHENTICATORS

PHP 中有效的身份驗證器實作:

#!/usr/bin/php
<?php
// Get the user name
$user = trim(fgets(STDIN));

// Get the password
$pass = trim(fgets(STDIN));

// Call pwauth to validate user and password combination
$handle = popen('/usr/sbin/pwauth', 'w');
fwrite($handle, $user."\n".$pass."\n");
if (pclose($handle) === 0) { // Password is valid for user
    // Check if the URI belongs to the user
    $uri = getenv('URI');
    if (preg_match('#^/~'.$user.'/#', $uri)
       || preg_match('#^/~'.$user.'$#', $uri)) {
         exit(0); // User matches requested URI
    }
    else exit(1); // User does not match requested URI
}
exit(1); // Password is not valid for user

相關內容