[[PageOutline]] = Name-based VirtualHost with SSL = * [http://kjirou.sakura.ne.jp/wiki_mirror/index.php?a%2FApache#q549090f 名前ベースのバーチャルホストで複数ドメインにSSLを割り当てることは可能か?] * 本質的な問題 {{{ HTTP プロトコルと SSL の原理を考えてみても不可能なことは明らかですね。 ネームベースのバーチャルホストは、HTTP リクエストヘッダに含まれる「Host」を参照 して アクセスするバーチャルホストを変化させますが、 SSL 接続の場合、HTTP リクエストヘッダは暗号化されており、 参照することができません。 参照するためには、暗号を解読してやればよいわけですが、 暗号を解読するためには先に証明書の交換を行う必要がありますね。 }}} * [http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#vhosts2 Why is it not possible to use Name-Based Virtual Hosting to identify different SSL virtual hosts?] * It is possible, but only if using a 2.2.12 or later web server, built with 0.9.8j or later OpenSSL. This is because it requires a feature that only the most recent revisions of the SSL specification added, called Server Name Indication (SNI). * The reason is that the SSL protocol is a separate layer which encapsulates the HTTP protocol. So the SSL session is a separate transaction, that takes place before the HTTP session has begun. The server receives an SSL request on IP address X and port Y (usually 443). Since the SSL request did not contain any Host: field, the server had no way to decide which SSL virtual host to use. Usually, it just used the first one it found which matched the port and IP address specified. * ただし、全てのVirtualHostで同じワイルドカード証明書を指定すれば可能 = ドットから始まるファイル、ディレクトリにアクセス禁止 = * [http://tm.root-n.com/server:apache:htaccess:redirectmatch apache :: ドットから始まるファイル、ディレクトリにアクセス禁止 (Tipsというかメモ)] {{{ #403 Forbidden RedirectMatch 403 /\. }}} * /etc/apache2/conf.d/ に以下のような設定ファイルを作ると全体(全てのVirtualHostを含む)に適用することが出来る。 {{{ # prevent files and directories started with 'dot' (ex: .svn/) # from being viewed Order Allow,Deny Deny from all Order Allow,Deny Deny from all }}} * この場合、「Options +Indexes」となっていてもドットで始まるディレクトリはリスティングされない。また、ドットで始まるディレクトリ内のファイルも当然であるが403となる。 * ディレクトリorファイルが実際に存在するかどうかはエラー結果に影響しない(存在しないパスであっても404ではなく403エラーになる)。 = Access control = * see also wiki:TipAndDoc/project/trac#AccesscontrolwithApache * 特定のメソッド以外制限する * => 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 [#ptifallonSatisfyany] * Allow/Denyの適用順 * デフォルトでは「Order Deny,Allow」 => http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order * Deny ディレクティブが Allow ディレクティブの前に評価されます。 アクセスはデフォルトで許可されます。Deny ディレクティブに合わないか、Allow ディレクティブに合うクライアントはアクセスを許可されます。 * '''使用例''' (サーバへのアクセスはデフォルトで禁止、/tracへのアクセスは許可。但し、GET以外は禁止) {{{ Options FollowSymLinks AllowOverride None Order Deny,Allow Deny from all ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi Deny from all }}} * 省略されているOrderディレクティブ(デフォルトの「Order Deny,Allow」)は、の範囲ではなく、外の以下に適用されていると考えるのが妥当 * 設定の失敗例として、以下のように設定するとGETではないPOSTメソッド等も制限されなくなり、期待する動作(GET以外のメソッドを403にする)を取らなくなる {{{ Options FollowSymLinks AllowOverride None Order Deny,Allow Deny from all ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi Allow from all Deny from all }}} * 全体で「Deny from all => Allow from all」の順で適用され、結果として全てのメソッドが制限されなくなっていると思われる * '''使用例2''' localhost(127.0.0.1)からのみ、GET以外も許可する {{{ Options FollowSymLinks AllowOverride None Order Deny,Allow Deny from all ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi Deny from all Allow from 127.0.0.1 }}} * 内部リバースプロキシなどに応用できる => #11 == ptifall on Satisfy any == * 「Satisfy any」における落とし穴 * 目標 1. 特定のIPからは、認証せず見られる 1. 特定のIP以外からは、認証後見られる 1. 特定のディレクトリ(URL)は、認証に関係なく見られない * ディレクトリごとに細かく設定するため.htaccessで制御したい * 例としては内部向けpukiwikiなど === 標準的な設定 === * /etc/apache2/sites-enabled/some.vhost.conf {{{ 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 }}} * /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側だけで収まる設定を模索中 = mod_proxy = * SSLProxyEngine * リバースプロキシでSSL接続をする際に必要 {{{ [Tue Sep 21 02:05:25 2010] [error] proxy: HTTPS: failed to enable ssl support for 127.0.0.1:443 (localhost) }}} * [http://on-o.com/page/diary/20090804.html わんこ日記(2009-08-04)] * [http://d.hatena.ne.jp/bushimichi/20090417/1239970196 mod_proxy でバックエンドにSSLを利用する設定 - bushimichiの日記]