wiki:TipAndDoc/network/httpd/accesscontrol

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

--

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

pitfall 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側だけで収まる設定を模索中

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

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