mod_rewrite を使用した Apache での動的 AuthUserFile。可能ですか?

mod_rewrite を使用した Apache での動的 AuthUserFile。可能ですか?

複数の scponly アカウントを持つサーバーがあり、Basic 認証で http アクセスを提供したいと考えています。

問題の最初の部分は、mod_rewrite を使用して各ユーザーの適切なディレクトリを切り取って選択することで解決しました。しかし、各ユーザーに対して異なる認証ユーザー ファイルを作成しようとすると問題が発生します。単純に、その方法がわかりません。

サンプル設定は次のとおりです。

<VirtualHost an-ip-number-and:a-port>
    ServerName *.example.com
    RewriteEngine On
    UseCanonicalName Off

    RewriteCond %{HTTP_HOST} ^(.*).example.com
    RewriteCond /server/scponly/%1/incoming -d
    RewriteRule ^(.+)   %{SERVER_NAME}$1 [C]
    RewriteRule ^([^.]+)\.example\.com/(.*) /server/scponly/$1/incoming/$2 [L]

    RewriteRule ^(.+) http://FAIL.example.com

    <Directory /server/scponly/*/incoming>
        AuthType Basic
        AuthName "SFTP-HTTP Area"
        AuthUserFile  ???????   # <-- this!
        require valid-user
    </Directory>
</VirtualHost> 

ノート:

  • 実際の設定が他の目的のサーバー名 / ディレクトリ チェック / 書き換えと混在しているため、mod_rewrite を削除できません。
  • ユーザーが認証の詳細を消去できるため、認証の詳細を .htaccess ファイルに移動することはできません。ただし、このアプローチが部分的な解決策になるかどうかは興味があります。
  • 他のアプローチにも興味があります
  • 各ディレクトリごとに異なる認証ファイルが必要です。1つのファイルだけで、各ユーザーにすべてのディレクトリへのアクセスが許可されます。

答え1

peelman の回答を拡張するには、ユーザーごとに個別のセクションを用意する必要があります。

<Directory /server/scponly/*/incoming>
    AuthType Basic
    AuthName "SFTP-HTTP Area"
    AuthUserFile  /path/to/user/htpasswd
</Directory>
<Directory /server/scponly/bob/incoming>
    require user bob
</Directory>
<Directory /server/scponly/smith/incoming>
    require user smith
</Directory>

根本的なアプローチとしては、Apache を Perl で設定できる mod_perl を使用することです。これは Apache 設定ファイルに記述します:

<Perl>

for $dir (glob "/server/scponly/*/incoming") {

  ($user) = $dir =~ m%/server/scponly/([^/]+)/incoming%;

  exists $Directory{$dir} or $Location{$dir} = { };
  $Directory{$dir}{AuthType} = 'Basic';
  $Directory{$dir}{AuthName} = 'SFTP-HTTP Area';
  $Directory{$dir}{AuthUserFile} = '/path/to/htpasswd';
  $Directory{$dir}{require} = "user $user";

}

</Perl>

(頭に浮かんだことをそのまま書きました。)

答え2

えっ? ファイルは 1 つだけで済みます。Require パラメータを valid-user ではなく userid に変更するだけです。こちらを参照してください: Apache ドキュメント

関連情報