Apache2 mod_userdir と mod_authnz_external、自分のホームへのアクセスを制限する方法

Apache2 mod_userdir と mod_authnz_external、自分のホームへのアクセスを制限する方法

mod_userdirおよびを使用して Apache2 をセットアップするとmod_authnz_external and pwauth、各ユーザーが自分のホームにアクセスでき、ローカル UNIX 資格情報によって認証できるようになります。

ここで、各ユーザーが認証された後、自分のホーム ディレクトリにのみアクセスでき、他のユーザーのホーム ディレクトリにはアクセスできないようにするための何らかの承認が必要です。

注意: 私の設定では、ユーザーは必ずしもホーム ディレクトリの所有者ではないため、mod_authz_ownerここでは機能しません。

もう 1 つの問題:認証はリクエスト処理中に遅く行われるため、%{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

関連情報