Apache2 mod_userdir и mod_authnz_external, как ограничить доступ к собственному дому

Apache2 mod_userdir и mod_authnz_external, как ограничить доступ к собственному дому

Настройка Apache2 с помощью mod_userdirи mod_authnz_external and pwauth, чтобы каждый пользователь мог получить доступ к своему домашнему компьютеру и мог пройти аутентификацию с помощью своих локальных учетных данных UNIX.

Теперь мне нужна какая-то авторизация, чтобы каждый пользователь после аутентификации мог получить доступ только к своему домашнему каталогу, но не к домашним каталогам других пользователей.

Предупреждение: в моей настройке пользователь не обязательно является владельцем своего домашнего каталога, поэтому mod_authz_ownerздесь это не сработает.

Еще одна проблема: %{REMOTE_USER}переменная, установленная Apache, не может использоваться внутри <If >директив (или других директив, которые могли бы здесь помочь), поскольку аутентификация выполняется поздно, во время обработки запроса.

Как мне достичь своей цели с помощью Apache2? Есть ли, например, возможность извлечь имя домашнего каталога пользователя %{REQUEST_URI}и передать его в Require user ...директиву? Я не смог найти, как это сделать, поэтому любая помощь будет оценена по достоинству.

решение1

Вам нужно будет написать свой собственный скрипт аутентификатора. Вы должны быть в состоянии сделать это довольно легко, не написав много кода.

Apache передает запрашиваемый URI скрипту аутентификатора через переменную среды, поэтому вам нужно вызватьpwauthиз вашего скрипта для проверки комбинации имени пользователя и пароля, а затем сравнения указанного имени пользователя с URI, чтобы убедиться, что имя пользователя, пароль которого вы только что проверили, содержится в запрашиваемом URI.

Вот документация, которая мне очень помогла, когда я писал свой аутентификатор. https://github.com/phokz/mod-auth-external/blob/master/mod_authnz_external/АУТЕНТИФИКАТОРЫ

Рабочая реализация аутентификатора на 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

Связанный контент