Opened 11 years ago

Last modified 10 years ago

#11 deploy task

svn/tracへのアクセス権限を、http/httpsで変える

Reported by: mitty Owned by: mitty
Priority: blocker Component: configuration
Keywords: apache2 Cc:

Description (last modified by mitty)

目標

  • via http
    • anonymous相当の権限のみ取得
    • ログイン等による権限昇格不可(BASIC認証ヘッダ等が届いても無視する)
    • https側で認証を行っても、リバースプロキシではその認証情報はhttpまで渡ってこないため、http側(正確にはバックエンド側)で認証を行う必要がある
      • => 権限を取得されてもPOST出来ないようにすることで書き換えを回避
  • via https
    • 認証済みアクセスのみ可書き換えに認証が必要

Trac

  • fcgidはhttp側のVirtualHostで動かす
  • https -- proxy -> http
  • https側で、Tracの「ログイン」リンクをBASIC認証下にする

Change History (9)

comment:1 Changed 11 years ago by mitty

  • Description modified (diff)

comment:2 follow-up: Changed 10 years ago by mitty

  • Status changed from new to assigned

svn側の対処法

整合性の問題

  • 同じリポジトリに対して、同時にアクセスしてもリポジトリが破損しないか?

単一VirtualHostに対する同時コミットは整合性が担保される

  1. 違う親ディレクトリに違う名前のファイルを同時にコミット
    1. svn co http://test.local.mitty.jp/svn/test
      リビジョン 1 をチェックアウトしました。
      
    2. svn mkdir test\vendor\svn
    3. svn mkdir test\trunk\svn
    4. svn ci test -m " * dir for svn source"
      リビジョン 2 をコミットしました。
      
    5. svn add test\vendor\svn\1.5.7
    6. svn add test\trunk\svn\1.6.12
    7. 2つのコンソール(コマンドプロンプト)から同時にコミット
      • svn ci test\vendor\svn\1.5.7 -m " * drop 1.5.7"
      • svn ci test\trunk\svn\1.6.12 -m " * add 1.6.12"
    8. コリジョンせず問題なく格納される
      • リビジョン 3 をコミットしました。
      • リビジョン 4 をコミットしました。
  2. 同じ親ディレクトリに違う名前のファイルを同時にコミット
    1. workingcopyが一つだと親ディレクトリがロックされるので、同じリポジトリを2カ所にcheckoutする
    2. svn add test\trunk\1.5.7
    3. svn add test2\trunk\1.6.12
    4. 2つのコンソール(コマンドプロンプト)から同時にコミット
      • svn ci test\trunk\1.5.7 -m " * add 1.5.7"
      • svn ci test2\trunk\1.6.12 -m " * add 1.6.12"
    5. コリジョンせず問題なく格納される
      • リビジョン 2 をコミットしました。
      • リビジョン 3 をコミットしました。
  3. 同じ親ディレクトリに同じ名前のファイルを同時にコミット
    1. svn co http://test.local.mitty.jp/svn/test
    2. svn co http://test.local.mitty.jp/svn/test test2
    3. svn add test\trunk\1.5.7
    4. svn add test2\trunk\1.5.7
    5. 2つのコンソール(コマンドプロンプト)から同時にコミット
      • svn ci test\trunk\1.5.7 -m " * add 1.5.7"
      • svn ci test2\trunk\1.5.7 -m " * add 1.5.7"
    6. 片方のコミットは衝突して失敗する
      • リビジョン 2 をコミットしました。
      • svn: コミットに失敗しました (詳しい理由は以下のとおりです): svn: Conflict at '/trunk/1.5.7'

comment:3 in reply to: ↑ 2 Changed 10 years ago by mitty

mitty への返信

整合性の問題

  • 同じリポジトリに対して、同時にアクセスしてもリポジトリが破損しないか?

複数のVirtualHostから同じリポジトリへ同時コミット

  • 次のような二つのVirtualHostを用意
    • /etc/apache2/sites-available/test
      ServerName test.local.mitty.jp
      
      <Location /svn/>
              DAV svn
              SVNParentPath /var/svn/inter
              SVNListParentPath on
      
    • /etc/apache2/sites-available/test2
      ServerName test2.local.mitty.jp
      
      以下同じ
      
  • それぞれのVirtualHostからcheckoutして実験
  • 結論は単一VirtualHostの時と同じ
    • 変なエラーが出たりすることはなかった
  • あくまで挙動しか調べていないので、内部(ファイルシステム等の下層)でちゃんとロックしているかは未調査
    • 同じApache以下でVirtualHostを分けるのではなく、Apache自体を複数インストールした場合も未調査
    • もっとも、「バージョン管理システム」の本質に関わるのでロックされていると思われる

comment:4 follow-up: Changed 10 years ago by mitty

Trac側の対処法

solution 1

