Apache2 mod_userdir und mod_authnz_external, wie man den Zugriff auf das eigene Home beschränkt

Apache2 mod_userdir und mod_authnz_external, wie man den Zugriff auf das eigene Home beschränkt

Apache2-Setup mit mod_userdirund mod_authnz_external and pwauth, sodass jeder Benutzer auf sein Home zugreifen und sich mit seinen lokalen UNIX-Anmeldeinformationen authentifizieren kann.

Nun benötige ich noch eine Art Autorisierung, damit jeder Benutzer nach der Authentifizierung nur auf sein eigenes Home-Verzeichnis zugreifen kann, nicht aber auf die Verzeichnisse anderer Benutzer.

Der Vorbehalt: In meinem Setup ist ein Benutzer nicht unbedingt der Eigentümer seines Home-Verzeichnisses und mod_authz_ownerfunktioniert daher hier nicht.

Ein weiteres Problem: %{REMOTE_USER}Von Apache festgelegte Variablen können nicht innerhalb <If >von Anweisungen (oder anderen Anweisungen, die hier hilfreich sein könnten) verwendet werden, da die Authentifizierung erst spät während der Anforderungsverarbeitung erfolgt.

Wie kann ich mein Ziel mit Apache2 erreichen? Gibt es beispielsweise die Möglichkeit, den Namen des Benutzer-Home-Verzeichnisses zu extrahieren %{REQUEST_URI}und an eine Require user ...Direktive zu übergeben? Ich konnte nicht herausfinden, wie das geht, daher wäre ich für jede Hilfe dankbar.

Antwort1

Sie müssen Ihr eigenes Authentifizierungsskript schreiben. Dies sollte ziemlich einfach möglich sein, ohne viel Code schreiben zu müssen.

Apache übergibt die angeforderte URI über eine Umgebungsvariable an das Authentifizierungsskript. Sie müssen daherAbonnierenaus Ihrem Skript, um die Kombination aus Benutzername und Passwort zu validieren, und vergleichen Sie dann den angegebenen Benutzernamen mit der URI, um sicherzustellen, dass der Benutzername, dessen Passwort Sie gerade validiert haben, in der angeforderten URI enthalten ist.

Hier ist die Dokumentation, die sehr hilfreich war, als ich einen Authentifikator für mich selbst geschrieben habe. https://github.com/phokz/mod-auth-external/blob/master/mod_authnz_external/AUTHENTICATORS

Funktionierende Authenticator-Implementierung in 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

verwandte Informationen