Version 2 (modified by mitty, 14 years ago) (diff) |
---|
Access control
- 特定のメソッド以外制限する
- <LimitExcept METHOD> => http://httpd.apache.org/docs/2.2/mod/core.html#limitexcept
- アクセス条件を複数にする
- Satisfy All|Any => http://httpd.apache.org/docs/2.2/mod/core.html#satisfy
- see also #pitfallonSatisfyany
- Allow/Denyの適用順
- デフォルトでは「Order Deny,Allow」 => http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order
- Deny ディレクティブが Allow ディレクティブの前に評価されます。 アクセスはデフォルトで許可されます。Deny ディレクティブに合わないか、Allow ディレクティブに合うクライアントはアクセスを許可されます。
- 使用例 (サーバへのアクセスはデフォルトで禁止、/tracへのアクセスは許可。但し、GET以外は禁止)
<Directory /> Options FollowSymLinks AllowOverride None Order Deny,Allow Deny from all </Directory> ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi <Location /trac> <LimitExcept GET> Deny from all </LimitExcept> </Location>
- 省略されているOrderディレクティブ(デフォルトの「Order Deny,Allow」)は、<LimitExcept>の範囲ではなく、外の<Location>以下に適用されていると考えるのが妥当
- 設定の失敗例として、以下のように設定するとGETではないPOSTメソッド等も制限されなくなり、期待する動作(GET以外のメソッドを403にする)を取らなくなる
<Directory /> Options FollowSymLinks AllowOverride None Order Deny,Allow Deny from all </Directory> ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi <Location /trac> Allow from all <LimitExcept GET> Deny from all </LimitExcept> </Location>
- <Location>全体で「Deny from all => Allow from all」の順で適用され、結果として全てのメソッドが制限されなくなっていると思われる
- 設定の失敗例として、以下のように設定するとGETではないPOSTメソッド等も制限されなくなり、期待する動作(GET以外のメソッドを403にする)を取らなくなる
- 使用例2 localhost(127.0.0.1)からのみ、GET以外も許可する
<Directory /> Options FollowSymLinks AllowOverride None Order Deny,Allow Deny from all </Directory> ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi <Location /trac> <LimitExcept GET> Deny from all Allow from 127.0.0.1 </LimitExcept> </Location>
- 内部リバースプロキシなどに応用できる => #11
- デフォルトでは「Order Deny,Allow」 => http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order
pitfall on Satisfy any
- 「Satisfy any」における落とし穴
- 目標
- 特定のIPからは、認証せず見られる
- 特定のIP以外からは、認証後見られる
- 特定のディレクトリ(URL)は、認証に関係なく見られない
- ディレクトリごとに細かく設定するため.htaccessで制御したい
- 例としては内部向けpukiwikiなど
標準的な設定
- /etc/apache2/sites-enabled/some.vhost.conf
<Directory /> AllowOverride Limit Satisfy any Order deny,allow Deny from all Allow from XX.YY.ZZ.XYZ AuthType Digest AuthName "Authorized" AuthUserFile /path/to/.htdigest Require valid-user </Directory>
- /path/to/www/wikiplus/attach/.htaccess
Order allow,deny Deny from all
問題点
- 上位設定(この場合some.vhost.conf)で「Satisfy any」としているため、.htaccessにおいて「deny from all」に関係なくvalid-userであればアクセスできてしまう。
- wget -S --spider --user username --password password http://example.jp/www/wikiplus/attach/index.html
HTTP/1.1 200 OK
solution
- some.vhost.conf
AllowOverride Limit FileInfo AuthConfig
- Satisfyを.htaccessで使うには「AuthConfig」が必要
- .htaccess
Order allow,deny Deny from all Satisfy all
- 全ての.htaccessを書き換える必要がありスマートでないので、conf側だけで収まる設定を模索中
ドットから始まるファイル、ディレクトリにアクセス禁止
- apache :: ドットから始まるファイル、ディレクトリにアクセス禁止 (Tipsというかメモ)
#403 Forbidden RedirectMatch 403 /\.
- /etc/apache2/conf.d/ に以下のような設定ファイルを作ると全体(全てのVirtualHostを含む)に適用することが出来る。
# prevent files and directories started with 'dot' (ex: .svn/) # from being viewed <FilesMatch "^\."> Order Allow,Deny Deny from all </FilesMatch> <DirectoryMatch "/\."> Order Allow,Deny Deny from all </DirectoryMatch>
- この場合、「Options +Indexes」となっていてもドットで始まるディレクトリはリスティングされない。また、ドットで始まるディレクトリ内のファイルも当然であるが403となる。
- ディレクトリorファイルが実際に存在するかどうかはエラー結果に影響しない(存在しないパスであっても404ではなく403エラーになる)。