it-swarm-ja.com

Apache 2.4 .htaccessRequireステートメントは無視されます

各顧客のユーザーのリストを使用してプログラムで生成された.htaccessファイルを使用して、静的レポートを含むアプリケーションのクライアントごとのサブディレクトリを制限しようとしていますが、.htaccessファイルが解析されていることを示すことができます(含まれている場合は500 ISE)ガベージ、AllowOverrideは機能しています)より制限の厳しいRequireステートメントは、上位レベルのLocationディレクティブのRequirevalid-userをオーバーライドしていません。

例えば。 /etc/httpd/conf.d/app.conf

<VirtualHost *:80>
ServerName app

RewriteEngine on
RewriteRule ^/cgi-bin\/api\/(\w+)$ /var/www/cgi-bin/App.cgi?mode=json&request=$1 [QSA,H=cgi-script]

<Directory "/var/www/cgi-bin/">
  Options ExecCGI
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
  AllowOverride FileInfo AuthConfig
  Options +Indexes +FollowSymLinks -ExecCGI
  IndexOptions +NameWidth=*
  SetHandler default-handler
  LogLevel trace8
</Directory>


<Location /cgi-bin/>
  AuthType Basic
  AuthName "App Server"
  AuthUserFile /etc/httpd/conf.d/app.passwd
  require valid-user
</Location>
<Location /cgi-bin/api/>
  AuthType Basic
  AuthName "App API"
  AuthUserFile /etc/httpd/conf.d/app-api.passwd
  Require valid-user
  LogLevel trace8
</Location>
</VirtualHost>

/var/www/cgi-bin/api/reports/customer1/.htaccess

Require user CUSTOMER1

レポートディレクトリのLogLeveltrace8をオンにしていますが、

AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
AH01626: authorization result of Require valid-user : granted,
AH01626: authorization result of <RequireAny>: granted
Response sent with status 200

.htaccessファイルに入れたものは何も参照されていないようです。RequireAllでRequireステートメントをラップしても何も起こりません。Requirealldeniedを設定しても何も起こりません。Apacheは.htaccessディレクティブをLocationディレクティブよりも具体的なものとして扱いません。 URIの(上位、左側)部分の構成。

編集:効果なしでFileInfoを追加しようとしました。より完全になるように例を更新しました。設定場所/ cgi-bin/api/reports/customer1ユーザーCUSTOMER1が構成で正常に機能することを要求します。ジョブが実行されるたびにウェブサーバーをリロードし、一部のジョブが実行されるときに.htaccessAuthZファイルを再構築する必要がないようにしました。毎分、私はより完全なツールを構築する努力をしたくありませんでした。理論的には、.htaccessはApacheがすべてのアクセスでAuthZの変更をチェックすることができるはずなので、重要なAuthZの変更がある場合にのみhttpdをリロードできます。特権リロード。

1
mtinberg

最初の質問の後の回答

_<Directory>_ および _<Location>_ ディレクティブは.htaccessファイル内では許可されていません(コンテキストセクションを参照)。

_Auth*_およびRequireディレクティブを含む/ foo/bar/reports /フォルダー内に別の.htaccessファイルを配置するだけです。 .htpasswdファイルへのパスが有効であることを確認してください(絶対パスを優先する必要があります)。

それでも機能しない場合は、 AllowOverride ディレクティブが仮想ホスト内で正しく設定されていることを確認してください(つまり、 _<Directory>_ ディレクティブ内)/ server config。conf/ etc/Apache2 /フォルダー内のファイル)。


質問の最初の編集後の回答

.htaccessファイルは、。confファイル内の_<Directory>_ディレクティブに相当します。現在、認証用に_<Directory>_ディレクティブと_<Location>_ディレクティブを混在させています。 .confファイルから_<Location>_ディレクティブを削除し、。htaccessファイルをそのままにして、_<Directory>_の指示を次のように置き換えてください。

_<Directory "/var/www/cgi-bin/">
  Options ExecCGI
  AuthType Basic
  AuthName "App Server"
  AuthUserFile /etc/httpd/conf.d/app.passwd
  require valid-user
</Directory>
<Directory "/var/www/cgi-bin/api/">
  AuthType Basic
  AuthName "App API"
  AuthUserFile /etc/httpd/conf.d/app-api.passwd
  Require valid-user
  LogLevel trace8
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
  AllowOverride FileInfo AuthConfig
  Options +Indexes +FollowSymLinks -ExecCGI
  IndexOptions +NameWidth=*
  SetHandler default-handler
  LogLevel trace8
</Directory>
_

質問を編集するまで、_<Location>_ディレクティブは.htaccessファイル内に配置され、実際のファイルシステムの場所ではなく仮想フォルダーを指すと想定していました。ただし、 手動で明示的に記載

ファイルシステム内のオブジェクトへのアクセスを制限しようとするときは、_<Location>_を絶対に使用しないことが重要です。これは、多くの異なるWebスペースの場所(URL)が同じファイルシステムの場所にマップされ、制限を回避できるためです。

1
dirdi

AllowOverride ディレクティブがありません。

Require Directive のドキュメントに記載されている内容にもかかわらず、コマンドは次のようになります。

AllowOverride FileInfo AuthConfig
0
harrymc