Opened 15 years ago
Last modified 14 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 15 years ago by mitty
- Description modified (diff)
comment:2 follow-up: ↓ 3 Changed 14 years ago by mitty
- Status changed from new to assigned
comment:3 in reply to: ↑ 2 Changed 14 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 以下同じ
- /etc/apache2/sites-available/test
- それぞれのVirtualHostからcheckoutして実験
- svn co http://test.mitty.jp/svn/test
- svn co http://test2.mitty.jp/svn/test test2
- 結論は単一VirtualHostの時と同じ
- 変なエラーが出たりすることはなかった
- あくまで挙動しか調べていないので、内部(ファイルシステム等の下層)でちゃんとロックしているかは未調査
- 同じApache以下でVirtualHostを分けるのではなく、Apache自体を複数インストールした場合も未調査
- もっとも、「バージョン管理システム」の本質に関わるのでロックされていると思われる
comment:4 follow-up: ↓ 6 Changed 14 years ago by mitty
Trac側の対処法
solution 1
- http/httpsそれぞれでScriptAliasする
- http側の設定はPOST出来ないように制限する => wiki:TipAndDoc/project/trac#AccesscontrolwithApache
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するのを忘れないこと
- http側の設定
comment:5 Changed 14 years ago by mitty
- Description modified (diff)
comment:6 in reply to: ↑ 4 ; follow-up: ↓ 7 Changed 14 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>
- https側設定
comment:7 in reply to: ↑ 6 Changed 14 years ago by mitty
訂正
- #solution2,#solution3で<Proxy>ディレクティブの誤り
- #solution2
誤:<Proxy http://localhost/trac/> ↓ 正:<Proxy http://localhost/trac>
- #solution3
誤:<Proxy https://localhost/trac/> ↓ 正:<Proxy https://localhost/trac>
- #solution2
- 最後の「/」は不要
comment:8 Changed 14 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 14 years ago by mitty
- Status changed from assigned to deploy
Note: See
TracTickets for help on using
tickets.
svn側の対処法
整合性の問題
単一VirtualHostに対する同時コミットは整合性が担保される