argius note

プログラミング関連

Mac miniを常駐マシンに (5) - セキュリティ設定と移行試験 -完結-

今回は、httpdのセキュリティ設定と、現在運用中のWindowsPCサーバからの移行のための準備を行いました。
移行試験の結果、問題がなければリセットして再度同じ移行作業を行うので、移行試験の手順が確立した時点で手順は出揃うことになり、この連載らしきものも今回で完結となります。

httpd(Apache2)のSSL設定

秘密鍵ファイル(*.key)とサーバ認証ファイル(*.crt)を作成して、httpdに設定します。
ApacheSSL設定(httpd-ssl.conf)では、ディレクトリが/private/etc/apache2/、ファイル名がそれぞれ"server.key","server.crt"となっていますので、それに合わせて作成します。ファイルの作成方法は、下記ページが分かり易かったので、ほぼこのページの説明のとおりに行いました。
apache+mod_sslでSSL ― server-memo.net
最後に、httpd.confのSSL設定のincludeがコメントアウトされているので、これを解除します。SSLモジュール(mod_ssl.so)の設定はデフォルトで有効になっているのでここでは何もしません。

(diff -U 2)
@@ -475,5 +477,5 @@

 # Secure (SSL/TLS) connections
-#Include /private/etc/apache2/extra/httpd-ssl.conf
+Include /private/etc/apache2/extra/httpd-ssl.conf
 #
 # Note: The following must must be present to support

これで、SSL自体の設定は完了です。

SVN( on Apache2)のBasic認証+SSL設定

SVNBasic認証SSLの設定です。


まずは、Basic認証に使用するパスワードファイルと、アクセス権を制御するauthz_svn_moduleの設定ファイルを作成していきます。
パスワードファイルは、htpasswdコマンドで生成します。

$ htpasswd -c /var/svn/.htpasswd argius
Enter Password:

アクセス権設定ファイルは、エディタで作成します。ファイル名は"authzsvn.conf"とします。以下は内容の例。

[/]
argius = rw
* = r


最後に、httpd.confに設定を行います。前々回の設定時には設定の詳細は省略したので、ここではSVNサーバをApacheで稼動させるための設定もあわせて説明します。
SVNサーバにHTTP接続でアクセスするためのDavSVNモジュール(mod_dav_svn.so)と、SVNのアクセス権を制御するAuthzSVNモジュール(mod_authz_svn.so)をロードする設定を追加します。

LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so

(diff -U 2)
@@ -115,4 +115,6 @@
 #LoadModule php5_module        libexec/apache2/libphp5.so
 #LoadModule fastcgi_module     libexec/apache2/mod_fastcgi.so
+LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
+LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so

 <IfModule !mpm_netware_module>

次に、ファイルの末尾にLocation設定を追加します。以下の例は、リポジトリがSingleModule設定の場合、"http://localhost/svn/work/ModuleName"で接続するための設定です。

<Location /svn/work>
     SVNParentPath /var/svn/work
     DAV svn
     AuthType Basic
     AuthName "Subversion repository"
     AuthUserFile /var/svn/.htpasswd
     AuthzSVNAccessFile /var/svn/authzsvn.conf
     Require valid-user
     SSLRequireSSL
</Location>

設定は上から順に、「Locationパス」「リポジトリのローカルパス」「DavSVN有効」「認証タイプ=Basic」「認証名」「認証ユーザ設定ファイル」「AuthzSVNアクセス権設定ファイル」「認証が有効なユーザを許可」「SSLの要求」を意味します。


実際に設定したときは、httpdを再起動(sudo httpd -k restart)すると、以下のエラーが発生しました。

Invalid command 'AuthzSVNAccessFile', perhaps misspelled or defined by a module not included in the server configuration                   

原因は、AuthzSVNモジュール(mod_authz_svn.so)のパスが不正だったためでした。上記の設定では修正されています。


設定が無事終わったので、接続確認を行います。LANとWAN、それぞれブラウザ(Firefox3.5)とEclipseプラグインのSubversiveで確認しました。
まずはLANで、接続を確認。リポジトリの切り替えも上手くいきました。後日、WANにて同様に確認できました。ただ、WindowsでのSVN専用サーバ(VisualSVN)と比べると、ちょっと重いような気がします。これはまた別の機会に検討することにします。