solution 2

  • http側はScriptAliasで動かし、https側からはhttp側へリバースプロキシでアクセスするようにする
    • http側の設定
      ScriptAlias /trac       /usr/share/trac/cgi-bin/trac.fcgi
      DefaultInitEnv PYTHON_EGG_CACHE "/tmp"
      DefaultInitEnv TRAC_ENV_PARENT_DIR "/path/to/trac"
      
      # increase fcgi timeout value to wait slow cgi exec
      IPCCommTimeout 180
      
      <Location /trac>
              AuthType Basic
              AuthName "Trac for mitty.jp"
              AuthUserFile /var/passwd/restrict/htpasswd
              <LimitExcept GET>
                      Satisfy All
                      Require valid-user
                      Deny from all
                      Allow from 127.0.0.1
              </LimitExcept>
      </Location>
      <LocationMatch /trac/[^/]+/login>
                      Satisfy All
                      Require valid-user
                      Deny from all
                      Allow from 127.0.0.1
      </LocationMatch>
      
    • https側の設定
      ProxyPass /trac http://localhost/trac
      ProxyPreserveHost On
      ProxyPassReverse /trac http://test.local.mitty.jp/trac
      <Proxy http://localhost/trac/>
              Allow from all
      </Proxy>
      
      • ProxyPass -> localhostとすれば、IPアドレス変更時などでの設定書き換え要対応およびDNSに頼る必要を回避できる
      • そのためProxyPreserveHostを使って、Hostヘッダをバックエンドへパススルーする
      • ProxyPreserveHostを使ったために、バックエンドが返すHTTPリダイレクトはlocalhostでは「無い」ことに注意。ProxyPassReverseディレクティブには実際のHostヘッダを用いたURLが必要となる。
    • a2enmod proxy_httpするのを忘れないこと

comment:5 Changed 10 years ago by mitty

  • Description modified (diff)

comment:6 in reply to: ↑ 4 ; follow-up: Changed 10 years ago by mitty

mitty への返信

Trac側の対処法

solution 2

  • http側はScriptAliasで動かし、https側からはhttp側へリバースプロキシでアクセスするようにする
  • http側で認証しているため、https側--(リバースプロキシ)--->http側の間をBASIC認証のパスワードが平文で流れてしまっている

solution 3

  • #solution2とは逆にする。すなわちhttps側でScriptAliasし、http側からはSSL越しにリバースプロキシでアクセスする。
    • https側設定
      ScriptAlias /trac       /usr/share/trac/cgi-bin/trac.fcgi
      DefaultInitEnv PYTHON_EGG_CACHE "/tmp"
      DefaultInitEnv TRAC_ENV_PARENT_DIR "/path/to/trac"
      
      # increase fcgi timeout value to wait slow cgi exec
      IPCCommTimeout 180
      
      <Location /trac>
              AuthType Basic
              AuthName "Trac for mitty.jp"
              AuthUserFile /var/passwd/restrict/htpasswd
              <LimitExcept GET>
                      Satisfy All
                      Require valid-user
                      Order Allow,Deny
                      Allow from all
                      Deny from 127.0.0.1
              </LimitExcept>
      </Location>
      <LocationMatch /trac/[^/]+/login>
                      Satisfy All
                      Require valid-user
                      Order Allow,Deny
                      Allow from all
                      Deny from 127.0.0.1
      </LocationMatch>
      
      • OrderおよびAllow/Denyの範囲が逆転していることに注意
    • http側設定
      SSLProxyEngine On
      ProxyPass /trac https://localhost/trac
      ProxyPreserveHost On
      ProxyPassReverse /trac https://test.local.mitty.jp/trac
      <Proxy https://localhost/trac/>
              Allow from all
      </Proxy>
      

comment:7 in reply to: ↑ 6 Changed 10 years ago by mitty

mitty への返信
mitty への返信

訂正

  • #solution2,#solution3で<Proxy>ディレクティブの誤り
    • #solution2
      誤:<Proxy http://localhost/trac/>
      ↓
      正:<Proxy http://localhost/trac>
      
    • #solution3
      誤:<Proxy https://localhost/trac/>
      ↓
      正:<Proxy https://localhost/trac>
      
  • 最後の「/」は不要

comment:8 Changed 10 years ago by mitty

change name on fcgid directives

  • see http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#upgrade
     ScriptAlias /trac       /usr/share/trac/cgi-bin/trac.fcgi
    -DefaultInitEnv PYTHON_EGG_CACHE "/tmp"
    -DefaultInitEnv TRAC_ENV_PARENT_DIR "/path/to/trac"
    +FcgidInitialEnv PYTHON_EGG_CACHE "/tmp"
    +FcgidInitialEnv TRAC_ENV_PARENT_DIR "/var/trac/inter"
    
     # increase fcgi timeout value to wait slow cgi exec
    -IPCCommTimeout 180
    +FcgidIOTimeout 180
    

comment:9 Changed 10 years ago by mitty

  • Status changed from assigned to deploy
Note: See TracTickets for help on using tickets.