Apache2 se configura con mod_userdir
y mod_authnz_external and pwauth
, para que cada usuario pueda acceder a su hogar y pueda ser autenticado mediante sus credenciales UNIX locales.
Ahora necesito algún tipo de autorización para que cada usuario pueda, luego de ser autenticado, acceder solo a su propio directorio personal, pero no al de otros usuarios.
La advertencia: en mi configuración, un usuario no es necesariamente el propietario de su directorio de inicio, por lo que mod_authz_owner
no funcionará aquí.
Otro problema: %{REMOTE_USER}
la variable establecida por Apache no se puede utilizar dentro de <If >
las directivas (u otras directivas que podrían ayudar aquí), porque la autenticación se realiza tarde durante el procesamiento de la solicitud.
¿Cómo puedo lograr mi objetivo con Apache2? ¿Existe, por ejemplo, la posibilidad de extraer el nombre del directorio de inicio del usuario %{REQUEST_URI}
y pasarlo a una
Require user ...
directiva? No he podido descubrir cómo hacer esto, por lo que agradecería cualquier ayuda.
Respuesta1
Necesitaría escribir su propio script de autenticación. Debería poder hacerlo con bastante facilidad sin escribir mucho código.
Apache pasa el URI que se solicita al script de autenticación a través de una variable de entorno, por lo que deberá llamarpwauthdesde su secuencia de comandos para validar la combinación de nombre de usuario/contraseña, y luego compare el nombre de usuario proporcionado con el URI para asegurarse de que el nombre de usuario cuya contraseña acaba de validar esté en el URI que se solicita.
Aquí está la documentación, que fue muy útil cuando escribí un autenticador para mí. https://github.com/phokz/mod-auth-external/blob/master/mod_authnz_external/AUTHENTICATORS
Implementación funcional del autenticador en 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