TracLight2.1(v0.11.2.1.ja1)のデータをtrac-ja(v0.11.5.ja1)に移行

TracLightのプロジェクトディレクトリは、${TRAC_HOME}/projects/SampleProject/のようになっています。「素」のtrac-jaでは、projectsディレクトリは存在しないので、このprojectsディレクトリごとコピーしてみます。httpdのアクセスとなりますので、所有者はwwwとしておきます。
Tracのデータ抽出は、trac-adminのhotcopyコマンドを使うと安全です。TracLightでは、スタートメニューから「バックアップ」を実行できます。これは、${TRAC_HOME}/backup/に全てのデータファイルをコピー(hotcopy)してくれます。既にbackup/が存在する場合は上書きされるようです。これだと間違いないので、今回はこれで移行データを準備しました。
httpd.confの設定からは、次の項でまとめて行います。

Trachttpd(Apache2)から起動(mod_python)+Basic認証+SSL設定

Tracは、この時点ではtracdで(リスナを)起動しています。これを、httpd(Apache2)上で動くようにします。Apache2上で動かすにはいくつか選択肢があるようですが、ここではmod_pythonモジュールを使うことにしました。
これが今回最も苦労した箇所です。というより、他はすんなり通過できたのに、ここだけ多重のトラップに嵌ってしまったような感じです。まあ、そこは先人の方々の英知のお陰で最小限の労力で済んだと思うので、あまり文句は言えません。多謝。


先に、httpd.confの設定を書いておきます。Pythonの箇所がmod_pythonのための設定です。ここでは詳しい説明は割愛します。

LoadModule python_module /opt/local/apache2/modules/mod_python.so
<Location /trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnvParentDir /opt/local/var/trac/projects
    PythonOption TracUrlRoot /trac
    PythonOption PYTHON_EGG_CACHE /opt/local/var/trac/.egg-cache
    SSLRequireSSL
</Location>
<LocationMatch "/trac/[^/]+/login">
    AuthType Basic
    AuthName "Trac"
    AuthUserFile /opt/local/var/trac/.htpasswd
    Require valid-user
</LocationMatch>


(「ここからが地獄だ...」)
mod_pythonはインストールされていなかったので、最初はMacPortsmod_pythonをインストールしてみました。
インストール後、Tracを開こうとすると、プロジェクト一覧は開くものの、プロジェクトのリンクをクリックしてWikiページを開こうとすると"500: Internal Server Error"が出てしまいました。
ログを見ると、"ImportError: No module named trac.web.modpython_frontend"と出ています。どうやら、site-packageの下に必要なライブラリが存在しないためのようです。このTracのバージョンでは、Python2.5以上が必要にもかかわらず、mod_pythonはPython2.4を参照しているため、このようなエラーとなってしまっています。
回避策として、アドホックにシンボリックリンクを張る、mod_pythonをソースファイルビルドでインストールなどがあるようです。シンボリックリンクの方は、ちょっとやってみたところ、一筋縄では行かないようです。mod_pythonがPython2.5以上を参照するようになれば良さそうなので、ソースファイルからビルドしてインストールする対応に切り替えました。


Index of /dist/httpd/modpythonから"mod_python-3.3.1.tgz"をダウンロードして、展開、ビルド&インストールします。実際にやる前に事例を調べてみたら、「x86_64用にビルドすべし」とあったので、先にこれを設定。

設定後、ビルドを実行するとしようとしたら、コンパイルエラーが。なんとか情報が見つかり、どうやらプログラムの一部(connobject.c)がバグってるらしいことが分かりました。1箇所なので、パッチでなく手動でプログラムを修正して、ビルドが通りました! しんどかった...


これで、Wikiページまでは開けました。が、今度はメニューをクリックすると、またもや"500: Internal Server Error"。ログを見ると、"ImportError: cannot import name compat. "とあります。
これは、"compat.py"をインポートすべきところで、(同名の別モジュールの?)"compat.pyc"をImportしようとしているため?、エラーとなっているようです。なので、"compat.pyc"をrename(.bakをつける、など)してあげればOKです。


