wiki:TipAndDoc/network/httpd

Version 9 (modified by mitty, 14 years ago) (diff)

--

Name-based VirtualHost with SSL

  • 名前ベースのバーチャルホストで複数ドメインにSSLを割り当てることは可能か?
    • 本質的な問題
      HTTP プロトコルと SSL の原理を考えてみても不可能なことは明らかですね。
      ネームベースのバーチャルホストは、HTTP リクエストヘッダに含まれる「Host」を参照 して
      アクセスするバーチャルホストを変化させますが、
      SSL 接続の場合、HTTP リクエストヘッダは暗号化されており、
      参照することができません。
      
      参照するためには、暗号を解読してやればよいわけですが、
      暗号を解読するためには先に証明書の交換を行う必要がありますね。
      
  • 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で同じワイルドカード証明書を指定すれば可能

ドットから始まるファイル、ディレクトリにアクセス禁止

  • /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エラーになる)。

Access control

  • 特定のメソッド以外制限する
  • アクセス条件を複数にする
  • 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」の順で適用され、結果として全てのメソッドが制限されなくなっていると思われる
    • 使用例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

ptifall on Satisfy any

  • 「Satisfy any」における落とし穴
  • 目標
    1. 特定のIPからは、認証せず見られる
    2. 特定のIP以外からは、認証後見られる
    3. 特定のディレクトリ(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側だけで収まる設定を模索中

mod_proxy