Apache2 mod_userdir 및 mod_authnz_external, 자신의 집에 대한 액세스를 제한하는 방법

Apache2 mod_userdir 및 mod_authnz_external, 자신의 집에 대한 액세스를 제한하는 방법

mod_userdir및 를 사용하여 Apache2를 설정 mod_authnz_external and pwauth하면 각 사용자가 자신의 홈에 액세스하고 로컬 UNIX 자격 증명으로 인증할 수 있습니다.

이제 각 사용자가 인증된 후 자신의 홈 디렉토리에만 액세스할 수 있고 다른 사용자의 홈 디렉토리에는 액세스할 수 없도록 일종의 인증이 필요합니다.

주의 사항: 내 설정에서는 사용자가 반드시 홈 디렉토리의 소유자일 필요는 없으므로 mod_authz_owner여기서는 작동하지 않습니다.

또 다른 문제: Apache가 설정한 변수 는 요청 처리 중에 인증이 늦게 이루어지기 때문에 지시어(또는 여기에 도움이 될 수 있는 다른 지시어) %{REMOTE_USER}내에서 사용할 수 없습니다 .<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

관련 정보