これでやっと動作しました!!!
あとは、管理画面を開くために、作成したユーザにTRAC_ADMIN権限を付与して、Tracの設定は完了です。

$ sudo trac-admin /var/trac/projects/test/ permission add argius TRAC_ADMIN
  • 地獄のまとめ
  1. MacPortsmod_pythonをインストール
    • 実行すると"500: Internal Server Error"、ログは"ImportError: No module named trac.web.modpython_frontend"
    • TracはPython2.5を要求するがPython2.4を参照してしまう
      • ソースファイルからビルド&インストールで対応
  2. mod_pythonのビルド
    • x86_64用設定
    • コンパイルエラー(connobject.c)
      • バグなので修正してビルド&インストール成功
  3. 実行すると"500: Internal Server Error"、ログは"ImportError: cannot import name compat"
    • "compat.py"を参照すべきところで"compat.pyc"を参照してしまっている
      • "compat.pyc"を退避(rename)

その他

このあと、移行対象データを採取して、移行を試験として実施します。CVSSVNTrac、Hudsonが対象です。
glassfishについては、ここでは特にすることはありません。これから色々と試してみる予定です。


httpd.confの最終状態のdiffを乗せておきます。

$ diff -U 1 original/httpd.conf.orig.bak httpd.conf
--- original/httpd.conf.orig.bak        2009-05-19 04:44:06.000000000 +0900
+++ httpd.conf  2010-01-15 20:52:56.000000000 +0900
@@ -116,2 +116,5 @@
 #LoadModule fastcgi_module     libexec/apache2/mod_fastcgi.so
+LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
+LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so
+LoadModule python_module /opt/local/apache2/modules/mod_python.so

@@ -476,3 +479,3 @@
 # Secure (SSL/TLS) connections
-#Include /private/etc/apache2/extra/httpd-ssl.conf
+Include /private/etc/apache2/extra/httpd-ssl.conf
 #
@@ -488 +491,38 @@
 Include /private/etc/apache2/other/*.conf
+
+<Location /svn/main>
+    SVNParentPath /var/svn/main
+    DAV svn
+    AuthType Basic
+    AuthName "SVN"
+    AuthUserFile /var/svn/.htpasswd
+    AuthzSVNAccessFile /var/svn/authzsvn.conf
+    Require valid-user
+    SSLRequireSSL
+</Location>
+
+<Location /svn/work>
+    SVNParentPath /var/svn/work
+    DAV svn
+    AuthType Basic
+    AuthName "SVN"
+    AuthUserFile /var/svn/.htpasswd
+    AuthzSVNAccessFile /var/svn/authzsvn.conf
+    Require valid-user
+    SSLRequireSSL
+</Location>
+
+<Location /trac>
+    SetHandler mod_python
+    PythonHandler trac.web.modpython_frontend
+    PythonOption TracEnvParentDir /opt/local/var/trac/projects
+    PythonOption TracUrlRoot /trac
+    PythonOption PYTHON_EGG_CACHE /opt/local/var/trac/.egg-cache
+    SSLRequireSSL
+</Location>
+<LocationMatch "/trac/[^/]+/login">
+    AuthType Basic
+    AuthName "Trac"
+    AuthUserFile /opt/local/var/trac/.htpasswd
+    Require valid-user
+</LocationMatch>
$

2010-01-18: Hudsonで発生した問題

OSXでジョブを実行すると、"java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=262144, offset=262145"というエラーが発生。
HudsonのBTS"Hudson JIRA"によれば、起動オプションに"-Dhudson.util.ProcessTreeKiller.disable=true"を追加すると回避できるようです。


もうひとつ、これはOSXに関係なく、CVS関連で。cvs2clなどのCVS履歴を参照する処理をジョブに組み込んでいる場合、エラーとなってしまいます。
これは、下記のバグが原因だったようです。ちょうどこの記事を書いた頃にバージョン1.341がリリースされ、修正されたようです。

おわりに

今回の記事は、めずらしく連載のようにしてみました。それぞれの情報は山のようにありますが、実際の作業ログという点で利用価値があるのではないかと期待しています。
参考になれば幸いです。