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

相关内容